iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
佛心分享-IT 人自學之術

韌體小白之路系列 第 2

[Day02] 韌體小白之路_應用環境安裝

  • 分享至 

  • xImage
  •  

我主要用的MCU為STM32F407G-DISC1,所以分別要下載STM32 IDE與 FreeRTOS

STM32_IDE

下載網址: https://www.st.com/en/development-tools/stm32cubeide.html#get-software
因為教材比較舊+我是Win系統,所以下載的是1.0.2的Win版本的STM32 IDE
==注意:下載不同版本可能會導致後面Build 錯誤!==

FreeRTOS

下載網址: https://github.com/FreeRTOS/FreeRTOS/releases 版本是FreeRTOSv202012.00
(因為版本比較舊,所以是到Github去下載)

基礎任務 HelloWorld

初始化Project

  1. 建立新的STM Project
    https://ithelp.ithome.com.tw/upload/images/20240916/201555207eMlI34rM1.png

  2. 選擇電路板/MCU
    輸入STM32F4 DISCOVERY即可
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520jTstUIRGSR.png

  3. 輸入Project名稱,並選用開發的程式語言
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520NrsZtNqPnw.png

  4. 其他設定
    因為我沒有用到其他設定,所以直接Next->Finish
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520pnl0LCXoye.png

  5. 其他問題

  • 是否使用預設模式初始化所有週邊設備? No
    https://ithelp.ithome.com.tw/upload/images/20240916/201555201MSraCMUxg.png

  • 是否打開STM32CubeMx軟體的配置工具? Yes
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520MXD1gCH9vj.png

初始化Project完成(第一次使用可能要等久一點,會自動下載相關的pkg~)

將FreeRTOS加入到你的Project中

方法1: 使用STM32設計好的工具直接加入,缺點: 改用其他MCU時,不一定有這樣寫好的工具
https://ithelp.ithome.com.tw/upload/images/20240916/20155520TKDmUBb5u9.png

方法2: 手動加入

  1. 在右邊建立一個新資料夾名為ThirdParty
    https://ithelp.ithome.com.tw/upload/images/20240916/201555204UqD2aTm7K.png
    完成:
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520fnCR0hXqLK.png
  2. 到放置ThirdParty的位置,複製相關FreeRTOS所需的文件(就是原本先前下載好的FreeRTOS)
    2.1 複製以下資料夾到ThirdParty中
  • 下載FreeRTOS的位置\FreeRTOSv202012.00\FreeRTOSv202012.00\FreeRTOS\License
  • 下載FreeRTOS的位置\FreeRTOSv202012.00\FreeRTOSv202012.00\FreeRTOS\Source 裡面的所有檔案
    現在你的ThirdParty應該長這樣:
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520jMIPULAbmY.png
    2.2 在ThirdParty中打開ThirdParty\FreeRTOS\portable,保留GCC、MemMang資料夾和readme.txt,其餘刪除
    完成後的ThirdParty\FreeRTOS\portable裡面應該長這樣:
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520gmi92y7K0f.png
    2.3 打開ThirdParty\FreeRTOS\portable\GCC中,保留ARM_CM4F資料夾(因為使用的MCU是用此處理器),其餘刪除
    完成後你的資料夾FreeRTOS內部應該是要長這樣:
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520uW3JJKSBJR.png
  1. 回到IDE上,對FreeRTOS_Projects右鍵並選Refresh

  2. 對ThirdParty資料夾右鍵選擇Properties
    https://ithelp.ithome.com.tw/upload/images/20240916/201555207GLCUaswrN.png

  3. 確保C/C++ Build中的Exclude resource from build沒有點(就是紅色圈圈的地方不要勾)
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520NPlzcBeYkQ.png

  4. 因為FreeRTOS已經有做好的Memory管理,所以我們要停掉原本的Memory管理
    紅色圈圈的地方勾起來,Apply and Close
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520SpuRIba1gG.png

  5. 因為僅用到Heap管理中的heap_4.c檔案,所以砍掉其他的
    https://ithelp.ithome.com.tw/upload/images/20240916/20155520CrAS8o7tFa.png

  6. 配置FreeRTOS head file:
    將freeRTOS資料夾加入include_path中,對ThirdParty資料夾右鍵選擇Properties-> C/C++Build
    ->Settings ->MCU GCC Complier ->點選紅色5下方的綠色加號
    再將${workspace_loc:/${ProjName}/ThirdParty/freeRTOS/include} 、${workspace_loc:/${ProjName}/ThirdParty/freeRTOS/portable/GCC/ARM_CM4F}加入
    (就是點選Workspace後選到ThirdParty/freeRTOS/include&ThirdParty/freeRTOS/portable/GCC/ARM_CM4F)加入

  7. 配置FreeRTOSConfig.h文件:
    路徑:
    FreeRTOS的位置\FreeRTOSv202012.00\FreeRTOSv202012.00\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK\FreeRTOSConfig.h
    將FreeRTOSConfig.h複製到"放置Projects資料夾的位置\FreeRTOS_Projects\ThirdParty\freeRTOS"
    再將freeRTOS資料夾加入include_path中,對ThirdParty資料夾右鍵選擇Properties-> C/C++Build
    ->Settings ->MCU GCC Complier ->點選綠色加號
    將${workspace_loc:/${ProjName}/ThirdParty/freeRTOS}加入

開始Build Project & Debug

  1. 對FreeRTOS_Projects Build Project
    https://ithelp.ithome.com.tw/upload/images/20240916/201555209TxVk9sGNQ.png

  2. 出現 error: 'SystemCoreClock' undeclared
    打開FreeConfig.h檢查發現SystemCoreClock已經被文件system_stm32f4xx定義過了,所以需要再FreeConfig.h中修改
    2.1 打開FreeConfig.h文件找到以下Code位置:

/* Ensure stdint is only used by the compiler, and not the assembler. */
#ifdef __ICCARM__
	#include <stdint.h>
	extern uint32_t SystemCoreClock;
#endif

修改為(代表在這些編譯器下,會執行這個Code作為編譯使用)

/* Ensure stdint is only used by the compiler, and not the assembler. */
#if defined( __ICCARM__) || defined(__GNUC__) || defined(__CC_ARM)
	#include <stdint.h>
	extern uint32_t SystemCoreClock;
#endif
  1. Build仍有錯誤

port.c:247: multiple definition of SVC_Handler'
port.c:441: multiple definition of PendSV_Handler'
port.c:495: multiple definition of SysTick_Handler'
這三個錯誤表示重複定義了這三個Handler(FreeRTOS有定義、STM32CUBE也有定義),我們要關掉STM32定義的那個
3.1 點選FreeRTOS_Projects.ioc檔案,圈起來的地方不要勾
https://ithelp.ithome.com.tw/upload/images/20240916/20155520d1cCtKMVxE.png
3.2 儲存,並Generate Code

  1. Build仍有錯誤

undefined reference to vApplicationTickHook'
undefined reference to vApplicationTickHook'
undefined reference to vApplicationStackOverflowHook'
將FreeConfig.h中的

#define configUSE_TICK_HOOK				1 => 改為0
#define configUSE_MALLOC_FAILED_HOOK	1 => 改為0
#define configCHECK_FOR_STACK_OVERFLOW	2 => 改為0

終於沒有error,編譯過了! 明天再繼續!


上一篇
[Day01] 韌體小白之路_起點
下一篇
[Day03] 韌體小白之路_建立Task
系列文
韌體小白之路7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言