0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F103移植到AT32F403A之MDK(二)

创易栈 来源:创易栈 2023-01-29 15:09 次阅读

上一篇我们已经实现了不改硬件,只改软件情况下将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降低层本增加性能的目的。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16016

    浏览量

    343620
  • STM32F103
    +关注

    关注

    33

    文章

    474

    浏览量

    62573
  • MDK
    MDK
    +关注

    关注

    4

    文章

    208

    浏览量

    31770

原文标题:STM32F103移植到AT32F403A之MDK(二)

文章出处:【微信号:创易栈,微信公众号:创易栈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32F407的程序移植STM32F103的芯片上面,需要修改哪些内容?

    STM32F407的程序移植STM32F103的芯片上面,需要修改哪些内容?
    发表于 04-10 07:38

    如何把stm32F103程序移植stm32g030k6t6上?

    怎么把stm32F103程序移植stm32g030k6t6上
    发表于 04-03 07:57

    STM32F103VE搭建的PWM输入捕获功能,移植STM32F103VD无法捕获的原因?

    利用STM32F103VE芯片搭建的PWM输入捕获功能,移植STM32F103VD的时候,无法捕获。主要存在的问题:进入不了中断服务函数(利用ST
    发表于 03-20 08:21

    STM32F103如何使用BOOT下载程序?

    STM32F103如何使用BOOT下载程序
    发表于 03-15 07:21

    AT32F403A/407 GPIO应用说明

    AT32F403A/407 GPIO Application NoteAT32F403A/407xx的通用功能I/O (GPIO)提供了一系列与外部环境通讯的接口,可用于MCU与其他嵌入式设备之间
    发表于 10-25 08:06

    AT32F403A/407 ADC使用指南

    AT32F403A/407 ADC使用指南本文主要以ADC 的特色功能进行讲解和案列解析。
    发表于 10-25 06:31

    AT32F403A/407时钟配置

    AT32F403A/407时钟配置主要介绍两部分内容:1、基于雅特力提供的V2.x.x 的板级支持包来进行时钟源码的配置及修改2、如何使用配套的时钟配置工具来进行时钟路径及参数的设定,生成相应的时钟流程代码并使用。
    发表于 10-25 06:24

    AT32F403A/407系列安全库区的应用原理、软件使用方法及范例程序

    AT32F403A/407 Security Library Application Note主要在阐述AT32F403A/407系列安全库区的应用原理、软件使用方法及范例程序。
    发表于 10-24 07:29

    AT32F403A & AT32F407入门使用指南

    AT32F403A & AT32F407入门使用指南旨在让用户快速使用AT32F403Axx /AT32F407xx 进行项目开发,AT32
    发表于 10-24 06:43

    AT32F413/AT32F415/AT32F403A/AT32F407引脚复用说明

    AT32F413/AT32F415/AT32F403A/AT32F407引脚复用说明AT32F413/AT32
    发表于 10-20 06:19

    AT32F403A IO模拟I2C与从机通信

    AT32F403A IO模拟I2C与从机通信演示AT32F403A IO模拟I2C与从机通信。
    发表于 10-19 07:39

    AT32F403A硬件I2C与从机通信

    AT32F403A硬件I2C与从机通信演示AT32F403A硬件I2C与从机通信。
    发表于 10-19 06:39

    FreeRTOS移植STM32F103步骤与注意事项

    的FreeRTOS为例一步一步移植STM32F103 上,并提醒大家某些需要注意的事项。本文档为非正式技术文档,故排版会有些凌乱,希望大家能提供宝贵意见以供小灯参考改进。u3000u3000下面先以IAR
    发表于 09-26 08:03

    stm32f103可以使用nandflash吗?

    stm32f103可以使用nandflash吗
    发表于 09-21 06:25

    怎么解决AT32F403A使用CAN扩展格式接收ID的问题?

    AT32F403A使用CAN ,扩展格式下接收ID域一直不对,数据域一直是对的,标准格式下ID域与数据域都是正确的,不清楚哪里出了问题,有没有小伙伴遇到的
    发表于 05-05 17:24