娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

使用PlatformIO IDE使用CMSIS DSP庫排坑

發(fā)布者:science56最新更新時間:2025-02-25 來源: jianshu關(guān)鍵字:PlatformIO  IDE  CMSIS  DSP庫 手機看文章 掃描二維碼
隨時隨地手機看文章

MCU:STM32F407
環(huán)境:VSCode + PlatformIO IDE + STM32CubeF4(v1.5.2)
編譯器:7.2.1 20170904 (release) [ARM/embedded-7-branch revision 255204]
PlatformIO Core: version 5.1.1

STM32F4 Core Feature Description


問題描述

由于用的是STM32F4平臺,在ST產(chǎn)品線中定位為高性能計算產(chǎn)品,帶有FPU和DSP指令集,這不用來做數(shù)字信號處理屬實浪費,剛好近期工作需求要用到FFT或者FIR,所以,萬事俱備,開搞!!

1. DSP庫在哪?文檔?
看了一下PlatformIO自帶的STM32CubeF4庫,為了節(jié)約服務(wù)器帶寬和用戶下載時間,所以包很精簡,可是...這用起來很不方便呀,沒有文檔怎么寫代碼

image.png


于是去官網(wǎng)下了一個標準版本,1.6.1最新版,帶了文檔。然而后來才發(fā)現(xiàn),原來CMSIS文檔是有在線版的:>>> CMSIS DSP Software Library <<<

官網(wǎng):STMicroelectronics/STM32CubeF4: STM32Cube MCU Full Package for the STM32F4 series - Github

CMSIS文檔


2. 編譯Demo
按理說三分鐘出demo的事,結(jié)果一開始情況就不太妙...首先找到自帶例程(為了要例程還是得下完整庫)。拿一個FIR的例子開刀:

image.png


復(fù)制進自己的項目,該函數(shù)名,燒錄運行?運行效果:

image.png



image.png


!!直接復(fù)制進來用會 遇到成噸報錯轟炸!!
觀察日志會發(fā)現(xiàn)基本全是CMSIS庫中的變量缺失錯誤,以及類型缺失錯誤。定位錯誤可以發(fā)現(xiàn):

image.png


類型錯誤很好解決,直接導(dǎo)入HAL的總?cè)肟?h文件#include (加到math_helper.h頂部)。
參考:#error 'Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)'


3. arm_math.h:932:41: error: redefinition of '__SMLALD'
編譯過后,錯誤少了一大筐:

但依然會有類似這種錯誤:


C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISInclude/cmsis_gcc.h:1652:31: note: previous definition of '__SHADD16' was here 1652 | __STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)

      |                               ^~~~~~~~~In file included from libarm_fir_example_f32math_helper.h:45,

                 from libarm_fir_example_f32arm_fir_example_f32.c:125:C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISDSPInclude/arm_math.h:932:41: error: redefinition of '__SMLALD'

  932 |   CMSIS_INLINE __STATIC_INLINE uint64_t __SMLALD(

      |                                         ^~~~~~~~In file included from C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISInclude/cmsis_compiler.h:48,

                 from C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISInclude/core_cm4.h:162,

                 from C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISDeviceSTSTM32F4xxInclude/stm32f407xx.h:167,

                 from C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISDeviceSTSTM32F4xxInclude/stm32f4xx.h:133,

                 from C:UsersJOY.platformiopackagesframework-stm32cubef4DriversSTM32F4xx_HAL_DriverInc/stm32f4xx_hal_def.h:30,

                 from C:UsersJOY.platformiopackagesframework-stm32cubef4DriversSTM32F4xx_HAL_DriverInc/stm32f4xx_hal_rcc.h:29,

                 from C:UsersJOY.platformiopackagesframework-stm32cubef4DriversSTM32F4xx_HAL_DriverInc/stm32f4xx_hal_conf.h:281,

                 from C:UsersJOY.platformiopackagesframework-stm32cubef4DriversSTM32F4xx_HAL_DriverInc/stm32f4xx_hal.h:30,

                 from libarm_fir_example_f32math_helper.h:44,

                 from libarm_fir_example_f32arm_fir_example_f32.c:125:

繼續(xù)定位,發(fā)現(xiàn)缺失的變量在cmsis_iccarm.h文件有定義:

根據(jù)導(dǎo)入鏈,查看arm_math.h文件,發(fā)現(xiàn)里面有這樣一行宏定義,在VSCode中顯示為灰色:


#if defined(ARM_MATH_CM7)

  #include 'core_cm7.h'

  #define ARM_MATH_DSP#elif defined (ARM_MATH_CM4)

  #include 'core_cm4.h'

  #define ARM_MATH_DSP

這個解決辦法就很明確了,直接在頂層include 文件添加一個宏定義,對應(yīng)到自己的MCU平臺即可。由于STM32F4系列對應(yīng)于Cortex-M4架構(gòu),所以這里定義一個ARM_MATH_CM4。

math_helper.h頭部:


#define ARM_MATH_CM4#include #include 'arm_math.h'

編譯:


4. arm_fir_example_f32.c:202: undefined reference to `arm_fir_f32'


Archiving .piobuildblack_f407zgliba89libarm_fir_example_f32.aArchiving .piobuildblack_f407zglibFrameworkCMSISDevice.aLinking .piobuildblack_f407zgfirmware.elf

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: .piobuildblack_f407zgliba89libarm_fir_example_f32.a(arm_fir_example_f32.o): in function `fir_test':C:DocumentsPlatformIOProjectsSTM32F4_ADC_Sampling_v2/libarm_fir_example_f32/arm_fir_example_f32.c:194: undefined reference to `arm_fir_init_f32'

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: C:DocumentsPlatformIOProjectsSTM32F4_ADC_Sampling_v2/libarm_fir_example_f32/arm_fir_example_f32.c:202: undefined reference to `arm_fir_f32'

collect2.exe: error: ld returned 1 exit status*** [.piobuildblack_f407zgfirmware.elf] Error 1


經(jīng)典的符號未定義問題,而且是在link階段出現(xiàn)的,說明DSP庫沒有正確鏈接上。也就是說這個庫對于編譯器來說是不知道在哪個位置的,需要自己添加上。

定位庫文件:

用的GCC編譯器,進去發(fā)現(xiàn)問題來了,選哪個呢?

搜索了解后知道,l是指little endian,f是指帶有硬件除法器,那么沒有疑問,用帶lf的那個,也就是libarm_cortexM4lf_math.a。


5. 導(dǎo)入DSP靜態(tài)庫

問題又來了,怎么導(dǎo)入到PIO呢?


打開platformio.ini文件,在環(huán)境中添加一行:


build_flags = 

    -LC:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISLibGCC    -larm_cortexM4lf_math

第N次編譯,結(jié)果:

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: error: C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISLibGCClibarm_cortexM4lf_math.a(arm_fir_init_q15.o) uses VFP register arguments, .piobuildblack_f407zgfirmware.elf does not

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISLibGCClibarm_cortexM4lf_math.a(arm_fir_init_q15.o)c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: error: C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISLibGCClibarm_cortexM4lf_math.a(arm_fir_init_f32.o) uses VFP register arguments, .piobuildblack_f407zgfirmware.elf does not

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISLibGCClibarm_cortexM4lf_math.a(arm_fir_init_f32.o)c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: error: C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISLibGCClibarm_cortexM4lf_math.a(arm_fir_f32.o) uses VFP register arguments, .piobuildblack_f407zgfirmware.elf does not

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file C:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISLibGCClibarm_cortexM4lf_math.a(arm_fir_f32.o)collect2.exe: error: ld returned 1 exit status*** [.piobuildblack_f407zgfirmware.elf] Error 1


6. 啟用編譯器(MCU)浮點數(shù)擴展


這里理一下思路:我們要用F4的浮點數(shù)運算能力,但是浮點數(shù)運算需要用到VFP指令和寄存器,但是libarm_cortexM4lf_math.a使用了VFP寄存器,而.piobuildblack_f407zgfirmware.elf沒有使用....


這個問題的解讀就是,生成一個可執(zhí)行文件elf時,其所有的中間對象*.o都要是同樣的編譯條件,至少對于VFP指令集的設(shè)置應(yīng)該是相同的。但是目前的ELF文件沒有啟用這個選項。


那么問題就簡單了,啟用一下不就可以了,而方式應(yīng)該就是通過對編譯器傳參,在platformIO中就對應(yīng)于,設(shè)置platformio.ini文件中的build_flags。


查過以上資料后,發(fā)現(xiàn)我應(yīng)該這么設(shè)置:


[env:black_f407zg]build_type = debug

platform = ststm32

board = black_f407zg

framework = stm32cube

upload_protocol = stlink

debug_tool = stlink

monitor_speed = 115200build_flags = 

    -LC:UsersJOY.platformiopackagesframework-stm32cubef4DriversCMSISLibARM    -larm_cortexM4lf_math    -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfloat-abi=hard -mfpu=fpv4-sp-d16

也就是添加一行5個flag

-mthumb -mcpu=cortex-m4 -march=armv7e-m -mfloat-abi=hard -mfpu=fpv4-sp-d16


使用過后,編譯結(jié)果:


c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file .piobuildblack_f407zgFrameworkHALDriverSrcstm32f4xx_ll_fsmc.o

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: error: .piobuildblack_f407zgsrcsystem_stm32f4xx.o uses VFP register arguments, .piobuildblack_f407zgfirmware.elf does not

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file .piobuildblack_f407zgsrcsystem_stm32f4xx.o

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: error: .piobuildblack_f407zgliba89libarm_fir_example_f32.a(arm_fir_example_f32.o) uses VFP register arguments, .piobuildblack_f407zgfirmware.elf does not...c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file .piobuildblack_f407zgliba89libarm_fir_example_f32.a(arm_fir_example_f32.o)c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: error: .piobuildblack_f407zgliba89libarm_fir_example_f32.a(fft.o) uses VFP register arguments, .piobuildblack_f407zgfirmware.elf does not

c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file .piobuildblack_f407zgliba89libarm_fir_example_f32.a(fft.o)c:/users/joy/.platformio/packages/toolchain-gccarmnoneeabi@2.00000.0/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: error: .piobuildblack_f407zgliba89libarm_fir_example_f32.a(math_helper.o) uses VFP register arguments, .piobuildblack_f407zgfirmware.elf does not

[1] [2]
關(guān)鍵字:PlatformIO  IDE  CMSIS  DSP庫 引用地址:使用PlatformIO IDE使用CMSIS DSP庫排坑

上一篇:搭建開發(fā)環(huán)境 --- 基于STM32CubeIDE
下一篇:NUCLEO-L432KC實現(xiàn)GPIO控制(STM32L432KC)

推薦閱讀最新更新時間:2025-04-03 12:30

STM32開發(fā)筆記43: 使用CMSIS-RTOS建立任務(wù)
單片機型號:STM32F070F6P6 昨天,將FreeRTOS移植到STM32現(xiàn)有的工程后,今天希望使用RTOS進行工程設(shè)計,遇到的第1個問題,就是工程中的函數(shù)在FreeRTOS的幫助文檔中全部都檢索不到。在網(wǎng)上仔細學(xué)習(xí)后,才發(fā)現(xiàn),ST公司給的FreeRTOS例程,又進行了一層封裝,這層就是CMSIS-RTOS。CMSIS-RTOS是keil公司對不同RTOS的一種封裝結(jié)構(gòu),可以使不同的RTOS具有相同的調(diào)用接口,以方便今后程序的移植。本文,詳細介紹使用CMSIS-RTOS建立任務(wù)的方法。 使用CMSIS-RTOS建立任務(wù)需要用到兩個API,分別是osThreadDef和GprsTaskHandle,其具體定義如下:
[單片機]
STM32開發(fā)筆記43: 使用<font color='red'>CMSIS</font>-RTOS建立任務(wù)
瑞薩電子推出集成開發(fā)環(huán)境 無需硬件即可實現(xiàn)ECU級汽車軟件開發(fā)
9月27日,先進 半導(dǎo)體 解決方案供應(yīng)商瑞薩電子公司(Renesas Electronics Corporation)推出新的集成開發(fā)環(huán)境,允許工程師為包含多個硬件設(shè)備的汽車ECU(電子控制單元)快速創(chuàng)建軟件。該完全集成的環(huán)境支持多個SoC(片上系統(tǒng))和MCU( 微控制器 )上的協(xié)同仿真、調(diào)試和跟蹤、高速仿真和分布式處理軟件,且均無需實際硬件。 圖片來源:瑞薩 該軟件開發(fā)環(huán)境可以認可了汽車行業(yè)不斷向“軟件優(yōu)先(Software First)”產(chǎn)品的開發(fā)轉(zhuǎn)變,其中汽車的價值越來越多地由其軟件定義,并轉(zhuǎn)向“左移(Shift Left)”軟件設(shè)計方法,即在開發(fā)周期早期,也就是硬件可用之前,注重軟件驗證和確認。目前,第一批開發(fā)環(huán)
[汽車電子]
瑞薩電子推出<font color='red'>集成開發(fā)環(huán)境</font> 無需硬件即可實現(xiàn)ECU級汽車軟件開發(fā)
【MPLAB X IDE】04:找不到目標器件
環(huán)境 MPLAB X IDE版本:v5.10 編譯器:xc16-gcc v1.20 解決方法 1、打開菜單 文件項目屬性,彈出項目屬性對話框。點擊 PICkit 3,選擇下拉框Firmware,去掉Use Latest Firmware單選框后的勾。
[單片機]
【MPLAB X <font color='red'>IDE</font>】04:找不到目標器件
PIC單片機入門_MPLAB 集成開發(fā)環(huán)境和 MPASM編譯器
1.七大匯編指令 1.1 #INCLUDE 語法: #include “文件名.*” 或 文件名.* 或無括號 或 引號 示例: #INCLUDE p12f675.inc 1.2 #DEFINE 用于定義變量和分配初始值;用戶友好的名字被分配給常數(shù),寄存器 ,管腳名等. 使程序易讀; 例: #DEFINE MYCONSTANT H’5A’ 1.3 _ _CONFIG 設(shè)置配置位 1.4 ORG 語法: ORG address 例: ORG 0x0000 描述: 定義起始地址(0x0000). 1.5 EQU 語法: label equ expr 例: Seconds EQU 0x24 描述: 定義
[單片機]
PIC單片機入門_MPLAB <font color='red'>集成開發(fā)環(huán)境</font>和 MPASM編譯器
【MPLAB X IDE】01:中文注釋
這幾天,由于項目開發(fā)的需要,我開始熟悉MPLAB X IDE開發(fā)環(huán)境。與以前的IDE環(huán)境相比,X IDE開發(fā)環(huán)境界面顯得高大上許多了。以前IDE開發(fā)的工程需要轉(zhuǎn)換到X IDE,這里會遇到一些X IDE的基本設(shè)置。 下面介紹一下X IDE支持中文注釋。 環(huán)境 MPLAB X IDE版本:v5.10 步驟 1、項目需要支持GB2312編碼。 打開菜單 文件項目屬性,彈出項目屬性對話框。點擊 常規(guī),編碼下拉框選擇GB2312。 2、IDE編輯器字體需要支持中文。 打開菜單 工具選項,彈出選項對話框。依次點擊 字體與顏色語法默認,在字體下拉框選項 宋體 或者其他中文字體。 這樣,編輯器就可以使用中文注釋了。
[單片機]
【MPLAB X <font color='red'>IDE</font>】01:中文注釋
基于ARM920T微處理器的IDE硬盤接口設(shè)計與實現(xiàn)
   1 引言   20世紀90年代后期,嵌入式系統(tǒng)在工業(yè)控制、遠程監(jiān)控和數(shù)據(jù)采集等領(lǐng)域的應(yīng)用日趨廣泛,人們對嵌入式系統(tǒng)的存儲容量也提出了較高的要求。因此研制適用于嵌入式系統(tǒng)的大容量、高速率、高可靠性的數(shù)據(jù)存儲系統(tǒng)變得日益重要。本文針對一款基于ARM920T芯片的開發(fā)板,根據(jù)ATA硬盤接口規(guī)范,設(shè)計了IDE硬盤接口電路,實現(xiàn)了對IDE硬盤的讀寫,可以在Linux系統(tǒng)中對其上的文件系統(tǒng)自由訪問,達到了高速率和高可靠性的要求。    2 ARM920T與S3C2410介紹   ARM 包括一系列微處理芯片技術(shù)。ARM920T是ARM系列微處理器的一種,它采用5階段管道化ARM9TDMI內(nèi)核,同時配備了Thumb擴展、Emb
[嵌入式]
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 彭水| 新巴尔虎右旗| 嵊泗县| 涿鹿县| 柏乡县| 双柏县| 商都县| 舒兰市| 宁晋县| 九龙坡区| 河北区| 凉山| 凌源市| 泰来县| 南开区| 云浮市| 收藏| 宁明县| 建阳市| 新巴尔虎右旗| 漳州市| 景宁| 韶关市| 浦城县| 安龙县| 肃宁县| 炉霍县| 三都| 巴楚县| 英吉沙县| 涡阳县| 武威市| 仙居县| 林西县| 邹平县| 彭泽县| 岳池县| 安康市| 凭祥市| 逊克县| 甘谷县|