1. 程式人生 > >【MCU】移植AT32庫&FreeRTOS教程

【MCU】移植AT32庫&FreeRTOS教程

[toc] --- ## 前言 隨著全球晶圓缺貨,ST瘋狂漲價,也是時候把目光放到國產 MCU 上啦,感覺還不錯,看 datasheet 的的資料來分析,價效比高,效能強。至於穩定性嘛,我沒有長時間老化和細節地測試過,不做評論。 **建議**: * 如果不想重新構建新的 AT 工程,就在你ST產品的工程上修改即可,主要替換ST庫(*與AT庫幾乎是只有命名的區別*)、啟動檔案、核心檔案、全域性巨集、freeRTOS中的主頻設定等等。 * 替換ST庫時,注意命名即可,可以參考AT提供的例程來配置你的硬體IO。 **說明**: * 由於新建工程和替換ST都差不多,所以不分開細說。 * 以下由ST工程轉到AT工程。 * 由 **STM32F103VCT6** 轉到 **AT32F403AVCT7**。 ## 1. 移植AT庫 AT 提供了一套完整的 BSP&Pack 用於開發(*百度網盤連結中可找到*)。 主要包括 **at32f4xx** 外 設 驅 動 庫 、 內 核 相 關 文 件 、 完 整 的 應 用 例 程 以 及 能 夠 支 持 Keil_v5 、 Keil_v4 、 IAR_v6 和 IAR_v7、IAR_v8等多種開發環境的 **Pack** 檔案。 ### 1.1 移植核心相關檔案 AT32F403AVCT7 核心為 Cortex ® -M4F。 * 刪除 CM3 核心檔案 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124033845-470910617.png) * 把 CM4 核心檔案拷貝進來 * CM4 檔案原始碼路徑:**BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\CoreSupport** * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124045649-1195031238.png) ### 1.2 移植晶片型號相關檔案 * 啟動檔案,先刪除本地的啟動檔案 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124057476-193841236.png) * 把AT32的啟動檔案一通拉過來對應位置。可以只拉需要的啟動檔案,如 startup_at32f403avct7.s 檔案。 * AT 啟動檔案原始碼路徑: **BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\DeviceSupport\startup\mdk** * 啟動檔案的選擇可以參考文件 《**AT32F4xx標準庫BSP&Pack應用指南.pdf**》中的 **2.2 BSP使用方法**。 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124105019-1149601278.png) * 晶片配置檔案,先刪除本地STM32的晶片配置檔案 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124113832-1215093253.png) * 把 AT 的晶片配置檔案拷貝進來 * AT 晶片配置檔案原始碼路徑:**BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\DeviceSupport** * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124123603-1402603461.png) ### 1.3 移植晶片外設驅動庫 * 刪除STM32的外設驅動庫 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124131319-1997123546.png) * 把 AT 的外設驅動庫拷貝進來 * AT 外設驅動庫原始碼路徑:**BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries** * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124138052-1632837214.png) ### 1.4 移植配置檔案及中斷回撥函式檔案 * 刪除 STM32 配置檔案及中斷回撥函式專用檔案。 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124146399-1163244242.png) * 新增 AT32 配置檔案及中斷回撥函式專用檔案。 ## 2. 移植FreeRTOS原始碼 注意,就算是在STM32&FreeRTOS工程的基礎上移植,也要修改FreeRTOS檔案,因為核心不一樣,一個是CM3,一個是CM4F。 因為移植比較簡單,所以以下教程是從 零 移植。如果工程中已有 FreeRTOS 框架,則只需要替換即可。 ### 2.1 獲取 FreeRTOS 原始碼 **方法1**: * FreeRTOS官網:[http://www.freertos.org/](http://www.freertos.org/) * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124154448-382686653.png) * *具體下載步驟不在此闡述*。 **方法2**: * 可從 AT 提供的例程裡面獲取。 * 也可以從 AT 提供的 BSP 包中獲取: * 路徑:**BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Middlewares**。 ### 2.2 移植原始碼 先在工程目錄中建立兩個路徑的資料夾,分別用於存放原始檔和標頭檔案:**osPRJ\AT32-FreeRTOS\FreeRTOS\src** 和 **osPRJ\AT32-FreeRTOS\FreeRTOS\inc**。 #### 2.2.1 Source 資料夾 * 下圖紅框中為 FreeRTOS 通用原始檔和標頭檔案,都移植到工程FreeRTOS對應資料夾下 * 這兩部分的檔案試用於各種編譯器和處理器,是通用的。 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124205712-2100994512.png) * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124211439-30708601.png) * 新增核心介面檔案,移植到工程FreeRTOS對應資料夾下 * portblle 資料夾裡面很多與編譯器相關的資料夾,在不同的編譯器中使用不同的支援檔案。 * 核心介面檔案路徑:**FreeRTOS\Source\portable\RVDS\ARM_CM4F** * 檔案裡面的內容是由 FreeRTOS 官方的技術人員為 Cortex-M4F 核心的處理器寫的介面檔案,裡面核心的上下文切換程式碼是由組合語言編寫而成。 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124218699-1679520709.png) * 新增記憶體管理檔案,移植到工程FreeRTOS對應資料夾下(*本工程使用 heap4.c*) * MemMang 資料夾下面存放著與記憶體管理相關的檔案。 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124225048-1720674598.png) * 最後,拷貝 **FreeRTOSConfig.h** 檔案到 user 資料夾,即是和 main.c 一起即可(*可自由存放*)。 * FreeRTOSConfig.h 檔案是 FreeRTOS 的工程配置檔案。 * 主要用於配置和裁剪 FreeRTOS 核心。 * 可以先找 STM32 demo 的配置檔案: * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124232523-1192852362.png) * 或者去 AT 提供的 FreeRTOS 工程中拷貝一個 FreeRTOSConfig.h 檔案即可。二選一,反正都要配置的。 ----- 至此,檔案移植完畢。進入修改工程。 ----- ## 3. 修改工程 ### 3.1 工程配置 #### 3.1.1 修改全域性巨集 * 根據晶片型號設定不同的全域性巨集,可以參考官方例程或文件 《**AT32F4xx標準庫BSP&Pack應用指南.pdf**》中的 **2.2 BSP使用方法**。 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124241060-1266345852.png) #### 3.1.2 新增工程檔案 * 移除所有前面移植檔案時刪除的檔案 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124248308-1014333522.png) * 新增核心配置檔案:**system_at32f4xx.c**。 * 新增啟動檔案:**startup_at32f403avct7.s**。 * 新增外設驅動庫檔案,即是資料夾 **AT32F4xx_StdPeriph_Driver** 下的所有 **.c** 檔案。 * 新增 FreeRTOS 原始碼通用原始檔。(*若原工程已有,可省略該步驟*) * 新增 FreeRTOS 原始碼介面檔案:**port.c**。(*若原工程已有,可省略該步驟*) * 新增 FreeRTOS 原始碼記憶體管理檔案檔案:**heap_4.c**。(*若原工程已有,可省略該步驟*) * 新增 AT32 配置檔案、中斷回撥函式專用檔案:**at32f4xx_conf.h**、**at32f4xx_it.c**。 * 佈局效果圖: * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124257065-1071053332.png) * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124302422-615459954.png) #### 3.1.3 新增標頭檔案路徑 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124317445-1147203023.png) ### 3.2 根據 AT 庫修改程式碼 **修改 **System_at32f4xx.c** 檔案內容**: * **System_at32f4xx.c** 裡面包含了系統時鐘初始化內容,原生檔案裡可能沒有配置主頻,所以下面怕配置主頻為240MHz**。 * 開啟 **`#define SYSCLK_FREQ_240MHz 240000000`** 即可。(*若想配置為其它的主頻,開啟其一即可。*) ```c #if defined (AT32F403Axx)|| defined (AT32F407xx) /* #define SYSCLK_FREQ_224MHz 224000000 */ /* #define SYSCLK_FREQ_240MHz 240000000 */ #define SYSCLK_FREQ_240MHz 240000000 /* #define SYSCLK_FREQ_224MHz_HSI 224000000 */ /* #define SYSCLK_FREQ_240MHz_HSI 240000000 */ #endif ``` **標頭檔案**: ```c #include "stm32f10x.h" // 修改為 #include "at32f4xx.h" ``` **初始化結構體名稱**: * GPIO_Type,如 ```c GPIO_TypeDef* gpio_port; //修改為 GPIO_Type* gpio_port; ``` * 其它 **SPI_Type** 等等也如此類推。 **初始化結構體成員**: ```c GPIO_Speed_50MHz // 修改為 GPIO_MaxSpeed_50MHz ``` * 其它報錯的成員也可以跳到該結構體定義處,找出對應成員名,替換即可。 **引腳號**: * GPIO_Pins_1,如: ```c GPIO_Pin_1 // 修改為 GPIO_Pins_1 ``` * 還有引腳高低電平的配置也要修改: ```c #define spiOutHi(gpio, pin) {gpio->BSRR=pin;} //輸出高電平 #define spiOutLo(gpio, pin) {gpio->BRR=pin;} //輸出低電平 //修改為 #define spiOutHi(gpio, pin) {gpio->BSRE=pin;} //輸出高電平 #define spiOutLo(gpio, pin) {gpio->BRE=pin;} //輸出低電平 ``` **時鐘巨集**: * RCC_APB2PERIPH_GPIOA,如 ```c RCC_APB2Periph_GPIOA // 修改為 RCC_APB2PERIPH_GPIOA ``` * 其它 **RCC_APB1PERIPH_USART2** 等等也如此類推。 **串列埠及DMA**: * 一些函式名和引數巨集名等等,如: ```c USART_ITConfig(USART2x, USART_IT_IDLE, ENABLE); DMA_Cmd(USART2_Rx_DMA_Channel, ENABLE); // 修改為 USART_INTConfig(USART2x, USART_INT_IDLEF, ENABLE); DMA_ChannelEnable(USART2_Rx_DMA_Channel, ENABLE); ``` --- 好啦好啦,其它報錯的名稱替換就自行繼續吧。畢竟就只是替換 而已。 不過還是要注意,定時器不是簡單的改名字,還可能要該第幾個定時器。有空出一個 AT 的定時器配置教程。 --- * 修改後,編譯無誤 * ![](https://img2020.cnblogs.com/blog/2085252/202103/2085252-20210326124342938-1684157805.png) ### 3.3 裁剪FreeRTOS核心 裁剪核心,修改 **FreeRTOSConfig.h** 檔案即可。 把 **configCPU_CLOCK_HZ** 巨集配置為 **SystemCoreClock**即可,表示當前CPU主頻。 ```c #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) #include extern volatile uint32_t ulCpuTraceTick; extern uint32_t SystemCoreClock; #endif #define configUSE_PREEMPTION 1 #define configUSE_IDLE_HOOK 0 #define configUSE_TICK_HOOK 0 #define configCPU_CLOCK_HZ ( ( unsigned long ) SystemCoreClock ) // CPU 主頻 #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) // 系統主頻 #define configMAX_PRIORITIES ( 10 ) // 最大優先順序 #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) // 系統堆記憶體 #define configMAX_TASK_NAME_LEN ( 16 ) #define configUSE_TRACE_FACILITY 1 /* [cpu] task */ #define configUSE_16_BIT_TICKS 0 #define configIDLE_SHOULD_YIELD 1 ``` 其它配置及裁剪不細說。 --- 至此,編譯,燒寫即可。不過要記得選擇正確的晶片噢。 --- ## 連結 **連結**: * [李柱明部落格園](https://www.cnblogs.com/lizhuming/p/14581761.html) * [雅特力官網](https://www.arterytek.com/cn/index.jsp) * 從中可以下載參考文件,手冊,晶片包等等資料。 * [雅特力BSP-百度網盤](https://pan.baidu.com/s/1BQQz91QhJcyPF-mLMIsPJw) * 密碼:t3io