其他分享
首页 > 其他分享> > STM32F407时钟树与系统时钟学习笔记

STM32F407时钟树与系统时钟学习笔记

作者:互联网

STM32F4xx时钟树

STM32F407时钟树

1、 时钟树简介

从图中可以看出STM32有四个时钟源和锁相环倍频输出时钟:分别是:
1、HSE:高速外部时钟
高速外部时钟信号 (HSE) 有 2 个时钟源:(1) HSE 外部晶振/陶瓷谐振器、(2)HSE 外部用户时钟
2、HSI:高速内部时钟
HSI 时钟信号由内部 16 MHz RC 振荡器生成,可直接用作系统时钟,或者用作 PLL 输入。
3、LSE:低速外部时钟
LSE 晶振是 32.768 kHz 低速外部 (LSE) 晶振或陶瓷谐振器,可作为实时时钟外设 (RTC) 的时钟源来提供时钟/日历或其它定时功能,具有功耗低且精度高的优点。
4、LSI:低速内部时钟
LSI RC 可作为低功耗时钟源在停机和待机模式下保持运行,供独立看门狗 (IWDG) 和自动唤醒单元 (AWU) 使用。时钟频率在 32 kHz 左右。有关详细信息,请参见数据手册的电气特性部分。
5、PLL:倍频输出时钟
(1)主 PLL(PLL)由 HSE 或者 HSI 提供时钟信号(通过选择器),并具有两个不同的输出时钟。主PLL时钟计算方式:PLL=8MHz * N/ (MP)=8MHz 336 /(8*2) = 168MHz (就是分频和倍频:外部晶振选择 8MHz M=8,倍频器倍频系数 N=336,分频器分频系数 P=2 )第一个输出 PLLP 用于生成高速的系统时钟(最高 168MHz)第二个输出 PLLQ 用于生成 USB OTG FS 的时钟(48MHz),随机数发生器的时钟和 SDIO时钟
(2)专用 PLL(PLLI2S)用于生成精确时钟,从而在 I2S 接口实现高品质音频性能

从图上还可以看出STM32F407还具有向外输出时钟的两个口分别是:STM32时钟信号输出MCO1(PA8)和MCO2 (PC9)

1、MCO1用户可通过可配置的预分配器(从 1 到 5)向 MCO1 引脚 (PA8) 输出四个不同的时钟源:
HSI 时钟、LSE 时钟、HSE 时钟、PLL 时钟
所需的时钟源通过 RCC 时钟配置寄存器 (RCC_CFGR) 中的 MCO1PRE[2:0] 和 MCO1[1:0]位选择。
2、MCO2用户可通过可配置的预分配器(从 1 到 5)向 MCO2 引脚 (PC9) 输出四个不同的时钟源:
HSE 时钟、PLL 时钟、系统时钟 (SYSCLK)、PLLI2S 时钟
所需的时钟源通过 RCC 时钟配置寄存器 (RCC_CFGR) 中的 MCO2PRE[2:0] 和 MCO2位选择。
对于不同的 MCO 引脚,必须将相应的 GPIO 端口在复用功能模式下进行设置。MCO 输出时钟不得超过 100 MHz(最大 I/O 速度)

2、 时钟配置:

1、对于HSI、HSE、PLL等时钟源配置,没有专门的固件库函数,可以通过SystemInit函数来操作配置。该函数具体实现过程如下(也可以根据寄存器自己操作):
(1)、系统复位之后,先调用SystemInit函数,该函数的作用是初始化系统时钟,设置PLL等
(2)、打开HSE,等待其稳定,
(3)、设置AHB、APBx、等分频系数
(4)、设置HSE为主PLL时钟源,并且配置主PLL里面的分频和倍频参数,然后产生PLLCLK并将其使能,并选择系统时钟(SYSCLC)为PLLCLK

2、初始化之后的状态
SYSCLK(系统时钟) =168MHZ
AHB总线时钟(HCLK=SYSCLK)=168MHZ
APB1总线时钟(PCLK1=SYSCLK/4)=42MHZ
APB2总线时钟(PCLK2=SYSCLK/2)=84MHZ
PLL主时钟 =168MHZ
初始化之后可以通过变量SystemCoreClock获取系统变量,如果SYSCLK=168MHZ,那么变量等于168000000
系统复位后先调用的是SystemInit函数,其次是main函数,这一点在启动文件里面写了。

3、SysTick(系统定时器)的使用方法

简介:该定时器寄存器,24位,只能递减,该寄存器存在于内核,嵌套在NVIC中,所有的Cortex-M内核单片机都具有该定时器。SysTick_Config(uint32_t ticks)初始化函数位于Core_cm4.h中,计数器每计数一次的时间为 1/SYSCLK,一般我们设置
系统时钟 SYSCLK 等于 168M。在这里插入图片描述
调用Systick定时器,只需要调用SysTick_Config(uint32_t ticks)函数,向函数中写入初始值,如果时钟源选择的是AHB=168MHZ,那么,每递减一次的时间就是1/168M,需要多少时间就设多大初始值。当递减到零时会产生异常请求(中断)具体代码应用如下:

__IO u32 TimingDelay;//防止编译器优化的变量

void SysTick_Init(void)
{
	if(SysTick_Config(SystemCoreClock / 1000))//设置初始值为168 000 000/1000=168 000=1ms
	{
		while(1);
	}
}

//ms延时程序

void Delay_ms(__IO u32 nTime)
{
	
	TimingDelay = nTime;
		while(TimingDelay != 0);
	
}

//中断服务函数调用该函数,每进一次中断,数值减一,每一毫秒进一次中断。
void TimingDelay_Decrement(void)
{
	if (TimingDelay != 0x00)
	{ 
		TimingDelay--;
	}
}

调用一个  Delay_ms(1000);  函数,延时时间为1000*1ms。TimingDelay的初始值被设为1000,随着定时器数值每次递减,进入中断使得TimingDelay递减,当TimingDelay递减到0时,延时函数才会被释放。执行下一步。




标签:TimingDelay,函数,HSE,SYSCLK,笔记,STM32F407,PLL,时钟
来源: https://blog.csdn.net/qq_42884582/article/details/106612112