STM32F4xx FPU的设置

发布者:快乐的天使最新更新时间:2015-09-09 来源: eefocus关键字:STM32F4xx  FPU  设置 手机看文章 扫描二维码
随时随地手机看文章
浮点运算一直是定点CPU的难题,比如一个简单的1.1+1.1,定点CPU必须要按照IEEE-754标准的算法来完成运算,对于8位单片机来说已经完 全是噩梦,对32为单片机来说也不会有多大改善。虽然将浮点数进行Q化处理能充分发挥32位单片机的运算性能,但是精度受到限制而不会太高。对于有 FPU(浮点运算单元)的单片机或者CPU来说,浮点加法只是几条指令的事情。

        现在又FPU或者硬件浮点运算能力的主要有高端DSP(比如TI F28335/C6000/DM6XX/OMAP等),通用CPU(X87数学协处理器)和高级的ARM+DSP处理器等。

        STM32-F4属于Cortex-M4F构架,这和M0、M3的最大不同就是多了一个F-float,即支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,还需要一些小小的设置:

        1.编译控制选项:虽然STM32F4XX固件库的例程之system_stm32f4XXX.c文件中添加了对应的代码,但给用户评估使用的 STM32F4-Discovery例程中却没有,因此MDK4.23编写浮点运算程序时,虽然编译器正确产生了V指令来进行浮点运算,但是因为 system_stm32f4XXX.c文件没有启用FPU,因此CPU执行时只认为是遇到非法指令而跳转到HardFault_Handler()中断 中原地踏步。因此要保证这个错误不发生,必须要在system_init()函数里面添加如下代码:

 
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) 
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));   
  #endif

          因为这个选项是有条件编译控制的,因此需要在工程选项(Project->Options for target "XXXX")中的C/C++选项卡的Define中加入如下的语句:__FPU_PRESENT=1,__FPU_USED =1。这样编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除了。

        但这还远远不够。对于复杂运算,比如三角函数,开方等运算,如果编程时还是使用math.h头文件,那是没法提升效率的:因为math.h头文件是针对所 有ARM处理器的,其运算函数都是基于定点CPU和标准算法(IEEE-754),并没有预见使用FPU的情况,需要很多指令和复杂的过程才能完成运算, 也就增加了运算时间。因此要充分发挥M4F的浮点功能,就需要使用固件库自带的arm_math.h,这个文件根据编译控制项(__FPU_USED == 1)来决定是使用那一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的 优化函数来解决问题。

        在arm_math的开头部分是有这些编译控制信息:

         #ifndef _ARM_MATH_H
         #define _ARM_MATH_H

         #define __CMSIS_GENERIC             

         #if defined (ARM_MATH_CM4)
                    #include "core_cm4.h"
         #elif defined (ARM_MATH_CM3)
                     #include "core_cm3.h"
         #elif defined (ARM_MATH_CM0)
                     #include "core_cm0.h"
         #else
                   #include "ARMCM4.h"
                   #warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
         #endif

         #undef  __CMSIS_GENERIC             
               #include "string.h"
                #include "math.h"

        就是说如果不使用CMSIS的,就会调用keil自带的标准库函数。否则就用CMSIS的定义。这里因为是用的STM32F4,所以应该要 ARM_MATH_CM4控制,即加入core_cm4.h,否则就用使用ARMCM4.h——但在编译时keil会提示找不到这文件。因此需要在工程选 项之C/C++选项卡的define中继续加入语句ARM_MATH_CM4。

        加入上述编译控制项之后,高级数学函数的使用基本没问题了,比如正余弦三角函数的计算。但需要注意,如果你直接使用sin()、cos()、sqrt() 这样的函数,那结果还算调用keil的math.h,你可以在debug时看对应的代码,其汇编指令为BL.W __hardfp_xxx。因此这时要完成三角函数的计算就要使用arm_sin_f32()或者arm_cos_f32(),用法不变,这两个函数的原 型分别在arm_sin_f32.c和arm_cos_f32.c中。通过对256点三角函数表的查询和插值算法得到任意角度的精确函数值,这就比“原 装”的sin()、cos()快多了。

        当然有些例外的是开发函数sqrt(),在arm_math.h中是这么定义的:

             static __INLINE arm_status  arm_sqrt_f32(float32_t in, float32_t *pOut) 
                     { 
                        if(in > 0) 
                             { 
                                     //    #if __FPU_USED 
                                    #if (__FPU_USED == 1) && defined ( __CC_ARM   ) 
                                              *pOut = __sqrtf(in); 
                                   #else       
                                              *pOut = sqrtf(in); 
                                   #endif 
                                 return (ARM_MATH_SUCCESS); 
                            } 
                        else 
                           { 
                               *pOut = 0.0f; 
                                return (ARM_MATH_ARGUMENT_ERROR); 
                          } 
               }   

        即开方用的函数是arm_sqrt_f32(),其中首先判断被开发的书是否大于0,只有大于0的才能进行运算,否则输出结果为0并返回“错误”标志。如 果大于0,并且实用了FPU和__CC_ARM控制项,那调用__sqrtf()来完成编译,否则调用sqrtf()——这个sqrtf()是能在 keil的math.h中找到的,即调用子函数来完成运算,而__sqrtf()呢?新出现的,相信大家都能猜到是什么玩意儿:对,就是VSQRT指令! 因此要把这点性能也要发挥出来,就需要工程选项之C/C++选项卡的define中继续加入语句__CC_ARM才行。大家可以比较一下是否加入 __CC_ARM编译后会汇编代码的差别巨大差别。

       当然,对于arm_sqrt_f32()函数还是有些麻烦,如果你确认被开方的书是大于等于0的,那就直接使用__sqrtf()函数完成运算,即一条简单的VSQRT指令。

       STM32F4固件库还提供了其他很有用的数学函数,都位于DSP_Lib文件夹,请大家慢慢探索,Discovery!

关键字:STM32F4xx  FPU  设置 引用地址:STM32F4xx FPU的设置

上一篇:stm32_ps2键盘显示测试程序
下一篇:STM32 FSMC总线深入研究

推荐阅读最新更新时间:2024-03-16 14:31

s3c2440如何设置fclk
  1设置LockTIme变频锁定时间   2设置FCLK与晶振输入频率(Fin)的倍数   3设置FCLK,HCLK,PCLK三者之间的比例   LockTIme 变频锁定时间由LOCKTIME寄存器(见下表)来设置,由于变频后开发板所有依赖时钟工作的硬件都需要一小段调整时间,该时间计数通过设置 LOCKTIME寄存器[31:16]来设置UPLL(USB时钟锁相环)调整时间,通过设置LOCKTIME寄存器 [15:0]设置MPLL调整时间,这两个调整时间数值一般用其默认值即可。   表2-8变频锁定时间寄存器(LOCKTIME)      FCLK与Fin的倍数通过MPLLCON寄存器设置,三者之前有以下关系:   M
[单片机]
s3c2440如何<font color='red'>设置</font>fclk
示波器测量是否精准,探头的选择与设置至关
探头的作用至关重要,为实现测量的最优结果,必须进行折衷,特别是在进行高精度测量时。有时示波器标配的无源探头并不是实现最佳精度的解决方案。 1、选择适当衰减比的探头。最大限度地降低衰减,使信噪比达到最优。在精确测量中,非常重要的一点是使信号幅度达到最大,同时使外部噪声达到最小。探头选择是关键的第一步。 电压探头与示波器的输入阻抗构成电压分路器(如1X、10X、100X),会衰减输入信号。1X探头不会降低或衰减信号,10X探头则会把输入信号降低到原始信号幅度的1/10。示波器通过放大信号来补偿这种衰减,遗憾的是,示波器也会放大探头引入的任何噪声。从信噪比角度来看,最优探头应该没有衰减或衰减很低的。 图9. TPP0502高阻抗无
[测试测量]
示波器测量是否精准,探头的选择与<font color='red'>设置</font>至关
VW机器人关于RIP的程序设置方法
RIP 范围:K1 - A/E513——520 A513 开水阀 A514 先导阀 A515 水阀关 A518 切丝阀动作 A520 清洗喷嘴 K2 - A/E521——528 K3 - A/E529——536 变量:F819:用来控制发出A25 机器人水流量正常 IF NOT MIT_VW_WASS AND ($FLAG OR OHNE_VW_WAS) AND NOT $FLAG THEN 不带水,有F820 或者 OHNE_VW_WAS ,没有F819 水阀启动 IF NOT $IN OR
[机器人]
要怎么设置
弧焊焊接参数包括哪些?要怎么设置?弧焊机器人的参数设置包括焊接电流、焊接电压、焊接速度、焊接角度等等。以下是工业机器人集成商无锡金红鹰对这些参数的详细介绍: 1. 焊接电流 焊接是弧焊过程中最重要的参数之一。它决定了弧焊机器人焊接时熔池的大小和形状。较高的电流可以更深地穿透工件,但也会增加热变形的风险。而较低的电流可能导致焊缝太窄,不够强度。 2. 焊接电压 焊接电压是电弧接触工件时所产生的电压。与焊接电流一样,弧焊机器人焊接电压的设置也影响焊缝的尺寸和形状。较高的电压会产生更大的电弧,因此可以更深地穿透工件。但太高的电压也可能导致焊缝变形或产生孔洞。 无锡金红鹰氩弧
[机器人]
AT89C52单片机定时器如何设置工作方式
  AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。   AT89C52单片机硬件结构   如图3-1所示,为AT89C52的硬件结构图。AT89C52单片机的内部结构与MCS-51系列单片机的构成基本相同。CPU是由运算器和控制器所构成的。运算器主要用来对操作数进行算术、逻辑运算和位操作的。控制器是单片机的指挥控制部件,主要任务的识
[单片机]
AT89C52单片机定时器如何<font color='red'>设置</font>工作方式
电动机保护器参数设置方法和接线方法
  电动机保护器的作用是给电机全面的保护控制,在电机出现过流、欠流、断相、堵转、短路、过压、欠压、漏电、三相不平衡、过热、接地、轴承磨损、定转子偏心时、绕组老化予以报警或保护控制。   电机保护器的参数设置对于电气系统的正常运行和电机的保护至关重要。以下是一些常用的电机保护器参数及其设置方法:   1. 过流保护电流设置:过流保护通常设置为电机额定电流的1.5~2倍,以确保在短时间内不会断开电路。但是在选择过流保护对应的额定电流时需要结合电路环境和负载特性综合考虑。   2. 过载电流设置:电机的过载保护可以设定一个低于过流保护的额定电流值(通常为电机额定电流的1.1~1.3倍),以避免电机因短时间内的过载而停止工作。  
[嵌入式]
【实操视频】一分钟学会信号发生器双通道波形同相位设置
Rigol DG系列任意波形发生器都具有相对相位功能,这允许您对齐输出的相位,然后调整其中一个通道相对于另一个的相位。
[测试测量]
行业人士详解如何设置安全的锂电池保护电路
据统计, 锂离子电池 的全球需求已达13亿只,并随着应用领域的不断扩展,这一数据在逐年递增。正因如此,随着锂离子电池在各个行业用量的迅速激增,电池的安全性能也日益突出,不仅要求锂离子电池具有优异的充、放电性能,还要求具有更高的安全性能。那锂电池到底为什么发生起火甚至爆炸呢,有什么措施可以避免和杜绝吗? 笔记本电池爆炸,不仅同其中所用的锂电池电芯的生产工艺有关,也同电池内封装的电池保护板、笔记本电脑的充放电管理电路以及笔记本的散热设计有关。笔记本电脑不合理的散热设计和充放电管理,将使电池电芯过热,从而大大增加了电芯的活性,同时增加了爆炸、燃烧的几率。 锂电池材料构成及性能探析 首先我们来了解一下锂电池的材料构成,锂离子电池的性能
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved