15:【stm32】时钟树

时钟树

1、时钟树

1.1:简要的介绍

由我们前面写的的代码可知,我们每次使用片上外设都需要先打开片上外设的时钟,这样才能使用片上外设。如下图所示。


那么为什么会是这样喃?

我们查看一下时钟树的样子:如下图所示:左边的是时钟大树,右边的是时钟小树。如图:APB2/APB2/AHB分配器上面都连接的不同的片上外设,在使用某个片上外设是,我们打开连接的分频器,然后给他提供被处理过的脉冲波形。

1.2:基本结构

  • 小树:

    ①RTC:实时的计数器,就像是一个手表,记录当前的世界时间

    ②IWGD:独立看门狗

    ③他们由低频率的晶振(LSI(内部晶振)/LSE(外部晶振))提供频率,一般是32.768kHz的晶振,然后通过2^15分配后,得到1Hz的频率。

  • 大树

    ①HSI和HSE是高频率晶振:HSI是内部晶振,一般为8MHz。HSE是外部晶振,一般为4~16MHz。我们最小系统板上面的外部晶振是8MHz。

    ②锁相环PLL:是一个倍频器,倍率一般为2~16。

    ③AHB/APB1/APB2:都是分频器,对频率做除法。AHB(1~512),APB1/APB2(1~16)

  • 分频的实现:

    通过计数器,比较器来实现的。

如图:想要分频率的频率脉冲连接计数器,作为输入信号。当计数器从1开始计数,数值和计数周期通过比较器相较,如果计数值 > 计数周期时,比较器输出一个脉冲,计数值归0,重新开始计数。

如上图所示:计数周期为7,输入脉冲输入了8个脉冲,比较器才输出1个脉冲,实现8分频。

1.2.1:stm32的内部结构


1.2.2:树的关键节点

1.2.3:系统时钟的来源

2、RCC标准库编程

RCC也是stm32内部的一个片上外设,①它负责控制芯片的复位,②负责对时钟系统的配置

2.1:片上外设的复位与释放

在使用片上外设之前,最好是对其总线的时钟进行复位和释放。

复制代码
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//对APB2总线上USART1进行复位,相当于对里面的所有寄存器数据清除
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//对APB2总线上USART1进行释放

2.2:时钟系统配置

标准库对时钟系统配置的接口如下图所示:


复制代码
RCC_PLLConfig(uint32_t RCC_PLLSource,uint32_t RCC_PLLMul);//PLL来源的选择,倍率的设定。
复制代码
RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//系统时钟来源的选择
复制代码
RCC_HCLKConfig(uint32_t RCC_SYSCLK);//对AHB分频器倍率的选择

2.3:时钟树的初始状态

但是,当stm32执行代码的时候时:stm32会执行启动文件里面的SystemInit()函数,执行完这个函数后,才去执行用户编写的main()函数里面的代码。

而SystemInit()函数,就是将时钟树里面频率时钟为最大值。


2.4:配置CPU的频率

配置流程图

2.4.1设置Flash参数

为什么要设置Flash参数喃?

  • 指令配置Flash
    先设置指令预取模式,为什么要设置为这个模式喃?因为这样能避免指令的丢失
  • 设置对Flash的访问延迟
    为什么需要设置对Flash的访问延迟喃?因为Flash的最大频率为24MHz,当我们要把系统时钟的频率配置为>24MHz的时钟,为了更好的接收到指令,所以需要设置访问延迟。

代码①:

c 复制代码
#include "stm32f10x.h"

int main(void)
{
	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//开启指令预取模式
	FLASH_SetLatency(FLASH_Latency_2);//我们想要将系统时钟设置为72M,所以等待2个周期
	while(1)
	{

	}
}

2.4.2:配置时钟树

  • 开启HSE---->配置锁相环PLL---->配置系统时钟来源SYSCLK----->配置AHB/APB1APB2的系数
    == 默认情况下,HSI是开启的,HSE是关闭的,所以如果我们想要使用HSE时,我们需要开启HSE==
c 复制代码
#include "stm32f10x.h"

int main(void)
{
	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//开启指令预取模式
	FLASH_SetLatency(FLASH_Latency_2);//我们想要减系统时钟设置为72M,所以等待2个周期
	
	//开启HSE
	RCC_HSEConfig(RCC_HSE_ON);
	while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待HSE开启成功
	
	//配置锁相环PLL
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//选择HSE,9倍
	RCC_PLLCmd(ENABLE);
	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL配置成功
	
	//配置系统时钟SYSCLK的来源
	RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择来自锁相环PLL
	
	//配置AHB,APB1,APB2
	RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB分频系数为1 72MHz
	RCC_PCLK1Config(RCC_HCLK_Div2);//APB1分频系数为2 72MHz
	RCC_PCLK2Config(RCC_HCLK_Div1);//APB2分频系数为1 72MHz
	
	//关闭HSI
	RCC_HSICmd(DISABLE);
	
}
相关推荐
Msshu1232 小时前
受电端快充协议芯片,支持外部MCU读取充电器功率信息,支持最大140W功率给设备供电
单片机·嵌入式硬件
嵌入式-老费3 小时前
Linux上位机开发实践(mcu模块的补充应用)
单片机·嵌入式硬件
青牛科技-Allen3 小时前
D133AL低功耗LDO稳压器:技术解析与应用设计
科技·单片机·嵌入式硬件·笔记本电脑·激光雷达电机·游戏本散热风扇
L小李要学习5 小时前
STM32学习
stm32·嵌入式硬件·学习
正点原子7 小时前
【正点原子STM32MP257连载】第二章 ATK-DLMP257B使用前准备 #串口软件 #MobaXterm
linux·stm32·单片机·嵌入式硬件
ℳ๓. Sweet7 小时前
【STM32】在FreeRTOS下使用硬件SPI收发数据出现的时序耦合问题(WK2124芯片为例)
stm32·单片机·嵌入式硬件
charlie1145141919 小时前
IMX6ULL2025年最新部署方案2在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上
linux·嵌入式硬件·qt·系统架构·嵌入式软件·移植教程
努力创造奇迹10 小时前
STM32 HAL库 实现485通信
stm32·单片机·嵌入式硬件
Tlog嵌入式11 小时前
STM32提高篇: 以太网通讯
网络·stm32·单片机·嵌入式硬件·mcu·iot
菜狗想要变强12 小时前
RVOS-7.实现抢占式多任务
linux·c语言·驱动开发·单片机·嵌入式硬件·risc-v