硬件简介
ACM32F0X0是上海爱信诺航芯电子科技有限公司研发的面向通用市场、支持多种低功耗模式的一系列通用MCU,采用ARM Cortex-M0系列内核,最高工作频率64MHz,外设接口丰富并延续了公司老牌安全芯片厂商的优势,集成了AES、TRNG等安全模块,细节不在此做详细介绍。
本次移植采用了ACM32F030R8T7型号的开发板,
开发板的介绍与使用方法见官网链接。
环境搭建
目前开发板主要是使用keil工具链,官网链接可以下载该系列芯片的pack包,安装好pack包后,就可以在keil中选择相应的芯片进行开发调试和仿真。IAR和GCC的话,可以进行编译,但是下载程序可以通过官方的提供的编程工具进行。
移植过程
准备工作
首先,得先准备好RT-Thread的代码,后续我们会把BSP包合入到官方的代码中,所以就按官方推荐的办法,先fork官方的库到自己的git仓库中, 然后clone到本地来,
准备好了代码后,就可以按你使用的工具链来进行移植了。不管使用什么工具链,移植的流程大致都是这样的
CPU架构的支持, 由于我们的芯片使用的是arm-cortex m0内核,这个架构的支持别人已经做好了,所以这一步我们不需要做任何的工作,若是使用暂时不支持CPU架构就需要自己去做这些工作(RTT源码libcpu目录下的功能函数开发);
BSP支持,就是具体的MCU的支持并与使用的开发板上资源对应上。
KEIL
首先得建立一个工程,我们可以选择找一个相同的内核的已经做好的BSP目录,复制过来进行改动,比如说我选的是STM32的F0系列的工程。打开工程后如下图所示:
![1.jpg](//file.elecfans.com/web2/M00/7A/67/poYBAGNyCBeAP4KwAAHCtbBTRHU783.jpg)
然后按接下来的顺序做修改:
修改Device类型,在工程的Option中选择设备的类型,我这边型号是Aisinochip->ACM32F0X0 Series -> ACM32F070RBT7, 这边按自己的芯片类型选择即可,如果芯片厂商没有给出pack包,那可以直接选择相应的内核,比如我们也可以选择ARMCM0芯片, 只是需要自行去修改SRAM和Flash的地址和大小。
修改输出的文件名和中间文件目录,按照自己想法修改即可
包含的源文件修改,主要是Libraries文件夹和Drivers文件夹、Libraries是芯片厂商本身的驱动文件,Drivers下是芯片厂商与RTT间适配的文件,我们只使用UART打印输出,使用GPIO点灯,加入这两个模块相关的文件即可,然后修改Drivers下相应的文件,当然, 芯片相应的系统文件(包含启动文件)也要做修改。
源代码修改,主要是Drivers下的文件,这边参考RTT官方文档设备与驱动章节中UART设备与PIN设备内容即可,主要是RTT操作相应设备的API需要使用芯片厂商提供的代码来实现。代码细节的修改不做说明了,需要注意的是尽量按照官方要求的风格来写。
编译通过后,下载bin文件到开发板中查看输出与设想的是否一致即可。
如果前面的步骤正常的完成后,简单的keil工具链的移植已经完成了,但是你肯定看到了,目录下还有一个keil的工程叫template,这个文件是用于生成工程的,比如说我在使用Env工具生成keil工程时,就是使用这些文件生成而来,所以我们还得把这个工程相应的设置给改好,主要是内核的类型和输出文件的名称,你也可以输出的目录做一下整理,修改完成后, 在Env的命令窗口中使用scons —target=mdk5即可以更新keil的工程,该命令只会更新keil工具,并不会实际进行编译。
修改完成后,我的工程如下:
![1.jpg](//file.elecfans.com/web2/M00/7A/F6/pYYBAGNyCDCAO9o4AACbd-oqVwE222.jpg)
由于我这边使用的模版比较老,所以结构上与stm32上稍有区别,我这边顺手也加入了几个容易处理的模块。
IAR
IAR的等方面, 处理也和Keil一致,本文不再赘述。
GCC
我这边GCC的工具链是直接使用的RTT的Env工具下的,下载Env解压即可。Env是使用scons做编译的,这就涉及到一些文件的修改,其实主要还是Libraries这个目录下的SConsript文件的修改,下面是我这边的Libraries目录下的SConsript文件的内容
![1.jpg](//file.elecfans.com/web2/M00/7A/67/poYBAGNyCE-APUCqAAHFLOv2uCo546.jpg)
其实这个文件是一个python脚本文件,脚本的主要工作是把设备对应的启动文件和驱动文件赋值到src变量并合入到’ACM32_HAL’这个组(keil中可以看出效果),把一些需要包含的头文件目录赋值给path变量,值得注意的是,如果是使用Windows进行开发,文件名的大小写是不敏感的,但是官方是使用linux进行编译,此时大小写是敏感的;如果出现了该脚本中的文件名与实际的文件名不匹配的情况,官方的CI测试是通不过的。
修改好了文件后,接下来就是编译,在env工具的命令窗口中输入Scons(Windows下大小写不敏感)命令,就开始了GCC工具链的编译,最终的输出信息如下:
![1.jpg](//file.elecfans.com/web2/M00/7A/F6/pYYBAGNyCGGAErBYAAFPREN1XPs336.jpg)
KConfig
RTT是可以通过KConfig来配置各个模块的功能的,我们的设备的功能也需要做成可以配置的,这时就需要修改KConfig文件。简单来说,KConfig是会把相应的设备在rtconfig.h中生成对应的宏定义。需要修改的就是drivers目录下的KConfig文件,本文件主要目录标是完成最小系统的移植,所以就只对uart的部分做一下说明,下图是我这边的KConfig文件Uart部分的配置:
![1.jpg](//file.elecfans.com/web2/M00/7A/67/poYBAGNyCIOAT_G_AAF7U-CE7XU760.jpg)
![2.jpg](//file.elecfans.com/web2/M00/7A/67/poYBAGNyCIqAH_MbAABRcx7FZOU391.jpg)
主要配置了Uart模块是否打开,相应的RX/TX是否使用DMA功能。我这边做的还不是很完善,其实还可以把RX/TX使用哪个管脚、使用中断模式还是查询模式等都做进去。
文件修改好后,在Env工具的命令窗口中使用menuconfig命令,进入到uart的配置选项后效果如下图:
![1.jpg](//file.elecfans.com/web2/M00/7A/F6/pYYBAGNyCJuAF0QpAACjOTTS1Zo402.jpg)
按上图的KConfig在rtconfig.h中的结构如下图:
![1.jpg](//file.elecfans.com/web2/M00/7A/67/poYBAGNyCLKAOEFWAAB1LKeWvQA794.jpg)
测试验证
由于只做了最小的系统,我们的验证工作很简单,就是把生成好的bin文件下载到开发板中,然后观察是否有串口输出RTT的版本信息,用户LED灯是否按我们设计的模式运行即可。
原作者:ze9hyr