本帖最后由 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的代码可以正常运行,目前测试未发现其他问题,有兴趣的可以试下。
|