打印
[其他ST产品]

STM32F10x从零开始配置时钟

[复制链接]
360|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qn7a12|  楼主 | 2023-1-30 23:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
实际上,对于STM32F10x系列的芯片,如果使用库函数方式开发,芯片的时钟初始化函数已经写好,并且在启动文件(例如startup_stm32f10x_hd.s)中被自动调用,在进入main函数之前,系统以及外设时钟均配置完成,main程序中不需要对时钟再进行任何配置,直接编写应用程序即可。但是作为一个底层驱动玩家必须要打破砂锅问到底,看看STM32F10x系列芯片的时钟系统到底是怎么样的以及如何配置时钟,下文将着重分析STM32F10x的时钟系统以及用寄存器方式从零开始一步一步配置时钟。

一、开发环境
  • MDK版本:V5.28
  • 单片机:STM32F103RCT6

时钟树剖析
[size=4.5]上图就是STM32F10x的时钟树,看着十分复杂,或许有人会问,为什么STM32要把时钟设计的这么复杂?
[size=4.5]




————————————————
版权声明:本文为CSDN博主「Ruler.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24835087/article/details/106183418

使用特权

评论回复
沙发
qn7a12|  楼主 | 2023-1-30 23:25 | 只看该作者
这是因为STM32的外设很多,而且不同的外设需要的时钟是不一样的,例如USB时钟一般需要48MHz,RTC时钟一般是32.768K,APB2总线上的外设最大不超过72MHz,APB1总线外设最大不超过36MHz,如何同时满足这些时钟要求呢?显然如果只设计一种时钟是不可以的,于是就有了上图中复杂的时钟系统。下面我们就来分析下上图的时钟系统。

使用特权

评论回复
板凳
qn7a12|  楼主 | 2023-1-30 23:30 | 只看该作者
首先可以把上图的时钟树划分为以下几个部分:

使用特权

评论回复
地板
qn7a12|  楼主 | 2023-1-30 23:31 | 只看该作者

使用特权

评论回复
5
qn7a12|  楼主 | 2023-1-30 23:32 | 只看该作者
基础时钟介绍:

使用特权

评论回复
6
qn7a12|  楼主 | 2023-1-30 23:35 | 只看该作者
基础时钟并不是官方提出的概念,是我个人的习惯叫法,它主要指的是HSE、LSE、HSI、LSI这四种时钟源,其主要作用如上图所示。

使用特权

评论回复
7
qn7a12|  楼主 | 2023-1-30 23:36 | 只看该作者
系统时钟的产生:

系统时钟的产生有三种方式:1>HSI内部高速时钟,一般为8MHz。 2>HSE外部高速时钟,一般为8MHz晶振。 3>PLL电路,输出频率可任意配置。其中HSI和HSE都属于基础时钟,如果使用PLL时钟作为系统时钟,PLL电路的基准输入必须是HSE或者HSI。

使用特权

评论回复
8
qn7a12|  楼主 | 2023-1-30 23:37 | 只看该作者
如果直接使用基础时钟作为系统时钟,那么系统时钟最大频率≤HSE/HSI 如果使用PLL输出时钟作为系统时钟,那么系统时钟最大频率≤72MHz

下面就以定时器为例说明上述各个时钟之间的供需关系:

如果需要使用定时器,那么首先需要开启定时器的时钟,而定时器属于外设,因此需要系统时钟提供时钟给这个外设,对于系统时钟,有两种方式提供,一种是由基础时钟(内部或外部基础时钟源)直接提供,缺点是无法产生更高的频率,时钟源是多高的频率,系统时钟最大不会超过这个频率;第二种是由PLL电路提供,优点是能够产生各种高频稳定的时钟频率,但是也需要基础时钟提供基准信号,且一般情况下STM32F10x系列PLL输出最大不超过72MHz。

使用特权

评论回复
9
qn7a12|  楼主 | 2023-1-30 23:38 | 只看该作者
一般来说除RTC外所有的外设时钟(TIM、GPIO、DMA、USART、USB等等)必须由系统时钟提供,但某些特殊外设需要另当别论(以太网、I2S设备等)

使用特权

评论回复
10
qn7a12|  楼主 | 2023-1-30 23:38 | 只看该作者
在STM32时钟树中,还有很多的分频器和倍频器,通过这些分频和倍频器就能产生各种需要的频率,但是只有PLL电路才可以倍频,即产生高于输入频率的频率,例如将8MHz的HSE作为PLL基准输入,最高可以9倍频,产生72MHz的输出频率提供给系统时钟;其余的电路只能进行分频,如TIM、USART等这些外设时钟都是通过系统时钟分频而来,所以它们的最大频率不会超过系统主时钟。

使用特权

评论回复
11
qn7a12|  楼主 | 2023-1-30 23:39 | 只看该作者
三、时钟配置流程

STM32F10x时钟的配置有很多种方式,如果HSE存在,那么可以使用HSE作为PLL输入,也可以不使用,还可以将HSE 128分频作为RTC时钟;当HSE不存在时,可以直接把HSI作为系统主时钟(8MHz),也可以将HSI作为PLL的输入,但此时PLL的最大输出为64MHz。LSE存在时,可以将LSE作为RTC时钟,也可以将LSI作为RTC时钟,看门狗的时钟只能是LSI(40KHz左右)。

使用特权

评论回复
12
qn7a12|  楼主 | 2023-1-30 23:39 | 只看该作者
下面是STM32F10x系统主时钟及总线时钟配置流程:

使用特权

评论回复
13
qn7a12|  楼主 | 2023-1-30 23:40 | 只看该作者
1.任意时钟倍频或者分频系数必须在该时钟未使能之前修改,例如PLL倍频系数,当PLL时钟使能后,该倍频系数数被锁定,无法修改,必须先失能PLL,再修改参数,其他时钟亦是如此。

使用特权

评论回复
14
qn7a12|  楼主 | 2023-1-30 23:40 | 只看该作者
2.PLL时钟、RTC时钟、系统时钟源切换时,只有当目标时钟就绪时才会切换,否则无法切换。一旦某个时钟源被确定,除非复位,该时钟源不会被停止

使用特权

评论回复
15
qn7a12|  楼主 | 2023-1-30 23:41 | 只看该作者
现根据上述流程,一步一步的进行时钟配置:
尽管时钟树如此复杂,但实际上也就需要配置以下两个寄存器即可!

使用特权

评论回复
16
qn7a12|  楼主 | 2023-1-30 23:42 | 只看该作者

使用特权

评论回复
17
qn7a12|  楼主 | 2023-1-31 10:51 | 只看该作者

使用特权

评论回复
18
qn7a12|  楼主 | 2023-1-31 10:56 | 只看该作者
HSE配置(如HSE不存在则时钟错误)
RCC->CR |= (1<<16);//使能HSE
while((RCC->CR & (1 << 17))==0);//等待HSE就绪
RCC->CR |= (1<<19);//如果外部 8-24MHz振荡器就绪,时钟监测器开启。

//下面是HSI配置 若有需要可以加上
RCC->CR |= (0x01);//使能HSI
while((RCC->CR & 0x02)==0);//等待HSI就绪

使用特权

评论回复
19
qn7a12|  楼主 | 2023-1-31 10:57 | 只看该作者
FLASH访问配置
FLASH->ACR | = 0x10;//FLASH启用预取缓冲区
FLASH->ACR & = 0x03;//清0低2位
FLASH->ACR |=0x02;//等待2个周期

使用特权

评论回复
20
qn7a12|  楼主 | 2023-1-31 10:59 | 只看该作者
AHB、APB时钟分频系数配置

RCC->CFGR = ((0 & 0xf) << 4)|(RCC->CFGR & ~(0xf << 4));//AHB不分频 72M
RCC->CFGR = ((4 & 0x7) << 8)|(RCC->CFGR & ~(0x7 << 8));//APB1 二分频 36M
RCC->CFGR = ((0 & 0x7) << 11)|(RCC->CFGR & ~(0x7 << 11));//APB2 不分频  72M

使用特权

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

本版积分规则

31

主题

507

帖子

1

粉丝