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

您所在的位置:网站首页 stm32f407ret6资料 STM32F407时钟树与系统时钟学习笔记

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

2024-02-06 15:45| 来源: 网络整理| 查看: 265

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时,延时函数才会被释放。执行下一步。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3