【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 ...
随机推荐
- how to enable vue cli auto open the localhost url
how to enable vue cli auto open the localhost URL bad you must click the link by manually, waste of ...
- macOS 需要更新软件才能连接到 iOS 设备
macOS 需要更新软件才能连接到 iOS 设备 更新 Mac 上的软件 如果您在 iPhone.iPad 或 iPod touch 上看到"需要更新软件才能连接到 iOS 设备" ...
- css & multi line words & ellipsis
css & multi line words & ellipsis bug .news-card-content-title { width: 100%; height: 0.8rem ...
- PBN进场程序保护区图例分析
疫情仍在持续,除了待家里不给祖国添乱之外,过去没有时间去完成的事情,现在可以静下心来认真面对,充实过好每一天. 今天想跟大家聊一下ICAO 8168第二卷PBN进场程序的图例. 就是下面这张图: ...
- 直播预告 | 全面的审计分析和权限管控——CloudQuery年终发布!
2020年9月,CloudQuery 发布. 针对开发.运维人员面临的如何高效便捷访问.操作管理数据的问题,我们设计并研发了云原生安全数据操作平台,CloudQuery 就此诞生! 2020年结束之际 ...
- [C#] 尝鲜.net6.0的C#代码热重载
看到.NET 6 Preview 1 发布,里面"除了 XAML 热重载之外,还将支持 C# 代码的热重载"一句,觉得有必要试试看,因为XAML热重载功能用起来确实很爽. 首先要下 ...
- vue之v-for遍历下拉框select和单选框组radio-group
1.v-for遍历下拉框 <el-form-item label="审核状态:" prop="status"> <el-select v-mo ...
- Spirng 循环依赖报错:Requested bean is currently in creation: Is there an unresolvable circular reference?
1:前言 最近在项目中遇到了一次循环依赖报错的问题,虽然解决的很快,但是有些不明白的地方,特此记录. 在此我把 bean 的结构和 注入方式单独拎出来进行演示 1.1:报错提示 1.2:错误日志 Ex ...
- Win32API使用技巧 -- 置顶应用
Win32提供了SetForegroundWindow方法可以将应用设置到前台并激活,但是在某些场景下,只调用该接口会返回0,即设置失败.比如如下场景: 当前前台应用为一个全屏的应用,非前台应用的进程 ...
- MarkDown简单语法回顾
写在前面: 本文是我的第一篇博客文章,希望与大家共同交流.分享我们热爱的技术,努力成为一名优秀的软件工程师! 进入正文 使用MarkDown记笔记已经有些时候了,编辑器是使用的sublime text ...