上一篇我们已经实现了不改硬件,只改软件情况下将STM32F103C8T6替换为AT32F403ACGT7的过程,但毕竟STM32F103C8T6已经是10多年前的东西了,用现在的AT32F403ACGT7替换实在是大材小用了,毕竟这颗是主频能到240M的M4。
上篇我们解决了替换能用的问题,本篇我们来结合AT32F403ACGT7的优势,实现不改硬件只改BOM降成本的方法。
从接触MCU开始,MCU外围电路中就缺少不了很重要的器件,那就晶振,晶振是MCU的时钟源。随着技术的不断发展,越来越多的MCU将晶振集成到了MCU内部,但集成到内部后真的就能够省略掉外部晶振吗,当然不是,由于技术和工艺问题,前些年的MCU还无法完全摆脱外部晶振,而近几年的MCU才算真正能够摆脱外部晶振,STM32F103系列和AT32F403A系列正好代表了这两个阶段的产品。
我们先来看看STM32F103系列内部晶振的参数
荡器精度大多数情况下都大于1%,最大时大于了2%,用在串口应用中都觉得不靠谱,更何况是在USB应用当中了,所以,官方文档对使用内部晶振时做了明确的使用说明:
我们再来看看AT32F403A系列的内部晶振参数
在使用RCC_CTRL寄存器校准情况下,能够达到最大值偏差1%的精度,已经能够满足大多数的精度要求,RCC_CTRL寄存器校准是在系统启动后自动完成的,不需要人为干预,如果想再提到精度,可以再修改相关寄存器,以提高到更高的精度。
并且在USB应用中,为保证内部晶振能够满足精度要求,还提供了ACC校准功能,可以提高进度到0.25%。
在这些校准方式下,AT32F403A系列的内部晶振已经能都替换掉外部晶振了。另外,在省略掉外部晶振后,还能够让芯片多出2个IO脚,在ST32F103系列中,使用内部晶振时空出的2个管脚只能做IO用,没有中断功能,而AT32F403A系列则没有这个限制。
接下来,本篇内容的重点就是在使用ST32F103标准库情况下最小的改动实现开启AT32F403A内部晶振,让BOM成本降低,并且增加了性能。在上一篇中我在标准库的系统时钟初始化函数void SystemInit (void)内添加的开启FPU代码。
同样在这个函数内还有一行代码SetSysClock(),它负责设置系统内的各条总线时钟。STM32这里一般是设置使用外部晶振,总线时钟为72M。
因为我们要使用内部晶振,所以要将外部晶振相关的宏定义关掉,这里我们只需将#define SYSCLK_FREQ_72MHz 72000000关掉即可。
这样所有和外部晶振相关的时钟配置都将关闭,总线时钟将被配置为内部时钟。
因为原来的程序都是建立在总线时钟是72M情况下的,我们需要使用内部晶振重新创建各个总线的时钟与原程序的总线时钟一致,才能保证系统能够正常运行。
我们在AT32F402A系列的BSP的system_at32f4xx.c文件内找到#define SYSCLK_FREQ_72MHz_HSI 72000000所对应的函数,这个函数内实现了再使用内部晶振情况下,配置总线为72M的操作(注意,BSP要用1.xx版本的,2.xx版本的库风格改变了,不再兼容STM32标准库风格)。
因为原来的程序都是建立在总线时钟是72M情况下的,我们需要使用内部晶振重新创建各个总线的时钟与原程序的总线时钟一致,才能保证系统能够正常运行。
我们在AT32F402A系列的BSP的system_at32f4xx.c文件内找到#define SYSCLK_FREQ_72MHz_HSI 72000000所对应的函数,这个函数内实现了再使用内部晶振情况下,配置总线为72M的操作(注意,BSP要用1.xx版本的,2.xx版本的库风格改变了,不再兼容STM32标准库风格)。
将static void SetSysClockTo72MHSI(void)函数,拷贝到现在的代码中(位置根据自己习惯),我放在main函数这里。
由于缺少宏定义和寄存器名差异问题,会有很多报错,先不管,先将函数内精简一下,只保留我们使用型号的先关定义。
然后我们对照STM32F103的参考手册和AT32F403A的参考手册中关于RCC寄存器的名称定义,用STM32F103的寄存器名和宏定义替换AT32F403A的寄存器名和宏定义,修改后名称后如下:
依然报错的位置是因为这3个宏是STM32F103库里没有定义的,需要我们重新定义一下,我们可以在AT32F403A的BSP库里找到,拷贝过来就行。
接下来我们将SetSysClockTo72MHSI();添加的main函数开始的位置,也就是实现了原来void SystemInit (void)内SetSysClock();的工作。
重新编译,没有错误。
至此,使用AT32F403A内部晶振替换原STM32F103外部晶振的配置就完成了,省去了外部晶振和电容,增加了2个能实现中断的管脚,实现了通过修改BOM降低层本增加性能的目的。
注意:在这种配置下,多数外设模块是能够正常工作的,但部分外设会有问题,我会再后面的文章中继续为大家分享相关的问题。