這篇有點舊了,我最近又寫了一篇新的版本,附帶教學影片,可以搭配看:
http://lolikitty.pixnet.net/blog/post/171226332
懶得看 FreeRTOS 專案建置方法的人,我已幫大家建置好了 ,這裡提供 STM32F4 Free RTOS 7.4.0 的工程模板 (專案) 下載點:http://lolikitty.pixnet.net/blog/post/167858043
建置方法:
1.請先到 FreeRTOS 官方網頁下載 FreeRTOS 的 zip 包,目前最新版為 7.4 版
官方網頁:http://www.freertos.org/
官方下載:http://sourceforge.net/projects/freertos/files/FreeRTOS/
2.下載完成並解壓縮後,得到一個 FreeRTOSV7.4.0 資料夾。
3.之後我們把路徑 FreeRTOSV7.4.0\FreeRTOS\Source 的 Source 複製到 Keil-MDK 專案中。
4.接著再把 FreeRTOSV7.4.0\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK 資料夾底下的 FreeRTOSConfig.h 也複製到 Keil-MDK 專案中。( 如果你的版本跟我不同,找不到 CORTEX_M4F_STM32F407ZG-SK 資料夾,你可以找類似的的資料夾,只要是 STM32F4 就可以。)
5.在 Keil-MDK 中將 Source/include 所有的 *.h 匯入進來。
6.在 Keil-MDK 中將 FreeRTOSConfig.h 匯入進來。
7.在 Keil-MDK 中將 Source\portable\RVDS\ARM_CM4F 的 portmacro.h 匯入進來
8.在 Keil-MDK 中將 Source\portable\MemMang 的 heap_1.c 加入道專案中
9.在 Keil-MDK 中將 Source\portable\RVDS\ARM_CM4F 的 port.c 加入道專案中
10.在 Keil-MDK 中將 Source 底下的5個 *.c 檔案加入道專案中
11.修改 FreeRTOSConfig.h 將 #include "stm32f4xx.h" 標頭檔加入到文件中,並將 #define configCHECK_FOR_STACK_OVERFLOW 2 改成 #define configCHECK_FOR_STACK_OVERFLOW 0 ,存檔並關閉。
12.修改 port.c 將 #include "stm32f4xx.h" 標頭檔加入到文件中
13.建立一個 Keil-MDK 工程將以下程式碼貼上,如果編譯可以過,那麼恭喜你成功啦~
// 本範例使用 STM32F407VGT6
//
// 執行結果:
// PD13 每 1000 毫秒 點亮/熄滅 LED 一次
// PD15 每 500 毫秒 點亮/熄滅 LED 一次
#include "FreeRTOS.h"
#include "task.h"
#include "stm32f4xx.h"
// Task priorities: Higher numbers are higher priority.
#define mainTIME_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
#define mainTIME2_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
#define mainMEMS_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
#define mainDEBUG_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY )
xTaskHandle hTimeTask;
xTaskHandle hTimeTask2;
xTaskHandle hMemsTask;
xTaskHandle hDebugTask;
portTASK_FUNCTION_PROTO( vTimeTask, pvParameters );
portTASK_FUNCTION_PROTO( vTimeTask2, pvParameters );
portTASK_FUNCTION_PROTO( vMemsTask, pvParameters );
portTASK_FUNCTION_PROTO( vDebugTask, pvParameters );
uint64_t u64Ticks=0; // Counts OS ticks (default = 1000Hz).
uint64_t u64IdleTicks=0; // Value of u64IdleTicksCnt is copied once per sec.
uint64_t u64IdleTicksCnt=0; // Counts when the OS has no task to execute.
uint16_t u16PWM1=0;
// 任務一
// ----------------------------------------------------------------------------
void myTask1(){
portTickType xLastWakeTime = xTaskGetTickCount();
while(1){
GPIO_ToggleBits(GPIOD,GPIO_Pin_13);
vTaskDelayUntil( &xLastWakeTime, ( 1000 / portTICK_RATE_MS ) );
}
}
// 任務二
// ----------------------------------------------------------------------------
void myTask2(){
portTickType xLastWakeTime = xTaskGetTickCount();
while(1){
GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
vTaskDelayUntil( &xLastWakeTime, ( 500 / portTICK_RATE_MS ) );
}
}
// 初始化 GPIO
// ----------------------------------------------------------------------------
void GPIOInit(){
GPIO_InitTypeDef g;
g.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; // 指定 12,13,14,15 腳
g.GPIO_Mode = GPIO_Mode_OUT; // 設定針腳為輸出
g.GPIO_Speed = GPIO_Speed_100MHz; // 指定 GPIO 頻率為100 MHz
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // 啟用 GPIOD
GPIO_Init(GPIOD, &g); // 初始化 GPIO D
}
int main(void){
GPIOInit(); // 初始化 GPIO
// 創建任務一,執行 myTask1 () 涵式。
xTaskCreate( myTask1, (signed char *) "TIME", configMINIMAL_STACK_SIZE,
NULL, mainTIME_TASK_PRIORITY, &hTimeTask );
// 創建任務二,執行 myTask2 () 涵式。
xTaskCreate( myTask2, (signed char *) "TIME", configMINIMAL_STACK_SIZE,
NULL, mainTIME_TASK_PRIORITY, &hTimeTask );
vTaskStartScheduler(); // 開始任務調度
// Will only get here if there was insufficient memory to create
// the idle task.
while(1);
}
// This FreeRTOS callback function gets called once per tick (default = 1000Hz).
// ----------------------------------------------------------------------------
void vApplicationTickHook( void ) {
++u64Ticks;
}
// This FreeRTOS call-back function gets when no other task is ready to execute.
// On a completely unloaded system this is getting called at over 2.5MHz!
// ----------------------------------------------------------------------------
void vApplicationIdleHook( void ) {
++u64IdleTicksCnt;
}
// A required FreeRTOS function.
// ----------------------------------------------------------------------------
void vApplicationMallocFailedHook( void ) {
configASSERT( 0 ); // Latch on any failure / error.
}
留言列表