七、STM32 时钟系统

STM32 时钟系统
STM32系统复位后首先进入SystemInit函数进行时钟的设置,将STM32F1系统时钟设置为72MHz,然后进入主函数。

1、时钟树框图

在这里插入图片描述

2、时钟源

STM32时钟系统中,有5个重要的时钟源LSI、LSE、HSI、HSE、PLL。HSI、HSE以及PLL属于高速时钟,LSI和LSE属于低速时钟。
(1)HSI是内部高速时钟,RC 振荡器,频率为 8MHz。可作为系统时钟或 PLL 锁相环的输入。
(2)HSE是外部高速时钟,芯片的 23 和 24 引脚即为外部高速晶振管脚。可通过外接一个频率范围是 4-16MHz 的时钟或者晶振,我们开发板上接的是一个 8MHz 的外部晶振。HSE 可以作为系统时钟和 PLL 锁相环输入,还可以经过 128 分频后输入给 RTC。
(3)LSI是内部低速时钟,RC 振荡器,频率大约为 40K,可供独立看门狗和 RTC 使用,并且独立看门狗只能使用 LSI 时钟。
(4)LSE是外部低速时钟,STM32 芯片的PC14和PC15即为外部低速时钟管脚。通常在此管脚上外接一个32.768KHz 的晶振,供RTC使用。
(5)PLL是锁相环,用于倍频输出,因为开发板外部高速晶振也只有 8M,通过 PLL 锁相环来倍频实现芯片的最大时钟频率72M。
使用HSE是8M 晶振,经过 PLLMUL 9倍频后可以输出 72M 时钟频率给 PLLCLK。
如果选择 HSE 作为PLL的时钟源,PLL是SYSCLK 的时钟源,即 SYSCLK为72MHz,也是库函数SystemInit 所配置的最终系统时钟。

3、给其他外设和系统提供时钟

(1)MCO是 STM32的一个时钟输出 IO(PA8),它可以选择一个时钟信号输出,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。这个时钟可以用来给外部其他系统提供时钟源。
(2)RTC 时钟来源可以是内部低速的LSI时钟,外部低速 LSE 时钟(32.768K),还可以通过 HSE 128 分频后得到。
(3)USB 时钟。STM32 中有一个全速功能的 USB 模块,其串行接口引擎需要一个频率为 48MHz 的时钟源,该时钟源只能从 PLL 输出端获取,可以选择为1.5 分频或者 1 分频,也就是当需要使用 USB 模块时,PLL 必须使能,并且PLLCLK 时钟频率配置为 48MHz 或 72MHz。
(4)SYSCLK 系统时钟。它是 STM32 中绝大部分部件工作的时钟源。希望有一个比较大的时钟频率,可选择 PLLCLK 作为系统时钟。

(5)其他所有外设。从时钟图上可以看出,其他所有外设的时钟最终来源都是 SYSCLK。SYSCLK 通过 AHB 分频器分频后送给各模块使用。
1) AHB 总线、内核、内存和 DMA 使用的 HCLK 时钟。
2)通过 8 分频后送给 Cortex 系统定时器时钟,即 SysTick。
3)直接送给 Cortex 的空闲运行时钟 FCLK。
4)送给 APB1 分频器。 APB1 分频器输出一路供 APB1 外设使用(PCLK1,最大频率 36MHz),另一路送给定时器(Timer)1、2 倍频使用。
5)送给 APB2 分频器。 APB2 分频器分频输出一路供 APB2 外设使用(PCLK2,最大频率 72MHz),另一路送给定时器(Timer)1 倍频器使用。
6)送给 ADC 分频器。ADC 分频器经过 2、4、6、8 分频后送给 ADC1/2/3 使
用,ADC 最大频率为 14M。
7)二分频后送给 SDIO 使用。

注:
(1)APB1和APB2区别
APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、 UART2、UART3等,APB2上面连接的是高速外设包括 UART1、SPI1、Timer1、 ADC1、 ADC2、GPIO等。
APB2 的速度大于APB1的速度。
(2)有关时钟输出部分都有一个使能控制,比如 AHB 总线、APB1 外设、APB2 外设、内核时钟等。当需要使用某个时钟的时候一定要开启它的使能,否则将不工作。

4、时钟使能配置函数

复位和时钟控制(RCC)固件库已经把时钟相关寄存器的使能配置都封装好,放在 stm32f10x_rcc.c 和stm32f10x_rcc.h 中。

4.1外设时钟使能相关函数

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

如:使能端口 GPIOC,第一个传递的参数为RCC_APB2Periph_GPIOC 宏,第二个传递的参数为ENABLE 使能。

4.2时钟源使能函数-使能相应的时钟源

void RCC_HSICmd(FunctionalState NewState);
void RCC_LSICmd(FunctionalState NewState);
void RCC_PLLCmd(FunctionalState NewState);
void RCC_RTCCLKCmd(FunctionalState NewState);

4.3时钟源和倍频因子配置函数

选择相应的时钟源和配置时钟倍频因子

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);//配置时钟源为 HSE
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速 APB1 时钟(PCLK1)
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);

PLLMUL时钟源配置,第一个参数是 PLL 时钟源选择,采用HSE作为PLL的时钟源RCC_PLLSource_HSE_Div1/RCC_PLLSource_HSE_Div2,第二个参数是倍频因子值(RCC_PLLMul_2~RCC_PLLMul_16)。

4.4外设复位函数

void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

5、自定义系统时钟

#include "stm32f10x.h"
#include "led.h"

//闪烁第一个led灯
void delay(u32 i)//延时函数
{
  while(i--);
}

void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)
{
  RCC_DeInit(); //将外设RCC寄存器重设为缺省值
  RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)
  if(RCC_WaitForHSEStartUp()==SUCCESS) //等待HSE起振
  {
    RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)
    RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)
    RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)
    RCC_PLLConfig(div,pllm);//设置PLL时钟源及倍频系数
    RCC_PLLCmd(ENABLE); //使能或者失能PLL
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位设置与否,PLL就绪
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK)
    while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源,0x08:PLL作为系统时钟
  }
}

int main()
{
  //RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//(8/1)*9=72M,倍频最大16
  RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);//(8/2)*9=36M,闪烁速度变慢一倍
  LED_Init();
  while(1)
  {
    GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//输出低电平,灯点亮
    delay(6000000);
    GPIO_SetBits(LED_PORT,GPIO_Pin_0);//输出高电平,灯熄灭
    delay(6000000);
  }
}

编辑 2023.03.29 23:45 首次编辑

注:本文旨于自己的学习笔记,禁止转载。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值