ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-06-09 19:06:59  阅读:630  来源: 互联网

标签:TimingDelay 函数 HSE SYSCLK 笔记 STM32F407 PLL 时钟


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有