标题:
使用STM32F4XX自带数学库"arm_math.h"
[打印本页]
作者:
yuyang911220
时间:
2014-9-27 15:35
标题:
使用STM32F4XX自带数学库"arm_math.h"
STM32-F4属于Cortex-M4F构架,这与M0、M3的最大不同就是具有FPU(浮点运算单元),支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,除了#include “
arm_math.h
”(而非用编译器自带的
math.h
)以外,(
arm_math.h
位于
\Libraries\CMSIS\Include
文件夹)还需要进行设置。
1、代码设置
如果没有启动FPU而使用数学函数运算时,CPU执行时认为遇到非法指令而跳转到HardFault_Handler()中断函数中死循环。因此,需要在系统初始化时开启FPU。在
system_stm32f4xx.c
中的
SystemInit()
函数中添加如下代码:
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
2、编译控制
从上面的代码可以看出,当
__FPU_PRESENT=1
且
__FPU_USED=1
时,编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除了。但是对于复杂运算要充分发挥M4F的浮点功能,就需要使用固件库自带的arm_math.h而非编译器自带的math.h,这个文件根据编译控制项(__FPU_USED ==1)来决定是使用哪一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。
在arm_math.h开头部分有一些编译控制信息:
#ifndef _ARM_MATH_H
#define _ARM_MATH_H
#define __CMSIS_GENERIC /* disable NVIC and Systick functions */
#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 /* enable NVIC and Systick functions */
#include "string.h"
#include "math.h"
从中可以看出,为了使用STM32F4的arm_math.h,我们需要定义
ARM_MATH_CM4
;否则如果不使用CMSIS的库,就会调用Keil自带的math.h。
另外,定义控制项
__CC_ARM
在某些数学函数中会使用VSQRT指令(浮点运算指令),运算速度比Q指令要快很多。
总结一下,需要在
Project->Options for target"XXXX")
中的
C/C++
选项卡的
Preprocessor Symbols
栏的
Define
中加入如下的语句:
ARM_MATH_CM4, __FPU_PRESENT=1, __FPU_USED =1, __CC_ARM
。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0