日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]除了網上的教程外,還要特別注意,當運算中有浮點的數字時要把,數字后面加上一個f。例如表達式中有4.321參與運算。。當你不在4.321后加f時,stm32F405的片子不知道把他當做單精度float用FPU來運算,,默認可能是當做

除了網上的教程外,還要特別注意,當運算中有浮點的數字時要把,數字后面加上一個f。例如表達式中有4.321參與運算。。當你不在4.321后加f時,stm32F405的片子不知道把他當做單精度float用FPU來運算,,默認可能是當做double來運算(我不確定),運算速度還是很慢。。切記所有浮點數字后面加上f,,,,有時候keil會提示warning: #1035-D: single-precision operand implicitly converted to double-precision 這句話的意思就是單精度運算隱式轉換成了雙精度運算了。這個時候就要在單精度數字后面加個f


keilmdk的設置中完整的define是USE_STDPERIPH_DRIVER,STM32F4XX,__FPU_PRESENT=1,__FPU_USED =1,ARM_MATH_CM4,__CC_ARM

要在MDK中有個選項設置 usr FPU


STM32F4之FPU性能的充分發(fā)揮-設置要點

浮點運算一直是定點CPU的難題,比如一個簡單的1.1+1.1,定點CPU必須要按照IEEE-754標準的算法來完成運算,對于8位單片機來說已經完全是噩夢,對32為單片機來說也不會有多大改善。雖然將浮點數進行Q化處理能充分發(fā)揮32位單片機的運算性能,但是精度受到限制而不會太高。對于有FPU(浮點運算單元)的單片機或者CPU來說,浮點加法只是幾條指令的事情。


現(xiàn)在又FPU或者硬件浮點運算能力的主要有高端DSP(比如TI F28335/C6000/DM6XX/OMAP等),通用CPU(X87數學協(xié)處理器)和高級的ARM+DSP處理器等。


STM32-F4屬于Cortex-M4F構架,這和M0、M3的最大不同就是多了一個F-float,即支持浮點指令集,因此在處理數學運算時能比M0/M3高出數十倍甚至上百倍的性能,但是要充分發(fā)揮FPU的數學性能,還需要一些小小的設置:


1.編譯控制選項:雖然STM32F4XX固件庫的例程之system_stm32f4XXX.c文件中添加了對應的代碼,但給用戶評估使用的STM32F4-Discovery例程中卻沒有,因此MDK4.23編寫浮點運算程序時,雖然編譯器正確產生了V指令來進行浮點運算,但是因為system_stm32f4XXX.c文件沒有啟用FPU,因此CPU執(zhí)行時只認為是遇到非法指令而跳轉到HardFault_Handler()中斷中原地踏步。因此要保證這個錯誤不發(fā)生,必須要在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的情況,需要很多指令和復雜的過程才能完成運算,也就增加了運算時間。因此要充分發(fā)揮M4F的浮點功能,就需要使用固件庫自帶的arm_math.h,這個文件根據編譯控制項(__FPU_USED == 1)來決定是使用那一種函數方法:如果沒有使用FPU,那就調用keil的標準math.h頭文件中定義的函數;如果使用了FPU,那就是用固件庫自帶的優(yōu)化函數來解決問題。

在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中繼續(xù)加入語句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()快多了。


當然有些例外的是開發(fā)函數sqrt(),在arm_math.h中是這么定義的:

static __INLINE arm_statusarm_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);
}
}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式開發(fā)中,STM32的時鐘系統(tǒng)因其靈活性和復雜性成為開發(fā)者關注的焦點。然而,看似簡單的時鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時鐘源選擇、PLL配置、總線時鐘分配等關鍵環(huán)...

關鍵字: STM32 時鐘系統(tǒng)

在嵌入式系統(tǒng)開發(fā)中,STM32系列微控制器的內部溫度傳感器因其低成本、高集成度特性,廣泛應用于設備自檢、環(huán)境監(jiān)測等場景。然而,受芯片工藝差異和電源噪聲影響,其原始數據存在±1.5℃的固有誤差。本文從硬件配置、校準算法、軟...

關鍵字: STM32 溫度傳感器

在能源效率與智能化需求雙重驅動下,AC-DC轉換器的數字控制技術正經歷從傳統(tǒng)模擬方案向全數字架構的深刻變革。基于STM32微控制器的PFM(脈沖頻率調制)+PWM(脈沖寬度調制)混合調制策略,結合動態(tài)電壓調整(Dynam...

關鍵字: AC-DC STM32

當前智能家居產品需求不斷增長 ,在這一背景下 ,對現(xiàn)有澆花裝置缺陷進行了改進 ,設計出基于STM32單片機的全 自動家用澆花機器人。該設計主要由機械結構和控制系統(tǒng)構成 ,機械結構通過麥克納姆輪底盤與噴灑裝置的結合實現(xiàn)機器...

關鍵字: STM32 麥克納姆輪 安全可靠 通過性強

用c++編程似乎是讓你的Arduino項目起步的障礙嗎?您想要一種更直觀的微控制器編程方式嗎?那你需要了解一下Visuino!這個圖形化編程平臺將復雜電子項目的創(chuàng)建變成了拖動和連接塊的簡單任務。在本文中,我們將帶您完成使...

關鍵字: Visuino Arduino ESP32 STM32

基于STM32與LoRa技術的無線傳感網絡憑借其低功耗、廣覆蓋、抗干擾等特性,成為環(huán)境監(jiān)測、工業(yè)自動化等場景的核心解決方案。然而,如何在復雜電磁環(huán)境中實現(xiàn)高效休眠調度與動態(tài)信道優(yōu)化,成為提升網絡能效與可靠性的關鍵挑戰(zhàn)。本...

關鍵字: STM32 LoRa

在實時控制系統(tǒng)、高速通信協(xié)議處理及高精度數據采集等對時間敏感的應用場景中,中斷響應延遲的優(yōu)化直接決定了系統(tǒng)的可靠性與性能上限。STM32系列微控制器憑借其靈活的嵌套向量中斷控制器(NVIC)、多通道直接內存訪問(DMA)...

關鍵字: STM32 DMA

數字電源技術向高功率密度、高效率與高動態(tài)響應方向加速演進,STM32微控制器憑借其基于DSP庫的算法加速能力與對LLC諧振變換器的精準控制架構,成為優(yōu)化電源動態(tài)性能的核心平臺。相較于傳統(tǒng)模擬控制或通用型數字控制器,STM...

關鍵字: STM32 數字電源

STM32微控制器憑借其針對電機控制場景的深度優(yōu)化,成為高精度、高可靠性驅動系統(tǒng)的核心選擇。相較于通用型MCU,STM32在電機控制領域的核心優(yōu)勢集中體現(xiàn)在FOC(磁場定向控制)算法的硬件加速引擎與PWM死區(qū)時間的動態(tài)補...

關鍵字: STM32 電機控制

無線充電技術加速滲透消費電子與汽車電子領域,基于Qi協(xié)議的無線充電發(fā)射端開發(fā)成為智能設備能量補給的核心課題。傳統(tǒng)模擬控制方案存在響應滯后、參數調整困難等問題,而基于STM32的數字PID控制結合FOD(Foreign O...

關鍵字: STM32 無線充電
關閉