AT32F415移植FreeRTOS
为什么要使用AT32F415呢?
无意中发现一块电路板上使用的是AT32F415。。。很是好奇这是什么CPU???在网上查了下发现性价比很不错。之前用过GD32F303做产品。下面把AT32F415与GD32F303做个简单的对比。
1、列表参数对比如下图
从上图对比看来,两款MCU在Flash相同,封闭相同的前提下,AT32F415的SRAM为32K,最高主频150M,GD32F303的SRAM为48K最高主频120M。其它基本相同。+
2、MCU引脚分布对比
从上图对比可以看出,AT32F415RCxx较GD32F303RCxx少了两组供电,也就是说多了4个I/0。在SRAM够用的情况下AT32F415RCxx完全可以做为GD32F303RCxx的替代。。。。备胎!!
对于研发人员、以及产品来说最大的诱惑就是性价比!性价比!性价比!重要的事情说三遍!!!所以在其它的项目上试用了AT32F415。
AT32F415的应用
既然要使用AT32F415了那么要对开发环境等资源了解一下,不查不知道一查发现AT32F415的资料挺多的,公司官网上的资料很全面。可以放心的使用了。下面列出部分开发相关资料:
- AT32F415 雅特力官网 https://www.arterytek.com/cn 这在里可以找到你想要的东东。
- AT32 MCU图形化配置软件【AT32_Work_Bench】,可以生成初始化C代码。这个工具不错,类似ST的CubeMx;
ST的CubeMx内有FreeRTOS,完成相关配置可以一并生成代码。AT32_Work_Bench内FreeRTOS,这样就需要手动来完成移植了。
AT32 MCU图形化配置软件【AT32_Work_Bench】很好上手。
AT32 Work Bench生成测试程序低层代码
1、打开AT32 Work Bench软件,先择要用的MCU型号。然后点击【新建】。
2、选择外部时钟
3、配置时钟树 设置为120M
4、配置调试口为SWD
5、配置ADC
ADC开启DMA模式
ADC_DMA NVIC设置
6、配置CAN
CAN NVIC设置
7、配置TMR3
TM3 NVIC设置
8、配置USART1
USART1 设置NVIC
9、配置USART2
USART2 DMA设置
USART2 NVIC设置
10、NVIC配置
将外设 抢占优先级 都设置为5,是为了FreeRTOS管理AT32F415的中断,如果AT32F415的中断优先级超出FreeRTOS管理范围程序在长时间运行时有可能会出现假死现象。之前发过https://blog.youkuaiyun.com/qq_35830231/article/details/125871280#comments_31177263这个帖子。
11、生成代码
配置完成后 点击【确定】生成代码。
FreeRTOS移植到AT32F415
之前一直使用FreeRTOS已经习惯使用操作系统做程序了。所以着手将FreeRTOS移植到AT32F415。
1、点击 【打开文件夹】
在MDK_V5中打开工程
点击 编译后,没有错误、告警。生成代码没有问题。下面准备移植FreeRTOS。
2、FreeRTOS移植
a、先在网上下个FreeRTOS包。
在生成代码的文件夹下新建FreeRTOS文件夹。
b、在新建的FreeRTOS文件夹中拷贝FreeRTOS包中的include、portable、source三件文件
include文件内容如下:
portable文件内容如下:
多的文件都删除。
source文件内容如下:
c、在MDK工程中新建两个Group
一个是FreeRTOS/source、一个是FreeRTOS/portable
FreeRTOS/source、FreeRTOS/portable两个文件添加下图中文件。
编译后会出现一个问题。
仔细阅读AT32F415手册发现 AT32F415没有浮点运算单元 (FPU)。这可以就是AT32F415性价比高的原因。之前使用过的GD32F303是有浮点运算单元 (FPU)的。
所以不能使用ARM_CM4F中的port.c。要使用…\FreeRTOS\portable\RVDS\ARM_CM3\port.c
再次编译程序
发现有两个错误
将at32f415_int.c中这两个函数屏蔽
再次编译程序 没有错误了。
下面建立两个任务测试下。
增加一个运行灯RUNLED测试任务使用
创建两个任务
FreeRTOSConfig.h配置文件修改
修改系统时钟
修改中断管理范围
分别屏蔽两个任务中的LED灯,烧录程序,两个任务可以正常运行。
AT32F415应用过程序中遇到问题
项目中增加了Boot更新程序功能,在做BOOT工程时对2路ADC进行了初始化。用户程序中对也2路ADC进行了初始化。ADC使用DMA模式。结果发现每次上后2路ADC的转换结果不对,有时会发生1、2通道的转换结果发生了互换。也就是2通道的结果到1通过了,1通道的结果到2通道了。
最终发现是ADC多次初始化引起的,将BOOT工程中的ADC初始化屏蔽。一切就正常了。
以上是我对AT32F415应用的理解,请大家多多指教!!多谢!希望我的分享对你有所帮助!!!