目錄
一、新建STM32工程
為了示范完整的移植過程,我們從0開始,新建一個標準的STM32點燈工程。
(本篇以CubeMX作示范,CubeIDE操作近同,可作對比參考)
1、新建工程?
選擇 芯片型號?新建工程
2、搜索芯片型號
輸入芯片型號進行搜索 (注意:如果輸入框為粉紅色,可能是因為前面有空格,要刪除)雙擊搜索結果中的目標芯片型號,即可進入配置。
3、配置Debug調試方式
新建工程時,養成習慣:先配置Debug選項(即調試模式);如果沒有使能Debug:燒錄一次程序后,將關閉調試引功能,無法再燒錄(得解鎖芯片);
4、選擇 晶振源
HSE,外部高速時鐘源,選擇:?Crystal/Ceramic Resonator
5、配置 時鐘樹
下圖參數,通用STM32F407xx系列 ,(更換為你所用芯片的時鐘樹參數即可通過)。1、3兩項,要填寫實物晶振值,可以查看晶振上絲印, 也可以查看原理圖。目前市面的F407系列開發板,常用晶振有8MHz、25MHz兩種,修改下圖1、2兩處即可。? ? ? ??
6、配置 LED燈?引腳
這里,我們增加LED的引腳配置,將用于驗證STM32工程配置的正確性。
每個開發板上,都會有LED燈,在調試程序時可以配合作為各種狀態指示輸出。
小編所用的STM32板子,查得LED原理圖如下:
紅燈使用PC5、藍燈使用PB2低電平時通路
依據此圖,我們對這兩個引腳進行配置:
引腳 PC5,工作模式:GPIO_Output(推出模式),修改別名:LED_RED引腳 PB2,工作模式:GPIO_Output(推出模式),修改別名:LED_BLUE如果希望程序運行后默認為:熄燈,還可以配置:上拉,這樣程序運行后電路就是斷路狀態。
7、工程選項
進入工程管理頁面,設置4項:工程名稱、存放目錄、開發環境、堆棧大小。
目錄、名稱:重點:不能使用中文!否則無法正常生成。開發環境:選MDK-ARM,? 即Keil工程。堆棧大小:都修改成0x1000(或者更大),以適配FreeRTOS、LVGL等移植。
提示:
CubeMX:生成后,工程文件夾,可以復制到其它中文路徑下存放,也可以修改成中文的文件夾名稱,以便管理。但工程的名稱,不能修改!CubeIDE:生成后,工程文件夾,可以復制到其它英文路徑下存放。路徑、名稱都不支持中文。
8、文件選項
這一頁,打勾兩個選擇:
標記2處:只生成需要的庫文件(可以有效減少代碼體積)。標記3處:為各種外設生成獨立c、h文件(不打勾時,外設的初始化代碼會堆在main.c中)。
至此,已完成新建工程所需全部配置。
9、生成工程
生成后,彈窗:
小編的習慣:打開文件夾,再手動打開工程。
二、驗證工程
這一部分,我們通過編寫代碼,使LED每500ms閃爍一次,以驗證工程的配置是否完整。
1、設置 仿真器?參數
選擇 CMSIS DAP打勾自動復位、運行
2、添加LED閃爍代碼
很多新手不重視LED,覺得太簡單太無聊了,沒味道。
請認真看待LED的使用,它是大殺器般的存在。
如,規律地閃爍,可以幫助我們判斷:系統時鐘是否正常、程序有沒有卡死等等。
雙擊打開main.c在while中的 /* USER CODE BEGIN 3 */?下方,編寫規律閃爍LED的代碼,如下:
/** 1ms延時 **/ HAL_Delay(1 - 1); // 延時函數,參數:ms; 注意:CubeMX生成的HAL_Delay(), 函數內部為避免無效操作,會對傳入參數+1,因此,如果只需要幾ms延時建議傳入參數時-1,如果需要大幾百ms的非精準延時,那參數不-1也影響不大/** 每500ms閃爍一次藍色LED **/ static uint16_t msLED = 0; if (++msLED == 500) // 每500ms執行一次 {msLED = 0; // 計數清0HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin); // 規律地閃爍藍色LED,方便外部觀察系統是否正常運行 }
完成后,是這個樣子的:
3、編譯
新工程的第一次編譯,時間會有點長,大約幾十秒。
編譯完成后,信息欄的輸出,是這個樣子:
重點:必須 0 Erros,才能生成燒錄文件。
4、?燒錄?
點擊“燒錄”,下方的燒錄進度條,大約要跑10秒左右。
燒錄完成后,芯片將會自動復位,運行里面的程序。
如果程序一切正常,這時,我們觀察開發板:藍色LED,將會每0.5秒反轉閃爍一次。
至此,我們的STM32點燈工程,已通過驗證,可以使用它,進行FreeRTOS的移植了 !
三、移植 FreeRTOS
以前,移植FreeRTOS的底層代碼,是需要自己復制、增刪、修改代碼,很是麻煩,相當耗時。
而現在通過CubeMX、CubeIDE,只需簡單地點擊,就能自動生成已移植好FreeRTOS的工程。
1、回到圖形化配置界面
如果已關閉了CubeMX,雙擊工程目錄下的 ioc 文件再次打開。
2、修改HAL庫的時基源
我們先理解兩個時基源:FreeRTOS時基源、HAL庫時基源。
首先是FreeRTOS的時基源,它將占用Systick定時器,每1ms產生1次計數,用作任務時基。
而CubeMX生成的HAL庫代碼,也需要一個時基源,也默認使用:SysTick。
HAL庫的時基源,很多人以為只是被簡單用于延時,如 HAL_Delay();
其實,它還用于HAL庫代碼中的超時監測等場景中,如:I2C通信的ACK等待超時。
如果上述兩者都同時使用SysTick作時基源,潛在一定風險,在生成代碼時,會彈窗警告!
所以,為了避免發生沖突,我們需要修改HAL庫所用的時基源,使用其它閑置的TIM。
如:TIM7等。
3、使能FreeRTOS??
上圖中,在選擇:?CMSIS_V2后,就能使能FreeRTOS,其它參數,默認即可,不作修改。
(后續可以按項目需要進行修改,再生成更新后的配置。)
來到這一步,已完成了FreeRTOS的移植。
......是不是相當的意外,只是打了一個勾,就移植好了,就這么簡單!!
4、默認生成的OS任務
(這個小節,原本想示范如何新建一個任務,但為了各篇章的獨立,還是把這事獨立一篇吧。)
在使能FreeRTOS后,會自動生成一個默認的任務:defaultTasK。
在選項頁 "Tasks and Queues" ,可以查看這個任務的參數配置。
具體如下圖所示:
這里,也不作任何修改,直接使用默認參數。
5、再次生成工程
(待更新。。。)
6、為任務編寫執行代碼
(待更新。。。)