跳转到主要内容

【MCU】移植AT32库&FreeRTOS教程

cathy 提交于

<strong>前言</strong>

随着全球晶圆缺货,ST疯狂涨价,也是时候把目光放到国产 MCU 上啦,感觉还不错,看 datasheet 的的数据来分析,性价比高,性能强。至于稳定性嘛,我没有长时间老化和细节地测试过,不做评论。

<p><strong>建议</strong>:</p>
<ul>
<li>
<p>如果不想重新构建新的 AT 工程,就在你ST产品的工程上修改即可,主要替换ST库(<em>与AT库几乎是只有命名的区别</em>)、启动文件、内核文件、全局宏、freeRTOS中的主频设置等等。</p>
</li>
<li>
<p>替换ST库时,注意命名即可,可以参考AT提供的例程来配置你的硬件IO。</p>
</li>
</ul>
<p><strong>说明</strong>:</p>
<ul>
<li>由于新建工程和替换ST都差不多,所以不分开细说。</li>
<li>以下由ST工程转到AT工程。</li>
<li>由 <strong>STM32F103VCT6</strong> 转到 <strong>AT32F403AVCT7</strong>。</li>
</ul>

<strong>1. 移植AT库</strong>

AT 提供了一套完整的 BSP&Pack 用于开发(百度网盘链接中可找到)。

主要包括 at32f4xx 外 设 驱 动 库 、 内 核 相 关 文 件 、 完 整 的 应 用 例 程 以 及 能 够 支 持 Keil_v5 、 Keil_v4 、 IAR_v6 和 IAR_v7、IAR_v8等多种开发环境的 Pack 文件。

<strong><font color="#004a85">1.1 移植内核相关文件</font> </strong>

AT32F403AVCT7 内核为 Cortex ® -M4F。

● 删除 CM3 内核文件

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127588-1.png&quot; alt=“” ></center>

● 把 CM4 内核文件拷贝进来

CM4 文件源码路径:BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\CoreSupport

<strong><font color="#004a85">1.2 移植芯片型号相关文件</font> </strong>

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

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127589-2.png&quot; alt=“” ></center>

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

<ul>
<li>AT 启动文件源码路径: <strong>BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\DeviceSupport\startup\mdk</strong></li>
<li>启动文件的选择可以参考文档 《<strong>AT32F4xx标准库BSP&amp;Pack应用指南.pdf</strong>》中的 <strong>2.2 BSP使用方法</strong>。</li>
</ul>

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127590-3.png&quot; alt=“”></center>

● 芯片配置文件,先删除本地STM32的芯片配置文件

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127591-4.png&quot; alt=“” ></center>

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

AT 芯片配置文件源码路径:BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\DeviceSupport

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127592-5.png&quot; alt=“”></center>

<strong><font color="#004a85">1.3 移植芯片外设驱动库</font> </strong>

● 删除STM32的外设驱动库

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127593-6.png&quot; alt=“”></center>

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

AT 外设驱动库源码路径:BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127594-7.png&quot; alt=“”></center>

<strong><font color="#004a85">1.4 移植配置文件及中断回调函数文件</font> </strong>

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

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127595-8.png&quot; alt=“”></center>

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

<strong>2. 移植FreeRTOS源码</strong>

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

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

<strong><font color="#004a85">2.1 获取 FreeRTOS 源码</font> </strong>

方法1:

● FreeRTOS官网:http://www.freertos.org/

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127596-9.png&quot; alt=“” ></center>

具体下载步骤不在此阐述。

方法2:

<ul>
<li>可从 AT 提供的例程里面获取。</li>
<li>也可以从 AT 提供的 BSP 包中获取:
<ul>
<li>路径:<strong>BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Middlewares</strong>。</li>
</ul>
</li>
</ul>

<strong><font color="#004a85">2.2 移植源码</font> </strong>

先在工程目录中创建两个路径的文件夹,分别用于存放源文件和头文件:osPRJ\AT32-FreeRTOS\FreeRTOS\src 和 osPRJ\AT32-FreeRTOS\FreeRTOS\inc。

2.2.1 Source 文件夹

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

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

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127597-10.png&quot; alt=“”></center>
<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127598-11.png&quot; alt=“”></center>

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

<ul>
<li>portblle 文件夹里面很多与编译器相关的文件夹,在不同的编译器中使用不同的支持文件。</li>
<li>内核接口文件路径:<strong>FreeRTOS\Source\portable\RVDS\ARM_CM4F</strong></li>
<li>文件里面的内容是由 FreeRTOS 官方的技术人员为 Cortex-M4F 内核的处理器写的接口文件,里面核心的上下文切换代码是由汇编语言编写而成。</li>
</ul>

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127599-12.png&quot; alt=“”></center>

● 添加内存管理文件,移植到工程FreeRTOS对应文件夹下(本工程使用 heap4.c)

MemMang 文件夹下面存放着与内存管理相关的文件。

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127600-13.png&quot; alt=“”></center>

最后,拷贝 FreeRTOSConfig.h 文件到 user 文件夹,即是和 main.c 一起即可(可自由存放)。

<ul>
<li>
<p>FreeRTOSConfig.h 文件是 FreeRTOS 的工程配置文件。</p>
</li>
<li>
<p>主要用于配置和裁剪 FreeRTOS 内核。</p>
</li>
<li>
<p>可以先找 STM32 demo 的配置文件:</p>

<li><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127601-14.png&quot; alt=“”></li>

</li>
<li>
<p>或者去 AT 提供的 FreeRTOS 工程中拷贝一个 FreeRTOSConfig.h 文件即可。二选一,反正都要配置的。</p>
</li>
</ul>

至此,文件移植完毕。进入修改工程。

<strong>3. 修改工程</strong>

<strong><font color="#004a85">3.1 工程配置</font> </strong>

3.1.1 修改全局宏

根据芯片型号设置不同的全局宏,可以参考官方例程或文档 《AT32F4xx标准库BSP&Pack应用指南.pdf》中的 2.2 BSP使用方法。

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127602-15.png&quot; alt=“”></center>

3.1.2 添加工程文件

移除所有前面移植文件时删除的文件

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127603-16.png&quot; alt=“”></center>

<ul>
<li>
<p>添加内核配置文件:<strong>system_at32f4xx.c</strong>。</p>
</li>
<li>
<p>添加启动文件:<strong>startup_at32f403avct7.s</strong>。</p>
</li>
<li>
<p>添加外设驱动库文件,即是文件夹 <strong>AT32F4xx_StdPeriph_Driver</strong> 下的所有 <strong>.c</strong> 文件。</p>
</li>
<li>
<p>添加 FreeRTOS 源码通用源文件。(<em>若原工程已有,可省略该步骤</em>)</p>
</li>
<li>
<p>添加 FreeRTOS 源码接口文件:<strong>port.c</strong>。(<em>若原工程已有,可省略该步骤</em>)</p>
</li>
<li>
<p>添加 FreeRTOS 源码内存管理文件文件:<strong>heap_4.c</strong>。(<em>若原工程已有,可省略该步骤</em>)</p>
</li>
<li>
<p>添加 AT32 配置文件、中断回调函数专用文件:<strong>at32f4xx_conf.h</strong>、<strong>at32f4xx_it.c</strong>。</p>
</li>
<li>
<p>布局效果图:</p>
</li>
</ul>

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127604-17.png&quot; alt=“”></center>
<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127605-18.png&quot; alt=“”></center>

3.1.3 添加头文件路径

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127606-19.png&quot; alt=“” ></center>

<strong><font color="#004a85">3.2 根据 AT 库修改代码</font> </strong>

修改 System_at32f4xx.c 文件内容:

<ul>
<li><strong>System_at32f4xx.c</strong> 里面包含了系统时钟初始化内容,原生文件里可能没有配置主频,所以下面怕配置主频为240MHz**。</li>
<li>打开 <strong>#define SYSCLK_FREQ_240MHz 240000000</strong> 即可。(<em>若想配置为其它的主频,打开其一即可。</em>)</li>
</ul>

<pre style="overflow-x:auto; background-color:#e9e9e9;">#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</pre>

头文件:

<pre style="overflow-x:auto; background-color:#e9e9e9;">#include "stm32f10x.h"
// 修改为
#include "at32f4xx.h"</pre>

初始化结构体名称:

● GPIO_Type,如
<pre style="overflow-x:auto; background-color:#e9e9e9;">GPIO_TypeDef* gpio_port;
//修改为
GPIO_Type* gpio_port;</pre>

● 其它 SPI_Type 等等也如此类推。

初始化结构体成员:

<pre style="overflow-x:auto; background-color:#e9e9e9;">GPIO_Speed_50MHz
// 修改为
GPIO_MaxSpeed_50MHz</pre>

● 其它报错的成员也可以跳到该结构体定义处,找出对应成员名,替换即可。

引脚号:

● GPIO_Pins_1,如:

<pre style="overflow-x:auto; background-color:#e9e9e9;">GPIO_Pin_1
// 修改为
GPIO_Pins_1</pre>

● 还有引脚高低电平的配置也要修改:

<pre style="overflow-x:auto; background-color:#e9e9e9;">#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;} //输出低电平</pre>

时钟宏:

● RCC_APB2PERIPH_GPIOA,如

<pre style="overflow-x:auto; background-color:#e9e9e9;">RCC_APB2Periph_GPIOA
// 修改为
RCC_APB2PERIPH_GPIOA</pre>

● 其它 RCC_APB1PERIPH_USART2 等等也如此类推。

串口及DMA:

● 一些函数名和参数宏名等等,如:

<pre style="overflow-x:auto; background-color:#e9e9e9;">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);</pre>

好啦好啦,其它报错的名称替换就自行继续吧。毕竟就只是替换而已。

不过还是要注意,定时器不是简单的改名字,还可能要该第几个定时器。有空出一个 AT 的定时器配置教程。

修改后,编译无误

<center><img src="http://mcu.eetrend.com/files/2021-03/博客/100063613-127607-20.png&quot; alt=“”></center>

<strong>3.3 裁剪FreeRTOS内核</strong>

裁剪内核,修改 FreeRTOSConfig.h 文件即可。

把 configCPU_CLOCK_HZ 宏配置为 SystemCoreClock即可,表示当前CPU主频。

<pre style="overflow-x:auto; background-color:#e9e9e9;">#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include &lt;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</pre>

其它配置及裁剪不细说。

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

<p><strong>链接</strong>:</p>
<ul>
<li><a href="https://www.cnblogs.com/lizhuming/p/14581761.html&quot; target="_blank">李柱明博客园</a></li>
<li><a href="https://www.arterytek.com/cn/index.jsp&quot; target="_blank">雅特力官网</a>
<ul>
<li>从中可以下载参考文档,手册,芯片包等等资料。</li>
</ul>
</li>
<li><a href="https://pan.baidu.com/s/1BQQz91QhJcyPF-mLMIsPJw&quot; target="_blank">雅特力BSP-百度网盘</a>
<ul>
<li>密码:t3io</li>
</ul>
</li>
</ul>

本文作者:李柱明
本文链接:https://www.cnblogs.com/lizhuming/p/14581761.html
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

<IFRAME SRC="https://ad.doubleclick.net/ddm/adi/N30602.285809EETREND/B22225499.29119…${GDPR};gdpr_consent=${GDPR_CONSENT_755}?" WIDTH=100% HEIGHT=200 MARGINWIDTH=0 MARGINHEIGHT=0 HSPACE=0 VSPACE=0 FRAMEBORDER=0 SCROLLING=no BORDERCOLOR='#000000'>
<SCRIPT language='JavaScript1.1' SRC="https://ad.doubleclick.net/ddm/adj/N30602.285809EETREND/B22225499.29119…${GDPR};gdpr_consent=${GDPR_CONSENT_755}?">
</SCRIPT>
</IFRAME>