關於ARM MDK使用STM32F4xx 硬體浮點單元的話題

2021-01-13 電子產品世界

一. 前言

有工程師反應說Keil 下無法使用STM32F4">STM32F4xx 硬體浮點單元, 導致當運算浮點時運算時間過長,還有一些人反應不知如何使用晶片晶片內部的複雜數學運算,比如三角函數運算。針對這個部分本文將詳細介紹如何使用硬體浮點單元以及相關數學運算。

本文引用地址:http://www.eepw.com.cn/article/201611/316118.htm


二.問題產生原因
1. -對於Keil MDK Version 5 版本, 編譯器已經完全支持STM32F4xx 的FPU(浮點運算單元),可以直接使用晶片內部的浮點運算單元。

2. -對於Keil MDK Version 4 版本, 高版本v4,比如當前keil">keil官網可下載的v4.74.0.0 版本也已經支持FPU,可以直接使用晶片內部浮點運算。但如果使用低版本v4,如v4.23.0.0 版本,則需要對軟體進行相應設置。


三. 如何解決問題
1. 查看手頭Keil 版本是否支持FPU,最簡單辦法是進入Keil 調試界面直接查看0xE000ED88 地址單元數據,如果為0x00F00000, 則說明已經支持FPU,如下圖所示:

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。

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 硬體浮點單元
    前言有工程師反應說Keil 下無法使用STM32F4xx 硬體浮點單元, 導致當運算浮點時運算時間過長,還有一些人反應不知如何使用晶片晶片內部的複雜數學運算,比如三角函數運算。針對這個部分本文將詳細介紹如何使用硬體浮點單元以及相關數學運算。
  • STM32F4-浮點DSP庫的MDK開發環境的設置
    ARM_MATH_CM4這個就非常重要,必須要配置進去,否則在編譯之後,會默認使用math.h的庫函數,而不會用到硬體的FPU的。__CC_ARM是不同編譯器的編譯配置宏定義,__CC_ARM就是代表MDK開發環境。5.
  • STM32F4 新建標準庫函數工程
    具體有哪些選擇可在 stm32f4xx.h 頭文件中的條件編譯指令中找到。不確定選哪個的話可以根據晶片主頻從 system_stm32f4xx.c 文件的 PLL 分頻參數反推宏定義(要求對時鐘樹比較熟)。工程所包含的外設庫函數不同。
  • STM32F429的定時器的使用方法
    我是根據之前一直使用STM32F103的工程目錄改了一下,使用STM32F4XX的最新固件庫V1.6.1,至於為何不去直接操作寄存器,我想,雖然自己是硬體出身,搞寄存器更深入的了解處理器,但是,畢竟寄存器過多,有了庫,可以封裝一下,這樣更可以快速的上手。如果需要查看寄存器,也是可以查的。
  • 關於STM32Cube的幾個常見問題
    以STM32CubeF4固件包為例,它目前支持的開發板有:STM324x9I_EVAL,STM324xG_EVAL, STM32446E_EVAL, STM32F4-Discovery, STM32F401-Discovery,STM32F429I-Discovery, STM32F4xx-Nucleo, STM32469I_EVAL STM32469I-Discovery,STM32F446E-Nucleo
  • stm32F407的TIM定時器輸出PWM波
    今天測試了stm32F407的TIM定時器輸出PWM波,了解了其配置過程。_t TimingDelay;//__IO為volatile的宏定義int8_t LED_Flag = 1;//LED燈翻轉標誌位void GPIO_Config(void);void TIM_Config(void);void NVIC_Config(void);void Delay(__IO uint32_t nTime)
  • STM32教程(三)STM32 HAL固件庫介紹及使用建議!
    STM32 HAL固件庫是Hardware Abstraction Layer的縮寫,中文名稱是:硬體抽象層。HAL庫是ST公司為STM32的MCU最新推出的抽象層嵌入式軟體,為更方便的實現跨STM32產品的最大可移植性。
  • 【教程】如何用GCC「零彙編」白嫖MDK
    假設,我們要使用的晶片是STM32F746,我們知道它的內核是Cortex-M7,因此這裡就選擇 Arm->ARM Cortex-M7->ARMCM7_SP(假設是單精度浮點運算單元實際上一般晶片公司都會提供符合CMSIS規範的晶片頭文件,這一頭文件中會提供對應的中斷向量定義,比如STM32F746就有一個對應的頭文件 STM32F746xx.h。
  • Microchip擴展高性能32位MCU系列,新系列器件集成浮點單元
    (美國微芯科技公司)日前宣布擴展旗下高性能PIC32MZ系列32位單片機(MCU)產品。新系列器件集成了一個硬體浮點單元(FPU),有助密集型單精度和雙精度運算應用同時實現高性能和更低的延遲。此次推出的PIC32MZ EF系列有48款新器件,均具有一個適用於多種高速高帶寬應用的12位18 MSPS模數轉換器(ADC)。此外,PIC32MZ EF還支持廣泛的DSP指令集。
  • ARM指令學習筆記
    縱觀我們周圍的手機,諾基亞n86,n97,n95,n96......摩託諾拉,索愛,蘋果,三星,無一不大量使用arm處理器。而我們所要接觸的nds中的處理器ARM946E-S和ARM7TDMI是ARM公司研製的內嵌式32BITRISCCPU。它具有低功耗、高性能、體積小、低價格等優點。非常適合掌機使用。
  • STM32F103單片機RTC結合time.h使用
    在使用stm32f103系列單片機的時候總是會碰到RTC計時的問題,103系列單片機的RTC使用的是秒計時在經過一段時間的研究,終於發現了一種比較簡單而且易於理解的使用方法,就是結合系統文件time.h的使用 首先要添加頭文件 #include  RTC的初始化和普通方式無區別
  • 如何實現STM32F407單片機的ADC轉換
    用到的引腳是PA3也就是ADC1的通道3 1、ADC的主要參數 a、解析度----stm32f407的解析度有6位、8位、10位、12位,參考電壓如果是3.3 那麼最小解析度就是3.3/4095。 b、轉換時間----stm32f407的最高允許頻率是36M,最快轉換時間 = 3+12個周期 =0.71us。
  • 如何利用STM32CubeMX來自動生成STM32代碼
    實際上,HAL 庫和標準庫本質上是一樣的,都是提供底層硬體操作 API,而且在使用上也是大同小異。有過標準庫基礎的同學對 HAL 庫的使用也很容易入手。個人認為 ST 官方之所以這幾年大力推廣 HAL 庫,是因為 HAL 的結構更加容易整合 STM32Cube,而 STM32CubeMX 是 ST 這幾年極力推薦的程序生成開發工具。
  • STM32 使用 Keil MDK 中的軟體邏輯分析儀參與硬體調試(上)
    其中包括 STM32F4 處理器在 Keil MDK 中進行斷點調試、變量實時觀察,及邏輯分析儀參與硬體調試的實驗。原文使用的是 STM32F4-Discovery 開發板,我這裡都改用 NUCLEO-F401RE 實現了。
  • 幾點關於STM32CubeProgrammer的內容
    發現有很多朋友居然不知道STM32CubeProgrammer這個工具,今天暫且簡單講述一下吧。STM32CubeProgrammer這個工具大概也是在去年這個時候推出來的,差不多有一年了。地址:https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/stm32cubeprog.html
  • STM32F103C8T6驅動ov2640拍照串口傳輸到上位機
    使用環境(藍色粗體字為特別注意內容)1、軟體環境:Keil MDK 5.152、硬體環境:STM32F103C8T6最小系統,OV2640攝像頭模塊最近想玩玩攝像頭,於是在網上找找性價比比較高的攝像頭,之前用過OV7670這款攝像頭,不過這款攝像頭對單片機要求較高
  • STM32開發筆記3: STM32F407定時器2-5的使用方法
    單片機型號:STM32F407    STM32F4有多種定時器,其中TIM2-TIM5稱為通用定時器,具有相似的軟體設置及使用方法。在這裡還需要注意的是TIM3和TIM4為16位定時器,TIM2和TIM5為32位定時器。
  • stm32CubeMx CAN 發送數據
    關鍵字:stm32CubeMx  CAN  發送數據 編輯STM32CubeMX是一個配置STM32代碼的工具,它把很多東西封裝的比較好,硬體抽象層、中間層、示例代碼等。 現在ST公司升級和維護的庫主要就是STM32CubeMX的HAL庫和標準外設庫,使用這兩種庫開發STM32各有各的好處,下面簡單描述一下。
  • 如何將STM32F103ZET6工程變身為STM32F103C8T6呢?
    當然做STM32小玩意時,很多同學會拿祖傳的STM32F103C8T6最小系統板作為開發。   這裡就存在一個小小問題:正點的F1開發板晶片都是STM32F103ZET6、STM32F103RCT6,怎麼白嫖工程代碼呢?   這裡就簡單把這個偷龍換鳳的過程描述一下。   以戰艦板STM32F103ZET6串口實驗為例子講解「變身」過程。