【MCU】移植AT32库&FreeRTOS教程
前言
建议:
如果不想重新构建新的 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官网:http://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
【MCU】移植AT32库&FreeRTOS教程的更多相关文章
- zedboard上移植OPENCV库
zedboard上移植OPENCV库 之前做了很多移植OPENCV库的工作,但是需要包含的各种库,需要交叉编译,X264 ,JPGE ,FFMPGE等等 注意:在<嵌入式系统软硬件协同设计实战指 ...
- Altium Designer 6三维元件库建模教程
一.AD6.9 PCB编辑环境下如何使用STEP模型的方法. 在PCB 封装库中添加对应的3D模型,然后选择update pcb 即可 方法:在PCB library 页面,点击place -- 3d ...
- Alamofire网络库进阶教程
本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Intermediate Alamofire Tutorial,敬请勘误. 欢迎回到我们的 Alamofire ...
- 一点理解之 CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库
@2019-02-14 [小记] CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库,用来将单片机故障状态寄存器值翻译出来输出至终端上以便排错 CmBacktrace: AR ...
- Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程
Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程 一:前言 最近手上压了一块米联客的Miz7035,一块xilinx zynq-7000系列的开发板,想着正好学习一下linu ...
- 移植tslib库出现selected device is not a touchscreen I understand的解决方法
首发平台:微信公众号baiwenkeji 很多人在做触摸屏驱动实验,移植tslib库时,可能会出现错误提示“selected device is not a touchscreen I underst ...
- Numpy库进阶教程(一)求解线性方程组
前言 Numpy是一个很强大的python科学计算库.为了机器学习的须要.想深入研究一下Numpy库的使用方法.用这个系列的博客.记录下我的学习过程. 系列: Numpy库进阶教程(二) 正在持续更新 ...
- Python 数据处理库pandas教程(最后附上pandas_datareader使用实例)
0 简单介绍 pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程. pandas提供了快速,灵活和富有 ...
- Python 机器学习库 NumPy 教程
0 Numpy简单介绍 Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy.matplotlib一起使用.其实,list已经提供了类似于矩阵的表示形式,不过numpy ...
随机推荐
- OpenCV3.2+Python3.5+Ubuntu16.04+缺少boostdesc和vgg_generated
问题: OpenCV3.2在cmake通过https无法获取boostdesc和vgg_generated2类文件 可尝试的解决方法: 参考, 依其方法至这里做调整, 最后注释xfeatures2d/ ...
- Tensorflow+InternalError: Blas GEMM launch failed
[参考1:]https://stackoverflow.com/questions/37337728/tensorflow-internalerror-blas-sgemm-launch-failed ...
- Virtualbox 安装centos7虚拟机
Virtualbox 安装centos7虚拟机 一,下载centos7 下载地址:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x ...
- 最新 Markdown for GitHub教程
Markdown 教程 Markdown 是什么? Markdown 是一种方便记忆.书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档:譬如您正在阅读的这份文档. 它 ...
- Open Collective
Open Collective Open Collective is an online funding platform for open and transparent communities. ...
- js 动态构建style
使用创建style的方式 btn.addEventListener("click", async () => { const ns = document.createElem ...
- 可视化埋点 & XPath
可视化埋点 & XPath https://www.w3.org/TR/xpath-full-text-30/ 数据的准确性 采集时机 数据发送策略 full XPath demo XML & ...
- windwos创建和删除服务
创建 >sc create <service name> type=kernel binpath="C:\hsys.sys" 删除 win+r 输出 regedi ...
- 1月22日第二轮空投来袭,SPC算力福利币究竟能带来什么?
行情数据显示,比特币于14日23时30分再次突破40000美元,市值回升至7400亿美元.根据行情频道数据,比特币于14日2时展露上行态势,价格于34000美元附近起跳,至12时站上37000美元.此 ...
- SPC空投搅动市场,NGK算力持有者或成大赢家!
要说公链3.0的顶级代表是谁,恐怕非NGK公链莫属.NGK公链自诞生以来,便在区块链市场掀起了一波又一波热潮,并不断地打造着属于自己独有的生态体系.从NGK公链到Baccarat,再到呼叫河马,几乎每 ...










