zoukankan      html  css  js  c++  java
  • 【MCU】移植AT32库&FreeRTOS教程


    前言

    随着全球晶圆缺货,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 文件源码路径:BSPAT32F4xx_StdPeriph_Lib_V1.2.9LibrariesCMSISCM4CoreSupport

    1.2 移植芯片型号相关文件

    • 启动文件,先删除本地的启动文件

    • 把AT32的启动文件一通拉过来对应位置。可以只拉需要的启动文件,如 startup_at32f403avct7.s 文件。

      • AT 启动文件源码路径: BSPAT32F4xx_StdPeriph_Lib_V1.2.9LibrariesCMSISCM4DeviceSupportstartupmdk
      • 启动文件的选择可以参考文档 《AT32F4xx标准库BSP&Pack应用指南.pdf》中的 2.2 BSP使用方法
    • 芯片配置文件,先删除本地STM32的芯片配置文件

    • 把 AT 的芯片配置文件拷贝进来

      • AT 芯片配置文件源码路径:BSPAT32F4xx_StdPeriph_Lib_V1.2.9LibrariesCMSISCM4DeviceSupport

    1.3 移植芯片外设驱动库

    • 删除STM32的外设驱动库

    • 把 AT 的外设驱动库拷贝进来

      • AT 外设驱动库源码路径:BSPAT32F4xx_StdPeriph_Lib_V1.2.9Libraries

    1.4 移植配置文件及中断回调函数文件

    • 删除 STM32 配置文件及中断回调函数专用文件。

    • 添加 AT32 配置文件及中断回调函数专用文件。

    2. 移植FreeRTOS源码

    注意,就算是在STM32&FreeRTOS工程的基础上移植,也要修改FreeRTOS文件,因为内核不一样,一个是CM3,一个是CM4F。

    因为移植比较简单,所以以下教程是从 零 移植。如果工程中已有 FreeRTOS 框架,则只需要替换即可。

    2.1 获取 FreeRTOS 源码

    方法1

    方法2

    • 可从 AT 提供的例程里面获取。
    • 也可以从 AT 提供的 BSP 包中获取:
      • 路径:BSPAT32F4xx_StdPeriph_Lib_V1.2.9Middlewares

    2.2 移植源码

    先在工程目录中创建两个路径的文件夹,分别用于存放源文件和头文件:osPRJAT32-FreeRTOSFreeRTOSsrcosPRJAT32-FreeRTOSFreeRTOSinc

    2.2.1 Source 文件夹

    • 下图红框中为 FreeRTOS 通用源文件和头文件,都移植到工程FreeRTOS对应文件夹下

      • 这两部分的文件试用于各种编译器和处理器,是通用的。

    • 添加内核接口文件,移植到工程FreeRTOS对应文件夹下

      • portblle 文件夹里面很多与编译器相关的文件夹,在不同的编译器中使用不同的支持文件。
      • 内核接口文件路径:FreeRTOSSourceportableRVDSARM_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
    

    其它配置及裁剪不细说。


    至此,编译,烧写即可。不过要记得选择正确的芯片噢。


    链接

    链接

  • 相关阅读:
    [Noip2010]乌龟棋
    vijos次小生成树
    hdu3579-Hello Kiki-(扩展欧几里得定理+中国剩余定理)
    hdu1573-X问题-(扩展欧几里得定理+中国剩余定理)
    poj2115-Looooops-(扩展欧几里得定理)
    hdu2669-Romantic-(扩展欧几里得定理)
    poj1061-青蛙的约会-(贝祖定理+扩展欧几里得定理+同余定理)
    hdu1576-A/B-(同余定理+乘法逆元+费马小定理+快速幂)
    hdu4497-GCD and LCM-(欧拉筛+唯一分解定理+组合数)
    hdu3189-Just Do It-(埃氏筛+唯一分解定理)
  • 原文地址:https://www.cnblogs.com/lizhuming/p/14581761.html
Copyright © 2011-2022 走看看