如何使用硬件浮点单元以及相关数学运算
0 2023-01-30

一. 前言

有工程师反应说Keil 下无法使用STM32F4xx 硬件浮点单元, 导致当运算浮点时运算时间过长,还有一些人反应不知如何使用芯片芯片内部的复杂数学运算,比如三角函数运算。针对这个部分本文将详细介绍如何使用硬件浮点单元以及相关数学运算。

二.问题产生原因

1. ------对于Keil MDK Version 5 版本, 编译器已经完全支持STM32F4xx 的FPU(浮点运算单元),可以直接使用芯片内部的浮点运算单元。

2. ------对于Keil MDK Version 4 版本, 高版本v4,比如当前keil 官网可下载的v4.74.0.0 版本也已经支持
FPU,可以直接使用芯片内部浮点运算。但如果使用低版本v4,如v4.23.0.0 版本, 则需要对软件进行相应设置。

三. 如何解决问题

1. 查看手头Keil 版本是否支持FPU,最简单办法是进入Keil 调试界面直接查看0xE000ED88 地址单元数据,如果为0x00F00000, 则说明已经支持FPU,如下图所示:

关于在ARM MDK 中使用STM32F4xx 硬件浮点单元的话题

2. 如果0xE000ED88地址数据为0x00000000,则需要做如下操作:

a. 在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

b. 在工程选项(Project->Optionsfor target "XXXX")中的C/C 选项卡的Define 中加入如下的语句,见下图所示:
__FPU_PRESENT=1,__FPU_USED =1。

关于在ARM MDK 中使用STM32F4xx 硬件浮点单元的话题

c. 这样编译时就加入了启动FPU 的代码,CPU 也就能正确高效的使用FPU 进行简单的加减乘除了。

3. 进一步说明使用芯片复杂数学运算使用

对于复杂运算,比如三角函数,开方等运算,需要如下设置:

a. 包含arm_math.h头文件。
b. 在工程选项的C/C 选项卡的define 中继续加入语句ARM_MATH_CM4。
c. 在工程选项的C/C 选项卡的define 中继续加入语句__CC_ARM。

以使用sin,cos 运算举例,需要调用arm_sin_f32()以及arm_cos_f32(),这两个函数定义在
arm_sin_f32.c 和arm_cos_f32.c中,需要在工程中加入这两个c 文件。

* 在 ST 库文件包中的文件目录如下:
\stm32f4_dsp_stdperiph_lib\STM32F4xx_DSP_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\DSP_Lib\Sou
rce\FastMathFunctions

* 在keil 安装目录下的文件目录如下:
\Keil\ARM\CMSIS\DSP_Lib\Source\FastMathFunctions
当用到更多数学运算, 如开根号,三角运算,求绝对值等等,客户也可以直接在工程中加入ARM 中的数学运算库arm_cortexM4lf_math.lib,而不需要一个个文件的添加,

* 在 ST 库文件包中的目录如下:
\STM32F4xx_DSP_StdPeriph_Lib_V1.6.0\STM32F4xx_DSP_StdPeriph_Lib_V1.6.0\Libraries\CMSIS\Lib\ARM

* 在keil 安装目录下的文件目录如下:
\Keil\ARM\CMSIS\Lib\ARM

关于在ARM MDK 中使用STM32F4xx 硬件浮点单元的话题

四. 结语

从测试效果看当使用了硬件浮点运算单元,数学计算变得简单高效,可以留给系统更多时间处理其他控制程序,有效提升系统效率,节省时间。 

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • STM32的GPIO工作方式

    STM32F1xx官方资料:《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO)芯片数据手册(datasheet)STM32的GPI

    2小时前
  • 蜂鸣器发声驱动实现和代码

    蜂鸣器是很常见的设备,分为无源和有源两种。根据项目需求选择不同类型的蜂鸣器。最近的项目里有用到有源蜂鸣器对有源蜂鸣器。还是老一套,把电路板画完,接着编程。在项目

    2小时前
  • STM32芯片异常复位的解决

    问题描述某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。复位后程序继续运行,但是还会继续复位,原因不详。问题解析01:初步

    2小时前
  • 51单片机汇编指令集

    (1)数据传送类指令(7种助记符)MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送;MOVC(MoveCode)读取程序存储

    2小时前
  • STM32 学习笔记40条

    1、SYSCLK时钟源有三个来源:HSIRC、HSEOSC、PLL2、MCO[2:0]可以提供4源不同的时钟同步信号,PA83、GPIO口有两个反向串联的二极管

    昨天
  • 基于MM32W系列开发的数据透传应用

    在前面一个章节中我们详细介绍到了基于MM32W系列芯片开发的使用场景非常丰富的简易蓝牙智能锁方案,在本章节我们将继续给大家介绍一个蓝牙案例——基于MM32W系列

    昨天
  • MM32W无线MCU 自定义AT指令

    MM32W0/3提供模组和开发板方式供客户使用,支持UART\SPI\IIC接口的AT指令,用户通过发送相关固定格式的指令方式可以实现对应功能。开发板上电后,模

    昨天
  • MM32W无线MCU 自定义服务和特征值

    MM32W0x2xxB蓝牙功能协议栈目前以Lib形式提供,用户通过调用相关接口的方式实现对应功能。例程中,用户如需调整BLE数据交互的特征值、服务及数据的收发,

    昨天
  • MM32W无线MCU接口函数调用

    MM32W0x2xxB的蓝牙协议栈目前以lib形式提供用户使用,用户无需了解蓝牙底层协议,通过调用相关接口的方式即可实现蓝牙无线传输,其中BLE协议栈lib放置

    昨天
  • MM32W 低功耗模式的休眠和时钟配置函数

    本章我们来看一下低功耗模式下用到的休眠和时钟配置函数。目前MM32W0系列有n4和q1两个版本,n4主要针对需要大容量的应用方案,q1针对超低功耗精简型的应用方

    昨天
  • MM32W应用笔记,阻塞式例程

    本章我们将对软件架构进行简单的讲解。阻塞式例程介绍对于大部分的低功耗设备来说,CPU都是处在休眠模式中,只在接收到特定数据的时候被唤醒处理少量数据,这种应用场景

    昨天
  • 不同类型单片机之间的通信方式

    几种常用单片机之间的通信方式①采用硬件UART进行异步串行通信。这是一种占用口线少,有效、可靠的通信方式;但遗憾的是许多小型单片机没有硬件UART,有些也只有1

    前天
下载排行榜
更多
广告