【MCU】移植AT32庫&FreeRTOS教程
- 2021 年 3 月 26 日
- 筆記
- /labbel/C, /label/FreeRTOS, /label/lzm, /label/MCU, AT32, C語言, freeRTOS, 博文, 國產MCU, 嵌入式, 教程集合
前言
隨着全球晶圓缺貨,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 內核文件
-
把 CM4 內核文件拷貝進來
- CM4 文件源碼路徑:BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\CoreSupport
1.2 移植芯片型號相關文件
-
啟動文件,先刪除本地的啟動文件
-
把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使用方法。
-
芯片配置文件,先刪除本地STM32的芯片配置文件
-
把 AT 的芯片配置文件拷貝進來
- AT 芯片配置文件源碼路徑:BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\DeviceSupport
1.3 移植芯片外設驅動庫
-
刪除STM32的外設驅動庫
-
把 AT 的外設驅動庫拷貝進來
- AT 外設驅動庫源碼路徑:BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries
1.4 移植配置文件及中斷回調函數文件
-
刪除 STM32 配置文件及中斷回調函數專用文件。
-
添加 AT32 配置文件及中斷回調函數專用文件。
2. 移植FreeRTOS源碼
注意,就算是在STM32&FreeRTOS工程的基礎上移植,也要修改FreeRTOS文件,因為內核不一樣,一個是CM3,一個是CM4F。
因為移植比較簡單,所以以下教程是從 零 移植。如果工程中已有 FreeRTOS 框架,則只需要替換即可。
2.1 獲取 FreeRTOS 源碼
方法1:
- FreeRTOS官網://www.freertos.org/
-
-
具體下載步驟不在此闡述。
-
方法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對應文件夾下
-
這兩部分的文件試用於各種編譯器和處理器,是通用的。
-
-
-
-
添加內核接口文件,移植到工程FreeRTOS對應文件夾下
- portblle 文件夾裏面很多與編譯器相關的文件夾,在不同的編譯器中使用不同的支持文件。
- 內核接口文件路徑:FreeRTOS\Source\portable\RVDS\ARM_CM4F
- 文件裏面的內容是由 FreeRTOS 官方的技術人員為 Cortex-M4F 內核的處理器寫的接口文件,裏面核心的上下文切換代碼是由彙編語言編寫而成。
-
添加內存管理文件,移植到工程FreeRTOS對應文件夾下(本工程使用 heap4.c)
- MemMang 文件夾下面存放着與內存管理相關的文件。
-
最後,拷貝 FreeRTOSConfig.h 文件到 user 文件夾,即是和 main.c 一起即可(可自由存放)。
-
FreeRTOSConfig.h 文件是 FreeRTOS 的工程配置文件。
-
主要用於配置和裁剪 FreeRTOS 內核。
-
可以先找 STM32 demo 的配置文件:
-
或者去 AT 提供的 FreeRTOS 工程中拷貝一個 FreeRTOSConfig.h 文件即可。二選一,反正都要配置的。
-
至此,文件移植完畢。進入修改工程。
3. 修改工程
3.1 工程配置
3.1.1 修改全局宏
- 根據芯片型號設置不同的全局宏,可以參考官方例程或文檔 《AT32F4xx標準庫BSP&Pack應用指南.pdf》中的 2.2 BSP使用方法。
3.1.2 添加工程文件
-
移除所有前面移植文件時刪除的文件
-
添加內核配置文件: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。
-
布局效果圖:
-
3.1.3 添加頭文件路徑
3.2 根據 AT 庫修改代碼
修改 System_at32f4xx.c 文件內容:
- System_at32f4xx.c 裏面包含了系統時鐘初始化內容,原生文件里可能沒有配置主頻,所以下面怕配置主頻為240MHz**。
- 打開
#define SYSCLK_FREQ_240MHz 240000000
即可。(若想配置為其它的主頻,打開其一即可。)
#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
頭文件:
#include "stm32f10x.h"
// 修改為
#include "at32f4xx.h"
初始化結構體名稱:
- GPIO_Type,如
GPIO_TypeDef* gpio_port;
//修改為
GPIO_Type* gpio_port;
- 其它 SPI_Type 等等也如此類推。
初始化結構體成員:
GPIO_Speed_50MHz
// 修改為
GPIO_MaxSpeed_50MHz
- 其它報錯的成員也可以跳到該結構體定義處,找出對應成員名,替換即可。
引腳號:
- GPIO_Pins_1,如:
GPIO_Pin_1
// 修改為
GPIO_Pins_1
- 還有引腳高低電平的配置也要修改:
#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,如
RCC_APB2Periph_GPIOA
// 修改為
RCC_APB2PERIPH_GPIOA
- 其它 RCC_APB1PERIPH_USART2 等等也如此類推。
串口及DMA:
- 一些函數名和參數宏名等等,如:
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 的定時器配置教程。
- 修改後,編譯無誤
3.3 裁剪FreeRTOS內核
裁剪內核,修改 FreeRTOSConfig.h 文件即可。
把 configCPU_CLOCK_HZ 宏配置為 SystemCoreClock即可,表示當前CPU主頻。
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include <stdint.h>
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
其它配置及裁剪不細說。
至此,編譯,燒寫即可。不過要記得選擇正確的芯片噢。
鏈接
鏈接:
- 李柱明博客園
- 雅特力官網
- 從中可以下載參考文檔,手冊,芯片包等等資料。
- 雅特力BSP-百度網盤
- 密碼:t3io