【MCU】移植AT32庫&FreeRTOS教程

李柱明發表於2021-03-26


前言

隨著全球晶圓缺貨,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

方法2

  • 可從 AT 提供的例程裡面獲取。
  • 也可以從 AT 提供的 BSP 包中獲取:
    • 路徑:BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Middlewares

2.2 移植原始碼

先在工程目錄中建立兩個路徑的資料夾,分別用於存放原始檔和標頭檔案:osPRJ\AT32-FreeRTOS\FreeRTOS\srcosPRJ\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.hat32f4xx_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

其它配置及裁剪不細說。


至此,編譯,燒寫即可。不過要記得選擇正確的晶片噢。


連結

連結

相關文章