日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FreeRTOS移植到STM32F103

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FreeRTOS移植到STM32F103 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.創建工程

?

2.將FreeRTOS源碼,拷貝到工程目錄

?

3.刪除其它架構和編譯器的代碼

查看portable文件夾發現

MemMang為內存管理相關文件需要保留

Commom里面有個mpu相關代碼,我們不使用mpu,可以刪除

我們的開發環境是keil,打開keil文件夾,提示我們參照RVDS,因此保留RVDS,其它刪除

打開RVDS文件夾

STM32F103的內核為CORTEX-M3,刪除其它架構相關文件

?

4.將FreeRTOS文件添加進工程

?

添加好之后,編譯出現錯誤,缺少FreeRTOSConfig.h文件

?

5.添加配置文件

從FreeRTOS的demo程序中,將FreeRTOSConfig.h文件拷貝過來

重新編譯,無錯誤無警告

?

6.修改異常向量入口

我們知道SVC用于產生系統函數的調用請求,需要立即得到響應。SysTick用于產生系統節拍。PendSV用于懸起延遲處理。

在FreeRTOS的port.c中定義了這個三個異常的處理入口,分別為vPortSVCHandler、xPortSysTickHandler、xPortPendSVHandler。

在stm32f10x_it.c中也定義了這個三個異常的處理入口,分別為SVC_Handler、PendSV_Handler、SysTick_Handler。

因此,我們需要將異常處理入口指向由原來的SVC_Handler、PendSV_Handler、SysTick_Handler改變為vPortSVCHandler、xPortSysTickHandler、xPortPendSVHandler。

注釋掉原來的異常處理入口函數

在FreeRTOSConfig.h中重新定義異常處理入口函數

?

7.測試移植是否成功,創建rcc.h、rcc.c、nvic.h、nvic.c、freertos.c五個文件。

/************************************** 文件名:rcc.h* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 配置時鐘源************************************/ #ifndef __RCC_H_ #define __RCC_H_/* 功能: RCC時鐘配置參數: 無返回值:無*/ void rcc_config(void);#endif /************************************** 文件名: rcc.c* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 配置時鐘源************************************/ #include "stm32f10x.h" #include "stm32f10x_flash.h" #include "rcc.h"/* 功能: RCC時鐘配置參數: 無返回值:無*/ void rcc_config(void) { ErrorStatus HSEStartUpStatus;/* RCC寄存器設置為默認配置 */RCC_DeInit();/* 打開外部高速時鐘 */RCC_HSEConfig(RCC_HSE_ON);/* 等待外部高速時鐘穩定 */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS) { /* 設置HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* 設置PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* 設置PCLK1 = HCLK / 2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* 設置FLASH代碼延時 */FLASH_SetLatency(FLASH_Latency_2);/* 使能預取址緩存 */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* 設置PLL時鐘源為HSE倍頻9 72MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* 使能PLL */RCC_PLLCmd(ENABLE);/* 等待PLL穩定 */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);/* 設置PLL為系統時鐘源 */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* 等待系統時鐘源切換到PLL */while(RCC_GetSYSCLKSource() != 0x08);/* 設置系統節拍器時鐘源為FCLK */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);} } /************************************** 文件名: nvic.h* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 設置中斷控制器************************************/ #ifndef __NVIC_H_ #define __NVIC_H_/* 功能: 中斷嵌套控制器配置參數: 無返回值:無*/ void nvic_config(void);#endif /************************************** 文件名: nvic.c* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 設置中斷控制器************************************/ #include "stm32f10x.h" #include "nvic.h"/* 功能: 中斷嵌套控制器配置參數: 無返回值:無*/ void nvic_config(void) {/* 選擇中斷分組4 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); } /************************************** 文件名: main.c* 作者: stone* 版本: V0.1* 日期: 2018-3-29* 描述: 主文件************************************/ #include "stm32f10x.h" #include "rcc.h" #include "nvic.h" #include "FreeRTOS.h" #include "task.h"/* 硬件初始化 */ static void prvSetupHardware(void); /* freertos初始化 */ void freertos_init(void);/* 主函數 */ int main(void) {/* 硬件初始化 */prvSetupHardware();/* freertos初始化 */freertos_init();/* 啟動調度器 */vTaskStartScheduler(); }/* 硬件初始化 */ static void prvSetupHardware(void) {/* 時鐘配置 */rcc_config();/* 中斷嵌套控制器配置 */nvic_config(); } /************************************** 文件名: freertos.c* 作者: stone* 版本: V0.1* 日期: 2019-2-25* 描述: 系統對象創建************************************/ #include "FreeRTOS.h" #include "task.h"/* 測試任務1 */ void test1Task(void *argument); /* 測試任務2 */ void test2Task(void *argument);/* 功能: freertos初始化參數: 無返回值:無*/ void freertos_init(void) {/* 創建測試任務1 */xTaskCreate(test1Task, "test1", 128, NULL, 3, NULL );/* 創建測試任務2 */xTaskCreate(test2Task, "test2", 128, NULL, 3, NULL ); }/* 功能: 測試任務1參數: 創建時傳入返回值:無*/ void test1Task(void *argument) {/* 主循環 */for(;;){/* 延時1秒 */vTaskDelay(1000);} }/* 功能: 測試任務2參數: 創建時傳入返回值:無*/ void test2Task(void *argument) {/* 主循環 */for(;;){/* 延時1秒 */vTaskDelay(1000);} }

使用j-link調試,在任務1和任務2中分別打上斷點,系統調度正常

移植成功。

總結

以上是生活随笔為你收集整理的FreeRTOS移植到STM32F103的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。