STM32F103移植FreeRTOSv10.1.0

  • 正點(diǎn)原子戰(zhàn)艦戰(zhàn)艦開發(fā)板(STM32F103ZET6)
  • FreeRTOSv10.1.0

1.下載源碼

FreeRTOS官網(wǎng):FreeRTOS
下載后是一個(gè)FreeRTOSv10.1.0.exe文件,它才是真正下載源碼的東西,雙擊以后選擇保存目錄就可以開始下載了。

2.添加源碼到STM32工程

1.復(fù)制一份庫函數(shù)版本的跑馬燈工程,新建文件夾FreeRTOS


2.復(fù)制下載的源碼中的 FreeRTOSv10.1.0\FreeRTOS\Source文件夾下的所有文件到剛才的STM32工程FreeRTOS文件夾下

3.portable文件夾下可以只保留keil下編譯STM32F1相關(guān)的文件夾


3.修改工程

工程下新建FreeRTOS目錄,添加源碼中的7個(gè).文件和FreeRTOS\portable\MenMang\heap_4.cFreeRTOS\portable\RVDS\ARM_CM3\port.c


工程中添加頭文件:

從源碼中復(fù)制一份FreeRTOSConfig.h(FreeRTOSv10.1.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h),這里選擇STM32F103_keil工程下的該文件,放到工程下的FreeRTOS\include文件夾

修改FreeRTOS.h下的兩個(gè)宏定義,從0改為1

現(xiàn)在編譯工程應(yīng)該0 Error(s), 0 Warning(s)

4.修改startup_stm32f10x_hd.s

在第56行開始的地方

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size
/******************************change****************************/
                IMPORT  vPortSVCHandler
                IMPORT  xPortPendSVHandler
                IMPORT  xPortSysTickHandler
/****************************************************************/

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
/**************************************change****************************************/
;                DCD     SVC_Handler                ; SVCall Handler
                DCD     vPortSVCHandler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
;                DCD     PendSV_Handler             ; PendSV Handler
                DCD     xPortPendSVHandler
;                DCD     SysTick_Handler            ; SysTick Handler
                DCD     xPortSysTickHandler
/**************************************************************************************/

5.main.c中新建任務(wù)

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"


//任務(wù)優(yōu)先級
#define START_TASK_PRIO     1
//任務(wù)堆棧大小    
#define START_STK_SIZE      128  
//任務(wù)句柄
TaskHandle_t StartTask_Handler;
//任務(wù)函數(shù)
void start_task(void *pvParameters);

//任務(wù)優(yōu)先級
#define LED0_TASK_PRIO      2
//任務(wù)堆棧大小    
#define LED0_STK_SIZE       50  
//任務(wù)句柄
TaskHandle_t LED0Task_Handler;
//任務(wù)函數(shù)
void led0_task(void *pvParameters);

//任務(wù)優(yōu)先級
#define LED1_TASK_PRIO      3
//任務(wù)堆棧大小    
#define LED1_STK_SIZE       50  
//任務(wù)句柄
TaskHandle_t LED1Task_Handler;
//任務(wù)函數(shù)
void led1_task(void *pvParameters);


int main(void)
{ 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設(shè)置系統(tǒng)中斷優(yōu)先級分組4
    LED_Init();             //初始化LED端口
    
    //創(chuàng)建開始任務(wù)
    xTaskCreate((TaskFunction_t )start_task,            //任務(wù)函數(shù)
                (const char*    )"start_task",          //任務(wù)名稱
                (uint16_t       )START_STK_SIZE,        //任務(wù)堆棧大小
                (void*          )NULL,                  //傳遞給任務(wù)函數(shù)的參數(shù)
                (UBaseType_t    )START_TASK_PRIO,       //任務(wù)優(yōu)先級
                (TaskHandle_t*  )&StartTask_Handler);   //任務(wù)句柄              
    vTaskStartScheduler();          //開啟任務(wù)調(diào)度
}
 
//開始任務(wù)任務(wù)函數(shù)
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //進(jìn)入臨界區(qū)
    //創(chuàng)建LED0任務(wù)
    xTaskCreate((TaskFunction_t )led0_task,         
                (const char*    )"led0_task",       
                (uint16_t       )LED0_STK_SIZE, 
                (void*          )NULL,              
                (UBaseType_t    )LED0_TASK_PRIO,    
                (TaskHandle_t*  )&LED0Task_Handler);   
    //創(chuàng)建LED1任務(wù)
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);        
   
    vTaskDelete(StartTask_Handler); //刪除開始任務(wù)
    taskEXIT_CRITICAL();            //退出臨界區(qū)
}

//LED0任務(wù)函數(shù) 
void led0_task(void *pvParameters)
{
    while(1)
    {
        LED0=~LED0;
        vTaskDelay(500);
    }
}   

//LED1任務(wù)函數(shù)
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);
    }
}

6.驗(yàn)證

下載代碼到戰(zhàn)艦開發(fā)板上,發(fā)現(xiàn)LED0和LED1都閃爍,一個(gè)亮0.5s滅0.5s,一個(gè)亮0.2s滅0.8s

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容