发新帖我要提问
12
返回列表
打印
[STM32F1]

STM32F10X系列时钟配置

[复制链接]
楼主: rzjvv
手机看帖
扫描二维码
随时随地手机跟帖
21
rzjvv|  楼主 | 2024-4-30 22:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览

图 4-1 标准库版本

使用特权

评论回复
22
rzjvv|  楼主 | 2024-4-30 22:27 | 只看该作者
  帅的发光的朋友要问了,你说好的常见的是V3.5.0,这里有放个不是V3.5.0的图,莫非有特殊意义?呐,没错!不知道大家在主函数最开头见过SystemInit()这个函数没,如图4-2所示。

图 4-2 SystemInit()

使用特权

评论回复
23
rzjvv|  楼主 | 2024-4-30 22:27 | 只看该作者
莫非,他就是用来配置系统时钟的?呐,没错!在V3.5.0版本以下的库函数都要在主函数调用它一次,而在V3.5.0版本中就不用了,经常看见有人在V3.5.0中也调用了,可以但没必要,理由如图4-3所示。

图4-3 启动文件解析

使用特权

评论回复
24
rzjvv|  楼主 | 2024-4-30 22:28 | 只看该作者
  在ST提供的启动文件startup_stm32f10x_md.s中第133行有跳转到SystemInit()执行一遍时钟配置,最后再跳转到main.c中,所以就不需要重复调用啦。

        最后,我们以探究SystemInit()作文文章结尾吧。SystemInit()在system_stm32f10x.c文件中被定义,如图4-4所示。


图 4-4 时钟配置

使用特权

评论回复
25
rzjvv|  楼主 | 2024-4-30 22:28 | 只看该作者
官方是这样描述这个函数的:Initialize the Embedded Flash Interface, the PLL and update the  SystemCoreClock variable.好吧,原来他除了配置时钟还能初始化FLASH啊。我们找到有关时钟的代码,如图4-5所示。

图 4-5 时钟配置

使用特权

评论回复
26
rzjvv|  楼主 | 2024-4-30 22:28 | 只看该作者
呃,好吧,又调用了SetSysClock(),我们跳转进去看看,方法如图4-6所示。

图 4-6 函数跳转

使用特权

评论回复
27
rzjvv|  楼主 | 2024-4-30 22:29 | 只看该作者
跳转进来后,我们发现我们选择了HSE作为系统时钟源,并且选择系统时钟为72MHz,并又跳转到SetSysClockTo72()进行了真正意义上的配置。真实山重水复疑无路,柳暗花明又一村,如图4-7所示。

图 4-7 时钟配置

使用特权

评论回复
28
rzjvv|  楼主 | 2024-4-30 22:29 | 只看该作者
  问题来了,这么多行,为什么这个函数里唯独选择了72M呢(灰的就是编译会忽略的,条件编译里keil的特色,直观好用吧),这里又得翻到文件开头,这里做出了宏定义。所以讲了这么多,原来要修改系统频率只需要改这个宏定义就好啦(注释72M这个,把想要的频率的那个注释的内容恢复),如图4-8所示。 图4-8 修改时钟频率的办法

使用特权

评论回复
29
rzjvv|  楼主 | 2024-4-30 22:29 | 只看该作者
   最后,感兴趣的话可以结合STM32F10X的寄存器手册看看SetSysClockTo72()是如何做详细配置的,SetSysClockTo72()所在位置如图4-9所示,这里我就不做展开了。祝大家学得开心!
图 4-9 寄存器配置

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则