时钟系统基础知识

本文介绍了STM32的系统时钟基础,包括HSI、HSE、LSI、LSE和PLL等时钟源,以及系统时钟配置的步骤。文章详细讲解了如何通过HAL库函数进行时钟源选择、电压级别设置和分频系数配置,并提供了相应的C语言初始化代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 基础知识

啥是系统时钟呢?时钟是同步单片机系统各个部件工作时序的最小时间单位

1、STM32的5个时钟源:HSI、HSE、LSI、LSE、PLL

HSI:高速内部时钟     约为16MHz【可作为系统时钟,以及锁相环的输入、MCO1引脚的输出】 精度不高   系统时钟默认使用HSI

HSE:高速外部时钟     外部晶振产生,为4~26MHZ【经过分频后可做RTC一个时钟来源、系统时钟】  

LSI:低速内部时钟    一般为32kHZ【用于独立看门狗实验、选择到RTC的时钟源】

LSE:低速外部时钟   外部接晶振产生的,一般为32.768kHZ【可作为RTC的时钟源(RTC一般都使用LSE为时钟源,更为精确)】

PLL:锁相环倍频输出    输入来源于HSI和HSE,再经过选择和分频之后输入锁相环  倍频之后经过P分频产生PLLCLK提供系统时钟,经过Q分频产生48M时钟,用于USB OTG FS时钟,随机数发生器的时钟和SDIO时钟 (专用的PLLI2S和PLLSAI用于生成精确时钟)

注:1、主PLL时钟计算   PLLCLK=HSE*N/(M*P)  经过了N倍频

        2、PLLI2S:N的取值范围:192~432  R的取值范围:2~7 Q:2~15

       3 、PLLSAI:  N的取值范围:192~432  Q:2~15    R:2~7

系统时钟:由HSI、HSE、PLLCLK产生【可用于以下图示】

 二、系统时钟配置的一般步骤

使能PWR时钟:调用函数_HAL_RCC_PWR_CLK_ENABLE();

设置调压器输出电压级别:调用函数_HAL_PWR_VOLTAGESCALING_CONFIG();

                                            01:级别3:HCLK最大频率120MHz    10:HCLK最大频率144MHz

                                            11:HCLK最大频率为168MHz,通过开启Over-drive模式可以达到                                                          180MHz

选择是否开启Over-Driver功能:调用函数HAL_PWREx_EnableOverDrive();

配置时钟源相关参数:调用函数HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);  选择系统时钟的时钟源

 

配置系统时钟源以及AHB、APB1、APB2的分频系数【外设】:调用函数HAL_RCC_ClockConfig();

三、相关代码

void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{
    HAL_StatusTypeDef ret = HAL_OK;
    RCC_OscInitTypeDef RCC_OscInitStructure;  //定义结构体
    RCC_ClkInitTypeDef RCC_ClkInitStructure;  //定义结构体
    
    __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
    
    //下面这个设置用来设置调压器输出电压级别,以便在器件未以最大频率工作
    //时使性能与功耗实现平衡,此功能只有STM32F42xx和STM32F43xx器件有,
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1
    
    //设置结构体成员变量
    RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;    //时钟源为HSE
    RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE
    RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL
    RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE
    RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.  【M值】
    RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432.  【N值】 
    RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)  【p值】
    RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
    ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化(传参 结构体成员变量)
	
    if(ret!=HAL_OK) while(1);
    
    ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能
    if(ret!=HAL_OK) while(1);
    
    //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
    RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2); //设置需要配置时钟的类型
    RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
    RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
    RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4
    RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2
    ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。
		
    if(ret!=HAL_OK) while(1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值