STM32标准库使用CMSIS-DSP库

引言

因为我在做项目的时候,需要使用算法,自己写的话麻烦,并且无法保证空间的利用以及运算速度会 更快,所以这里我引用CMSIS-DSP库,使用里面的函数来实现,但是我搜索发现有使用说明的都是用的STM32Cube生成使用的,而我用的是标准库,所以特此写下本篇文章。

一、什么是CMSIS-DSP库?

CMSIS DSP 软件库(CMSIS-DSP库官网链接),这是一套用于基于 Cortex-M 和 Cortex-A 处理器的设备的常见信号处理函数。

该库分为多个函数,每个函数涵盖一个特定类别:

该库通常具有用于操作 8 位整数、16 位整数、32 位整数和 32 位浮点值的单独函数。

二、引入CMSIS-DSP库过程 1、创建STM32基础工程

这里我使用的是野火的串口1通信基础例程。链接: 野火的串口1通信基础例程

2、获取CMSIS-DSP库

方法1:我把DSP库的文件链接放在旁边。链接: CMSIS-DSP库

方法2:我们可以直接访问DSP库的Github地址,然后通过git或者直接Download下载。

链接:DSP库Github链接

方法3:我们可以去链接: STM32CubeF1下载,只不过STM32官网下载文件,需要登录,略微麻烦,推荐方法1。

下载后可以通过根据下图找到DSP库的位置

三、STM32标准库添加DSP库 首先解压并打开CMSIS-DSP的压缩包,我们所需要的内容主要有三个文件夹

同时由于CMSIS-DSP库是由ARM公司提供的一个信号处理算法库,所以也需要CMSIS的内核文件以及一个lib库文件,我们可以进入STM32CubeMax去下载最新的封装库,其中lib库文件的命名以内核名称开始,后面的或b代表小端格式或大端格式,因为我所使用的单片机是STM32F103ZET6型号,是M3内核,小端格式,支持单精度浮点运算单元,所以我们选择arm_cortexM3l_math.lib,解压打开文件后按照图片所示路径找到框出的文件夹以及文件,如果觉得麻烦我也放了封装库的源文件链接:STM32CubeMax封装库

如果与我所使用的板子不同,可以根据自己型号做出选择

当我们找到所有文件以后,把这四个文件夹添加到我们的工程目录下,这里我把从软件包里找到的三个文件创了个DSP的文件夹,集中放在里面。

然后我们用Keil打开工程项目,添加DSP具体文件(这里添加的具体文件我们可以根据需求来添加,也可以全部添加)和头文件路径

添加完文件后,我们在箭头所指的地方添加宏定义

,ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,

至于为什么添加这几个宏定义,在arm_math.h文件里有写为全英文,这里我把他中文注释放在这里

ARM_MATH_BIG_ENDIAN:
定义宏ARM_MATH_BIG_ENDIAN,为大端目标构建库。默认情况下,库会为小端目标构建。
ARM_MATH_MATRIX_CHECK:
定义用于检查矩阵的输入和输出大小的宏ARM_MATH_MATRIX_CHECK
ARM_MATH_ROUNDING:
定义用于舍入支持函数的宏ARM_MATH_ROUNDING
ARM_MATH_LOOPUNROLL:
定义宏ARM_MATH_LOOPUNROLL,以便在 DSP 函数中启用手动循环展开
ARM_MATH_NEON:
定义宏ARM_MATH_NEON以启用 DSP 功能的 Neon 版本。默认情况下,当 Neon 可用时,它不会启用,因为性能取决于编译器和目标体系结构。
ARM_MATH_NEON_EXPERIMENTAL:
定义宏ARM_MATH_NEON_EXPERIMENTAL以启用某些 DSP 函数的实验性 Neon 版本。实验性 Neon 版本目前没有比标量版本更好的性能。
ARM_MATH_HELIUM:
它意味着标志 ARM_MATH_MVEF 和 ARM_MATH_MVEI 和 ARM_MATH_MVE_FLOAT16。
ARM_MATH_HELIUM_EXPERIMENTAL:
仅在定义ARM_MATH_MVEF、ARM_MATH_MVEI或ARM_MATH_MVE_FLOAT16时才考虑在内。启用一些矢量版本,这些版本的性能可能比标量差,具体取决于内核/编译器配置。
ARM_MATH_MVEF:
选择 f32 算法的 Helium 版本。它意味着ARM_MATH_FLOAT16和ARM_MATH_MVEI。
ARM_MATH_MVEI:
选择 int 和 fixed point 算法的 Helium 版本。
ARM_MATH_MVE_FLOAT16:
某些算法的 MVE Float16 实现(需要 MVE 扩展)。
DISABLEFLOAT16:
当特定编译器/内核配置不支持 __fp16 时禁用 float16 算法。这仅对标量有效。当矢量体系结构支持 f16 时,无法禁用它。
ARM_MATH_AUTOVECTORIZE:
使用 Helium 或 Neon,禁用带有 C 内部函数的矢量化代码,改用纯 C。然后由编译器完成矢量化。

最后,我们在arm_math.h 文件里添加上#include “stm32f10x.h” 然后就可以使用了

感谢各位的观看,如有错误,还请指正。

HTML 在网页中链接到一个区域

锚点和ID属性

在HTML中,我们可以使用锚点(anchor)和id属性来创建链接到特定区域的功能。锚点用于创建链接,而id属性用于标识需要链接到的具体区域。

要创建一个锚点,我们可以使用标签,并将其href属性设置为包含id值的链接。例如,要创建一个链接,将用户带到网页顶部的一个区域,我们可以使用以下代码:

返回顶部

在此示例中,我们将锚点的href属性设置为”#top”,其中”top”是我们给要链接的区域分配的ID值。当用户点击该链接时,页面将自动滚动到具有该ID的元素位置。

为了使链接目标区域具有相应的ID,我们可以在目标元素上使用id属性。例如,要将页面顶部的一个区域分配ID值为”top”,我们可以使用以下代码:

通过将id值设置为”top”,我们在锚点中引用了该值,以便在链接被点击时将用户带到该区域。

创建内部链接

除了将用户链接到其他网页,我们还可以在同一页面中创建从一个区域到另一个区域的链接。这可以通过使用相同的锚点和ID属性来实现。

例如,假设我们在同一页面中有一个导航菜单和一些内容区域。我们可以在导航菜单中创建链接,以便在点击时将用户带到相应的内容区域。

跳转到第一部分
跳转到第二部分
...

在这个例子中,我们通过为导航菜单中的链接设置相应的锚点和ID,创建了与相应内容区域之间的链接关系。当用户点击导航菜单中的链接时,页面会自动滚动到相应的内容区域。

我们还可以在页面的不同部分之间创建链接,以便用户方便地浏览内容。

高级链接技巧

除了基本的链接功能,HTML还提供了一些高级链接技巧,用于增强用户体验。

无障碍链接

在创建链接时,我们应该注意到无障碍性的重要性。可以通过添加title属性来提供描述性文本,以帮助无障碍用户了解链接的目的。例如:

联系我们

打开链接在新标签中

默认情况下,HTML链接会在同一标签页中打开链接的目标页面。但有时我们希望链接在新标签或新窗口中打开,以便用户保持原来的页面状态。可以通过添加target属性来实现这一点。例如:

在新标签页中打开

相对路径链接

当我们在创建链接时,可以使用相对路径来指向同一网站上的其他页面或文件。相对路径使用当前页面的URL作为基础,并根据需要添加其他路径信息。

例如,假设我们的网页位于,我们希望链接到同一网站上的”about.html”页面。我们可以使用以下代码:

html">关于我们

锚点动画效果

除了定位到特定的区域,我们还可以通过使用JavaScript和CSS来实现平滑滚动效果和其他动画效果。这可以通过添加事件监听器和样式的方式来实现。

例如,在点击链接时实现平滑滚动效果,可以使用以下JavaScript代码:

document.querySelector('a[href^="#"]').addEventListener('click', function(e) {
  e.preventDefault();
  document.querySelector(this.getAttribute('href')).scrollIntoView({
    behavior: 'smooth'
  });
});

通过结合CSS和,可以创建各种令人惊叹的链接效果和交互体验。

总结

在本文中,我们了解了如何在HTML中创建链接,以便将用户带到网页中的特定区域。通过使用锚点和ID属性,我们可以轻松地实现这一功能。我们还研究了一些高级链接技巧,如无障碍链接、在新标签中打开链接、使用相对路径和添加动画效果。这些技巧可以帮助我们提供更好的用户体验,并增强网页的功能。让我们利用这些技术来创建令人印象深刻的链接,使用户能够更方便地浏览和导航网页。

本站内容来自用户投稿,如果侵犯了您的权利,请与我们联系删除。联系邮箱:835971066@qq.com

本文链接:http://news.xiuzhanwang.com/post/2139.html

友情链接: