dsp寄存器 *** 作gpio怎么封装函数

dsp寄存器 *** 作gpio怎么封装函数,第1张

寄存器

首先要根据要开发的功能,查阅外设的数据手册,找到相应的寄存器

根据寄存器的说明。逐位进行寄存器的读写配置

后期维护或者调试,也需要根据外设的数据手册,进行纠错

寄存器开发的优缺点

优点:

程序运行效率高,需要那个寄存器就配置那个寄存器,冗余代码量少

缺点:

如果遇到下列情况,使用寄存器开发的难度会大大提高

遇到大型项目或者需配置寄存器数量较多时,需要频繁翻阅数据手册,影响开发效率。过于依赖数据手册

程序如果需要移植,那么底层很多的寄存器 *** 作需要重写。程序可移植性差

后期维护后者调试的时候,如果没有数据手册,很多寄存器的读写很不好理解。程序可读性差

库开发的基本流程

根据要开发的功能,查看库接口文档,找到所需的函数,结构体或者宏定义

调用相应的函数接口,声明结构体或者使用宏定义的方式去实现功能

后期维护和调试,由于重新封装了直观的函数,结构体和宏定义名称,可以不用过多参考库接口文档

库开发的优缺点

优点:

相对于寄存器开发,在遇到如上相似的情况时,库开发洞逗就更具优势

遇到大型项目或者需配置寄存器数量较多时,可以直观的 *** 作想要的寄存器。开发效率较高

程序如果需要移植,底层只需要进纳核卖行小的改动即可在新平台上使用。程序的可移植性较高

后期维护或者调试,不过于依赖技术手册。程序可读性高

缺点:

由于库对底层的寄存器,某些结构体等重新进行了宏定义的类型定义,所以抽象结构上多了一层库函数层,实际程序运行时也需要处理更多的代码

结论

随着技术的进步和社会氏纯需求的提高,STM32的需要调用的外设资源会越来越多,且要处理的项目也会趋于大型化和复杂化,这给项目的前期搭建和后期维护带来很大的挑战——如何高效的调用资源实现需求,如何高效的修改程序Debug

库开发使用了封装的概念很好的解决了这些问题。封装就是把一个抽象的事物的属性及属性相关的 *** 作函数打包在一起,外界的模块只能通过这个抽象事物对外提供的函数接口,对事物的属性进行访问。封装使得上层使用者只需要调用接口,无需过于关心寄存器 *** 作是怎么实现的,从而更高效的解决需求

这几句是将FLASH中的程序COPY到RAM中运行,通常的目的是加快程序的运行速度,通常有两种情况需要这样去 *** 作:

1、程序中对基要求比较高的函数,如中断;

2、程序需要对FLASH进行 *** 作,这时就要把程序先复制到RAM中运行然后才能对FLASH *** 作。

RamfuncsLoadStart、RamfuncsLoadEnd、RamfuncsRunStart这三个变量是在CMD文件中创建的,创建方式如下:

LOAD_START(RamfuncsLoadStart),

LOAD_END(RamfuncsLoadEnd),

RUN_START(RamfuncsRunStart),

分别表示了装载函数的首地址,装载函数的结束地址和装载函数的运行地址;

执行完MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart)后,便将FLASH中相关的程序者猛槐COPY到了RAM中,之后的程序运行时,只要调用FLASH中RamfuncsLoadStart地址开始的相关函数,系统都会自动地指向RAM中相应的函数入口地址运行首友。知卜

求采纳为满意回答。

如何使用STM32F4的DSP库

我们平常所使用的CPU为定点CPU,意思是进行整点数值运算的CPU。当遇到形如1.1+1.1的浮点数运算时,定点CPU就遇到大难题了。对于32位单片机,利用Q化处理能发挥他本身的性能,但是精度和速度仍然不会提高很多。

现在设计出了一个新的CPU,叫做FPU,这个芯片专门处理浮点数的运算,这样处理器就将整点数和浮点数分开来处理,整点数交由定点CPU处理而浮点数交由FPU处理。我们见到过TI的DSP,还有STM32F4系列的带有DSP功能的微控制器。前者笔者没有用过,不作评论,而后者如果需要用到FPU的浮点运算功能,必须要进行一些必要的设置。

首先,由于浮点运算在FPU中进行,所以首先应该使能FPU运行。在system_init()中,定义__FPU_PRESENT和__FPU_USED

/* FPU settings------------------------------------------------------------*/

#if (__FPU_PRESENT == 1)&&(__FPU_USED == 1)

SCB->CPACR |= ((3UL<<10*2)|(3UL <<11*2)) /*set CP10 and CP11 Full Access */

#endif

这样就使能了FPU。

对于上述改变,当程序中出现这种简单的加减乘除运算FPU就起作用了。但是对于复杂的如三角运算、开方运算等,我们就需要加入math.h头文件。但是如果单纯的加入他,那么Keil会自动调用内部的math.h,该头文件是针对ARM处理器的,专门用于定点CPU和标准算法(IEEE-754)。对于使用了FPU的STM32F4是没有任何作用的。所以,需要将悔仿型math.h换成ST的库,即arm_math.h。在该头文件中,涉及到另一个文件core_cmx.h(x=0、3、4),当然了,如同STM32F1系列一样,在工程中加入core_cm4.h即可。

到这里,算是全部设置完毕,之差最后一步,调用!但是别小看了这一步,因为如果调用的不正确,全面的设置就白费了。在使用三角函数如sin()、碧猜cos()时不要直接写如上形式,因为他们函数的名字来自于math.h,所以你调用的仍旧是Keil库中的标准math.h。要使用arm_math.h中的arm_sin_f32()函数(见Line.5780,原函数见DSP_Lib\Source\FastMathFunctions),可以看到他利用的是三次样条插值法快速求值(见Line.263 /* Cubic interpolation process */)。

注意一下大仿例外函数,sqrt(),在arm_math.h中为arm_sqrt_f32()。使用他的时候需要同时开启#if(__FPU_USED == 1) &&defined ( __CC_ARM )才行,切记!还可以发现开方函数还有q15和q31之分,我想他们的区别就是精度的问题,但是他们没有应用FPU来计算,说白了就是利用0x5f3759df这个数进行快速开方


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8260525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存