STM32F4 FPU浮点运算单元
FPU 即浮點運算單元(Float Point Unit)。浮點運算,對于定點 CPU(沒有 FPU 的 CPU)
來說必須要按照 IEEE-754 標準的算法來完成運算,是相當耗費時間的。而對于有 FPU 的 CPU
來說,浮點運算則只是幾條指令的事情,速度相當快。
STM32F4 屬于 Cortex M4F 架構,帶有 32 位單精度硬件 FPU,支持浮點指令集,相對于
Cortex M0 和 Cortex M3 等,高出數十倍甚至上百倍的運算性能。
STM32F4 硬件上要開啟 FPU 是很簡單的,通過一個叫:協處理器控制寄存器(CPACR)
的寄存器設置即可開啟 STM32F4 的硬件 FPU,該寄存器各位描述如圖 51.1.1.1 所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ?圖 51.1.1.1 協處理器控制寄存器(CPACR)各位描述
這里我們就是要設置 CP11 和 CP10 這 4 個位,復位后,這 4 個位的值都為 0,此時禁止訪
問協處理器(禁止了硬件 FPU),我們將這 4 個位都設置為 1,即可完全訪問協處理器(開啟
硬件 FPU),此時便可以使用 STM32F4 內置的硬件 FPU 了。CPACR 寄存器這 4 個位的設置,
我們在 system_stm32f4xx_c 文件里面開啟,代碼如下:
void SystemInit(void){/* FPU settings ------------------------------------------------------------*/#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */#endif……//省略部分代碼}此部分代碼是系統初始化函數的部分內容,功能就是設置 CPACR 寄存器的 20~23 位為 1,
以開啟 STM32F4 的硬件 FPU 功能。從程序可以看出,只要我們定義了全局宏定義標識符
__FPU_PRESENT 以及__FPU_USED 為 1,那么就可以開啟硬件 FPU。其中宏定義標識符
__FPU_PRESENT 用來確定處理器是否帶 FPU 功能,標識符__FPU_USED 用來確定是否開啟FPU 功能。
實際上,因為 F4 是帶 FPU 功能的,所以在我們的 stm32f4xx.h 頭文件里面,我們默認是定
義了__FPU_PRESENT 為 1。大家可以打開文件搜索即可找到下面一行代碼:
#define __FPU_PRESENT 1
但是,僅僅只是說明處理器有 FPU 是不夠的,我們還需要開啟 FPU 功能。開啟 FPU 有兩
種方法,第一種是直接在頭文件 STM32f4xx.h 中定義宏定義標識符__FPU_USED 的值為 1。也
可以直接在 MDK 編譯器上面設置,我們在 MDK5 編譯器里面,點擊
按鈕,然后在 Target
選項卡里面,設置 Floating Point Hardware 為 Use Single Precision,如圖 51.1.1.2 所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 51.1.1.2 編譯器開啟硬件 FPU 選型
經過這個設置,編譯器會自動加入標識符__FPU_USED 為 1。這樣遇到浮點運算就會使用
硬件 FPU 相關指令,執行浮點運算,從而大大減少計算時間。
最后,總結下 STM32F4 硬件 FPU 使用的要點:
1, 設置 CPACR 寄存器 bit20~23 為 1,使能硬件 FPU。
2, MDK 編譯器 Code Generation 里面設置:Use FPU。
經過這兩步設置,我們的編寫的浮點運算代碼,即可使用 STM32F4 的硬件 FPU 了,可以
大大加快浮點運算速度。
轉了等于我會了~真是個小機靈鬼呢~
附:UCOSIII移植過程中,似乎是低版本的不支持FPU,在移植到STM32F4系列時,有浮點計算時任務不執行,在PendSv_Handle中,并未對浮點處理寄存器做進出棧的操作。最新的ucosIII好似更新到了V3.09版本呢,官網的Release文檔也有相關FPU的更新說明,但是我依然選擇在UCOSIIIde V3.0.4版本上更新,借助網絡上前輩的蔭,成功解鎖了UCOSIII移植到STM32F4系列的FPU使用
總結
以上是生活随笔為你收集整理的STM32F4 FPU浮点运算单元的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交易系统解析(六)前台报盘应用设计要点
- 下一篇: Redis——模拟手机验证码发送