STM32F103移植到AT32F403A之MDK(二)

发布时间:2023-10-25  

上一篇我们已经实现了不改硬件,只改软件情况下将STM32F103C8T6替换为AT32F403ACGT7的过程,但毕竟STM32F103C8T6已经是10多年前的东西了,用现在的AT32F403ACGT7替换实在是大材小用了,毕竟这颗是主频能到240M的M4。


上篇我们解决了替换能用的问题,本篇我们来结合AT32F403ACGT7的优势,实现不改硬件只改BOM降成本的方法。


从接触MCU开始,MCU外围电路中就缺少不了很重要的器件,那就晶振,晶振是MCU的时钟源。随着技术的不断发展,越来越多的MCU将晶振集成到了MCU内部,但集成到内部后真的就能够省略掉外部晶振吗,当然不是,由于技术和工艺问题,前些年的MCU还无法完全摆脱外部晶振,而近几年的MCU才算真正能够摆脱外部晶振,STM32F103系列和AT32F403A系列正好代表了这两个阶段的产品。


我们先来看看STM32F103系列内部晶振的参数

4bd82378-9bce-11ed-bfe3-dac502259ad0.png

荡器精度大多数情况下都大于1%,最大时大于了2%,用在串口应用中都觉得不靠谱,更何况是在USB应用当中了,所以,官方文档对使用内部晶振时做了明确的使用说明:

4bf9bb50-9bce-11ed-bfe3-dac502259ad0.png

我们再来看看AT32F403A系列的内部晶振参数

4c23d28c-9bce-11ed-bfe3-dac502259ad0.png


4c23d28c-9bce-11ed-bfe3-dac502259ad0.png

在使用RCC_CTRL寄存器校准情况下,能够达到最大值偏差1%的精度,已经能够满足大多数的精度要求,RCC_CTRL寄存器校准是在系统启动后自动完成的,不需要人为干预,如果想再提到精度,可以再修改相关寄存器,以提高到更高的精度。

4c58b236-9bce-11ed-bfe3-dac502259ad0.png

并且在USB应用中,为保证内部晶振能够满足精度要求,还提供了ACC校准功能,可以提高进度到0.25%。

4c856df8-9bce-11ed-bfe3-dac502259ad0.png


4cb13c4e-9bce-11ed-bfe3-dac502259ad0.png


4cb13c4e-9bce-11ed-bfe3-dac502259ad0.png

在这些校准方式下,AT32F403A系列的内部晶振已经能都替换掉外部晶振了。另外,在省略掉外部晶振后,还能够让芯片多出2个IO脚,在ST32F103系列中,使用内部晶振时空出的2个管脚只能做IO用,没有中断功能,而AT32F403A系列则没有这个限制。

4d16d478-9bce-11ed-bfe3-dac502259ad0.png

接下来,本篇内容的重点就是在使用ST32F103标准库情况下最小的改动实现开启AT32F403A内部晶振,让BOM成本降低,并且增加了性能。在上一篇中我在标准库的系统时钟初始化函数void SystemInit (void)内添加的开启FPU代码。

4d401996-9bce-11ed-bfe3-dac502259ad0.png

同样在这个函数内还有一行代码SetSysClock(),它负责设置系统内的各条总线时钟。STM32这里一般是设置使用外部晶振,总线时钟为72M。

4d607006-9bce-11ed-bfe3-dac502259ad0.png

因为我们要使用内部晶振,所以要将外部晶振相关的宏定义关掉,这里我们只需将#define SYSCLK_FREQ_72MHz 72000000关掉即可。

4d7c037a-9bce-11ed-bfe3-dac502259ad0.png

这样所有和外部晶振相关的时钟配置都将关闭,总线时钟将被配置为内部时钟。

4d95772e-9bce-11ed-bfe3-dac502259ad0.png

因为原来的程序都是建立在总线时钟是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标准库风格)。

4da9695a-9bce-11ed-bfe3-dac502259ad0.png


4dbfe45a-9bce-11ed-bfe3-dac502259ad0.png


4dd902a0-9bce-11ed-bfe3-dac502259ad0.png

将static void SetSysClockTo72MHSI(void)函数,拷贝到现在的代码中(位置根据自己习惯),我放在main函数这里。

4df80a60-9bce-11ed-bfe3-dac502259ad0.png


4df80a60-9bce-11ed-bfe3-dac502259ad0.png

由于缺少宏定义和寄存器名差异问题,会有很多报错,先不管,先将函数内精简一下,只保留我们使用型号的先关定义。

4e2cd39e-9bce-11ed-bfe3-dac502259ad0.png

然后我们对照STM32F103的参考手册和AT32F403A的参考手册中关于RCC寄存器的名称定义,用STM32F103的寄存器名和宏定义替换AT32F403A的寄存器名和宏定义,修改后名称后如下:

4e5e5838-9bce-11ed-bfe3-dac502259ad0.png

依然报错的位置是因为这3个宏是STM32F103库里没有定义的,需要我们重新定义一下,我们可以在AT32F403A的BSP库里找到,拷贝过来就行。

4e82b232-9bce-11ed-bfe3-dac502259ad0.png

接下来我们将SetSysClockTo72MHSI();添加的main函数开始的位置,也就是实现了原来void SystemInit (void)内SetSysClock();的工作。

4ea95b4e-9bce-11ed-bfe3-dac502259ad0.png


4ea95b4e-9bce-11ed-bfe3-dac502259ad0.png

重新编译,没有错误。

4ece4cf6-9bce-11ed-bfe3-dac502259ad0.png

至此,使用AT32F403A内部晶振替换原STM32F103外部晶振的配置就完成了,省去了外部晶振和电容,增加了2个能实现中断的管脚,实现了通过修改BOM降低层本增加性能的目的。

注意:在这种配置下,多数外设模块是能够正常工作的,但部分外设会有问题,我会再后面的文章中继续为大家分享相关的问题。


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

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>