STM32F103时钟结构

个人学习记录使用,图取自正点原子。 

人的脉搏对于人是十分重要的,如果脉搏紊乱,会导致身体紊乱,甚至会导致死亡。同样,系统的时钟就好似脉搏,如果时钟没有设置合适,就会导致系统出错,达不到想要的效果,如果没有设置(或者使能)的话,就会导致系统无法工作。 

关于需要外设和IO口需要配置时钟频率的作用:

我认为对于外设,比如说,定时器需要进行计数,而每计数一次的时间就是根据定时器配置的时钟频率确定的,这对于定时器来说至关重要,影响到了定时器精确程度;

再比如说,USART通信的波特率,就是根据USART配置的时钟频率(红色部分PCLKx)确定的 ,这可以从官方给波特率的计算公式可以看出:

/*!< This member configures the USART communication baud rate.
                                       The baud rate is computed using the following formula:
                                            - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate)))
                                            - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */

对于IO口,可能会影响到IO口的电平转换速率

时钟结构框图:

注释:

1.蓝色为时钟源,有5个时钟源(外部时钟比内部时钟更加精确):

          (1).HSI高速内部时钟,RC振荡器,频率为8MHz,精度不高

          (2).HSE高速外部时钟,可接石英/陶瓷谐振器,频率范围4MHz~16MHz

          (3).HSI低速内部时钟,RC振荡器,频率为40kHz,提供低耗时钟,用于看门狗

          (4).LSE低速外部时钟,接32.768kHz的石英晶体,用于RTC

          (5).PLL锁相环倍频输出,其时钟来源可以是HSI/2、HSE或者HSE/2,备品可选择                       2~16倍,但是其输出频率最大不得超过72MHz

2.MCO为时钟输出引脚(PA8),可以将相关时钟配置给IO口使用

3.系统时钟SYSCLK有三个时钟来源:HSI、HSE、PLL

4.灰色梯形为时钟选择器,可以选择挂载在其上面的时钟作为时钟源

5.绿色矩形为分频器,用于时钟的分频,降低时钟的频率

6.黄色矩形是时钟监控系统CSS(作用如图所示)

RCC(即复位与时钟配置模块)相关配置:

可以配合时钟结构图一起理解:

1.时钟使能配置,就是使能相应的时钟源

2.时钟源相关配置,比如说配置PLL、SYSCLK、RTC的时钟频源,配置相关的时钟频率

3.分频系数选择配置,就是灰色梯形

4.外设(内部)时钟使能,就是在使用外设时,首先需要使能相应的时钟线,外设具有相应的工作频率了,才能工作

5.其他外设时钟使能,道理同4差不多

6.状态参数获取参数,比如获取时钟的频率、获取系统时钟源、获取时钟状态等

7.RCC中断相关函数

 时钟的相关配置寄存器:

系统时钟SYSCLK的相关配置在system_stm32f10x.c 中

修改系统时钟频率为注释和启用下图:

比如说你要将系统时钟设置为72MHz,就需要启用如下定义

启用相关定义后,在系统初始化后会运行相应的系统时钟配置函数:

就是说,你再选择系统时钟设置为72MHz后,,系统时钟的相关配置,会根据72MHz的系统时钟进行系统时钟的配置(配置函数为蓝色高亮函数)

 下面让我们看看上面这个将系统时钟配置为72MHz的函数(上面蓝色高亮函数),配置时钟的具体过程:

先是使能外部高速时钟源HSE(也就是确定外部时钟源为系统时钟,8MHz) ,然后等待时钟就绪。

 这段代码对照着时钟框图理解,高速外部时钟HSE(8MHz)就绪后,确定SYSCLK(系统时钟)后面的那一部分绿色矩形的分频系数,即:

设置AHB分频系数为(uint32_t)RCC_CFGR_HPRE_DIV1

设置APB1的分频系数为(uint32_t)RCC_CFGR_PPRE1_DIV2

设置APB2的分频系数为(uint32_t)RCC_CFGR_PPRE2_DIV1

注意:

这些分频系数在此就已经设定了!这也就是,GPIOA等一系列IO口在写驱动的时候,只需要使能相应时钟,而不需要确定时钟频率的原因!因为系统时钟频率(分频系数)已经设定!

这段代码对照着时钟框图理解, 这段代码是说,在时钟源HSE(8MHz)确定后,需要经过锁相环PLL进行9倍频后,最终确定系统时钟SYSCLK频率为72MHz.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要设置 STM32 的串口波特率,需要先配置串口的时钟源和时钟分频器,然后计算出波特率对应的波特率发生器的值,并将其写入 USART_BRR 寄存器中。具体步骤如下: 1. 通过 RCC_ClocksTypeDef 结构体获取系统时钟频率和串口时钟频率。 ```c RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks); uint32_t PCLKx = RCC_Clocks.PCLKx_Frequency; ``` 2. 配置 USART 的时钟源和时钟分频器,使其与波特率发生器的时钟频率相同。 ```c // 时钟源为 APB1 时钟,分频器为 1,使 USART 时钟频率与 PCLKx 相同 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); USART_ClockInitTypeDef USART_ClockInitStructure; USART_ClockInitStructure.USART_Clock = USART_Clock_Enable; USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; USART_ClockInitStructure.USART_LastBit = USART_LastBit_Enable; USART_ClockInit(USART2, &USART_ClockInitStructure); ``` 3. 计算波特率对应的波特率发生器的值。 ```c uint32_t BaudRate = 115200; uint32_t Mantissa = PCLKx / (16 * BaudRate); uint32_t Fraction = (PCLKx % (16 * BaudRate)) * 16 / (16 * BaudRate); uint32_t BRR = (Mantissa << 4) + Fraction; ``` 4. 将波特率发生器的值写入 USART_BRR 寄存器中。 ```c USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = BaudRate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); USART2->BRR = BRR; ``` 这样就完成了 STM32 的串口波特率的设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值