STM32F103移植到AT32F403A之MDK(三)

2024-03-25  

在篇2当中,我们已经实现了使用内部晶振使主频达到72M,使各总线时钟也达到了和使用外部晶振一样的频率。


但部分模块在使用STM32标准库时还是会有些问题,本篇就针对常用的外设遇到的问题予以说明并解决。


首先,串口是我们最常用的外设,在使用内部晶振使各总线与使用外部晶振达到一样的频率时,使用串口时会存在数据收发乱码的问题。


我们来分析一下问题点,因为串口在使用外部晶振时,都是正常的,说明串口配置是没错的。再改为使用内部时钟后就出现串口异常问题,那问题一定来自时钟这块的问题,我们通过代码仿真看一下。在串口初始化过程中有和时钟相关的操作,在void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)函数中。

ec37d23e-a563-11ed-bfe3-dac502259ad0.pngec558964-a563-11ed-bfe3-dac502259ad0.pngec8a200c-a563-11ed-bfe3-dac502259ad0.png

通过仿真看一下RCC_ClocksStatus中各总线的时钟值,发现总线时钟都不对

eca8a130-a563-11ed-bfe3-dac502259ad0.png

经过对RCC_GetClocksFreq(&RCC_ClocksStatus)函数的分析发现,获取的倍频系数竟然是3,这是怎么回事?

ecc41d66-a563-11ed-bfe3-dac502259ad0.png

通过看AT32F403A的用户手册发现,PLL倍频系数是两部分组成的,我们在总线时钟初始化时使用的是倍频18倍,正好两部分都用到的,而ST的库在取值时只取了其中的一部分,导致倍频系数在计算时出现了错误。

ecdd8030-a563-11ed-bfe3-dac502259ad0.pngecfde730-a563-11ed-bfe3-dac502259ad0.png

好了,现在问题的原因找到了,我们该怎么解决呢?

有两种方式解决,第一种是改宏定义,使CFGR_PLLMull_Mask能够完整的取到正确的倍频系数(本人没有采用这种方式,因为倍频系数不连续,处理起来比较麻烦,而且容易出现其他调用问题)。

ed54a75a-a563-11ed-bfe3-dac502259ad0.pnged83783c-a563-11ed-bfe3-dac502259ad0.png

第二种是,不改宏,而是改串口初始化函数,因为获取各总线频率后用来计算波特率,我们人为将用到的总线频率改成正确的值就行了,我是这么改的。

edc6b7aa-a563-11ed-bfe3-dac502259ad0.png

通过修改此处,串口通信恢复正常。串口问题就此解决。

注意:其他外设如果也有通过获取总线时钟用于计算的,都要注意这个问题!!!

接着我们要处理个很容易忽略的问题,那就是FLASH问题,这里要说的不是厂家手册里说过的零等待啊,FLASH延时等问题。而是页大小问题,这个问题不是在所以的AT32F403A替换STM32F103系列都会遇到的问题。

我们先来看看STM32F103系列FLASH页大小的定义。

edfa79b4-a563-11ed-bfe3-dac502259ad0.png   

我们再来看看AT32F403A系列FLASH页大小的定义。

ee305e58-a563-11ed-bfe3-dac502259ad0.png

在使用AT32F403A替换STM32F103系列小容量和中容量时,由于页大小定义不同,在进行FLASH操作时要注意页大小问题,此问题多会出现在IAP,或将FLASH用于存储数据时会出现问题,而STM32F103大容量和互联型者不会有问题。

至此,我在使用AT32F403A替换STM32F103过程中遇到的问题就都介绍完了


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。