STM32 手把手教你怎么学习时钟系统(通配)

时钟系统

Created time: 2024年9月18日 15:01
Status: Done
类型: 理论
摘要: 谈谈F1系列时钟树的架构以及在实际工程中是如何配置的

时钟,就是具有周期性的脉冲信号,最常用的是占空比为50%的方波.

F1时钟树

在这里插入图片描述

F1时钟树总图

在这里插入图片描述

F1时钟树简图

我们先来看时钟树的源—时钟源.STM32F1有4个时钟源:

时钟源名称频率材料用途
高速外部时钟源(HSE)4-16MHz晶体/陶瓷SYSCLK/RTC
低速外部时钟源(LSE)32.768KHz晶体/陶瓷RTC
高速内部时钟源(HSI)8MHzRCSYSCLK
低速外部时钟源(LSI)40KHzRCRTC/IWDG

时钟源(振荡器),锁相环:HAL_RCC_OscConfig()`

系统时钟,总线:HAL_RCC_ClockConfig()

使能外设时钟:(宏)__HAL_RCC_PPP(表示任意外设)_CLK_ENABLE()

STM32为了低功耗,初始时外设的时钟都是关闭的,用什么外设就要用上面这个宏打开相应时钟.

扩展外设时钟()RTC/ADC/USB):HAL_RCCEx_PeriphCLKConfig()

不同系列这个函数的配置是不一样的,这一点要注意.

在这里插入图片描述

STM32CubeMX时钟树(F103)

配置系统时钟

系统时钟配置步骤

  1. 配置HSE_VALUE:告诉HAL库外部晶振频率,stm32xxxx_hal_conf.h

    在这里插入图片描述

    这边我们使用正点原子开发板—8MHz(ST官方是25MHz)

  2. 调用SystemInit()函数(可选):在启动文件中调用,在system_stm32xxxx.c定义

    在这里插入图片描述

    startup_stm32f103xe.s头文件中

    system_stm32xxxx.c 文件中的定义没啥用,这里就不赘述.

  3. 选择时钟源,配置PLL(锁相环):通过HAL_RCC_OscConfig()函数设置

  4. 选择系统时钟源,配置总线分频器:通过HAL_RCC_ClockConfig()函数设置

  5. 配置扩展外设时钟(可选):通过HAL_RCExPeriphCLKConfig()函数设置

其中3+4+5=sys_stm32_clock_init() ,这个函数在main.c的前半部分被调用:
比如这个跑马灯程序main函数:

在这里插入图片描述

按下F12(或者Fn+F12)后查看其定义:

在这里插入图片描述

转到了sys.c下

主要就这俩函数:

在这里插入图片描述

这俩函数在后面也会讲到

外设时钟的使能和失能

我们要使用某个外设,必须先使能该外设时钟!!!

HAL库使能某个外设时钟的方法,如:

__HAL_RCC_GPIOA_CLK_ENABLE();  /*使能GPIOA时钟*/

HAL库禁止某个外设时钟的方法,如:

__HAL_RCC_GPIOA_CLK_DISABLE();  /*禁止GPIOA时钟*/

sys_stm32_clock_init函数(F1)

HAL_RCC_OscConfig()函数

HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OsxInitTypeDef *RCC_OscInitStruct)

typedef struct
{
			uint32_t OscillatorType;    /*选择需要配置的振荡器*/
			uint32_t HSEState;          /*HSE状态*/
			uint32_t HSEPredivValue     /*HSE预分频值*/
			uint32_t LSEState;          /*LSE状态*/
			uint32_t HSIState;          /*HSI状态*/
			uint32_t HSICalibrationValue;/*HSI校准值*/
			uint32_t LSIState;          /*LSI状态*/
			RCC_PLLIintTypeDef PLL;     /*PLL结构体*/
}RCC_OscInitTypeDef;

typedef struct
{
			uint32_t PLLState;           /*PLL状态*/
			uint32_t PLLSource;          /*PLL时钟源*/
			uint32_t PLLMUL;             /*pll倍频系数:2~16*/
}RCC_PLLIintTypeDef;

那么,在实际工程中这个函数长啥样?

在这里插入图片描述

sys.c中

点击F12查看参数类型的定义:

在这里插入图片描述

分别看下他们的宏:

OscillatorType:

在这里插入图片描述

Ctrl+f搜索(find in Files):

在这里插入图片描述

点击这个就能找到

在这里插入图片描述

当然你直接点sys.c中的RCC_OSCILLATORTYPE_HSE也能到这里.两种方法.

其他2个类推,自己动手试试

接下来到锁相环的配置:

在这里插入图片描述

这仨就是配置锁相环(RCC_PLLIintTypeDef)的三个参数

倍频因子以形参传入,看眼main.c中的参数:

Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M

F12看眼RCC_PLL_MUL9的定义:
在这里插入图片描述

我们这里*9,因为外部晶振是8MHz,倍频之后变72M

最后初始化一下,ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化 就大功告成(并不)了!

HAL_RCC_ClockConfig()函数

HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct,uint32_t FLatency)

typedef struct
{
		uint32_t ClockType;            /*要配置的时钟(SYSCLK/HCLK/PCLK1/PCLK2)*/
		uint32_t SYSCLKSource;         /*系统时钟源*/
		uint32_t AHBCLKDivider;        /*AHB时钟预分频系数*/
		uint32_t APB1CLKDivider;       /*APB1时钟预分频系数*/
		uint32_t APB2CLKDivider;       /*APB2时钟预分频系数*/
}RCC_ClkInitTypeDef;
uint32_t FLatency

#define FLASH_LATENCY_0 0x00000000U                 /*FLASH0等待周期*/
#define FLASH_LATENCY_1 FLASH_ACR_LATENCY_0         /*FLASH1等待周期*/
#define FLASH_LATENCY_2 FLASH_ACR_LATENCY_1         /*FLASH2等待周期*/

在这里插入图片描述

在这里插入图片描述

多跳F12多看看,结合参考手册,超爽🤘


这样,STM32F1系列的时钟树就介绍完毕.有错误的话直接踢我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值