這篇有點舊了,我最近又寫了一篇新的版本,附帶教學影片,可以搭配看:

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.
}

 



 

 

 

 

 

 

arrow
arrow
    全站熱搜

    黃彥霖 發表在 痞客邦 留言(5) 人氣()