发新帖本帖赏金 200.00元(功能说明)我要提问
返回列表
打印
[APM32E1]

极海国产芯|APM32E103替代stm32F105差异点

[复制链接]
639|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Alden|  楼主 | 2022-10-14 17:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Alden 于 2022-10-14 17:29 编辑

#技术资源# #申请原创#
APM32E103作为极海APM32F103系列的增强版,在保持原有的极好兼容性的基础上增加了双CAN外设,并且主频可以达到120MHz。
相比STM32F105系列,只少了USB OTG功能。因此就想尝试下在ST库的105库的配置上兼容APM32E103。
ST的10x系列划分为103 flash小于等于128K的小容量MD,flash大于128K的大容量HD,以及105、107系列的互联型XL。
这个不仅是对flash大小的区分,三个系列是共用底层库的,在应用时也要在KEIL的宏定义中进行区分配置,宏定义的型号与实际的型号不符,容易出现应用问题。
如图,标准库和Hal库是不同的宏定义。

而APM32E103要兼容105的代码就有了两种方式:
1、更改宏定义改成103的MD或HD,这样库就会变更为103的设置,但这样105就不能使用修改后的代码。
2、了解寄存器的差异,对有差异的地方根据是103还是105进行选择执行,这样可以做到两个型号兼容一套代码。
下面也主要讲讲寄存器方面的差异点。

对比数据手册和用户手册来看,103与105的差异除了外设上105多了CAN2和USB OTG,在时钟配置上也存在差异点。

用户手册中的时钟树可以看到,103与105对外部高速晶振的配置是有差异的。103外部晶振支持3~16Mhz,分频只支持2分频。
105的外部晶振支持3~25Mhz,分频输入支持1~16分频。
而这部分的不同也意味着配置寄存器也存在差异。

在RCC寄存器部分对比可以看到,105的外部时钟分频寄存器在一个新增的RCC_CFGR2寄存器中。
里面也包含了12S3SRC、12S2SRC、PREDIV1SRC、PLL3MUL、PLL2MUL、PREDIV2、PREDIV1
其中PREDIV1就控制着外部时钟的分频输入。
而103的分频输入在RCC_CFGR寄存器的bit17 PLLXTPRE 来控制HSE输入或者HSE二分频输入。
这点差异也可以在代码配置中体现。

测试使用STM32cubleMX生成的105型号代码。
代码的默认配置是外部晶振16Mhz,二分频到8Mh后9倍频到72Mhz主频。


跳转到这个RCC_HSE_PREDIV_DIV2定义中可以看到,105和103采用的是不同的寄存器定义。

考虑到对105的兼容性,可以在下面增加对103的外部时钟二分频配置,直接对RCC_CFGR的BIT17赋值。


这样改了APM32E103和STM32F105都能运行代码,用MCO输出主频测的主频也正确。
但添加USART后发现APM32E103的波特率与配置的不对。
进一步检查代码发现,除了配置时钟有差异,代码获取主频给外设配置波特率的函数也会根据RCC_CFGR2来配置
,导致计算获取的主频与实际主频不对,收影响的函数有。
void SystemCoreClockUpdate (void)和uint32_t HAL_RCC_GetSysClockFreq(void)


分别由105的宏定义和105的RCC_CFGR2寄存器的宏定义,导致103外设获取的主频不对。
将这两个函数拷贝一份,修改为103的正确配置,根据实际使用的是103还是105来选择调用那个。

修改完成后,APM32E103使用105的代码可以正常运行,目前测试未发现其他问题,有兴趣的可以试下。



使用特权

评论回复

打赏榜单

Gfan 打赏了 200.00 元 2022-12-05
理由:恭喜获得极海国产芯悬赏贴活动的“国产芯文撰稿人”称号,感谢您的支持,期待下次的干货分享哦!

沙发
WuKaiLi| | 2022-10-19 09:56 | 只看该作者
好贴,支持一波

使用特权

评论回复
发新帖 本帖赏金 200.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

66

帖子

1

粉丝