STM32系统时钟和delay函数详解

stm32系统时钟:

对于stm32来说,什么是时钟?

时钟是具有周期性的脉冲信号,通常是占空比50%的方波。

配置时钟的步骤:

1.配置HSE_VALUE——外部晶振频率8mhz(F103)

2.调用SystemInit函数——配置外部存储器,中断向量表配置

3.在main函数里调用用户编写的时钟设置函数

认识时钟树:

以上是F1的时钟树,其中,OSC_OUT和OSC_IN是外部高速时钟源,OSC32_IN和OSC32_OUT是外部低速时钟源,经过PLLXTPRE选择器进行倍频系数选取,在经过PLLSRC选择是外部时钟源还是内部时钟源,经过PLL锁相环倍频得到PLLCLK,锁相环的作用输入时钟净化和进行倍频。其中,AHB时钟=HCLK时钟=72Mhz,Cortex系统时钟是系统滴答定时器。

时钟选择包括外部时钟和内部时钟,一般都是选择外部时钟源。

时钟源名称

频率

材料

用途

高速外部振荡器(HSE)

4~16MHz

晶体/陶瓷

SYSCLK/RTC

低速外部振荡器(LSE)

32.768KHz

晶体/陶瓷

RTC

高速内部振荡器(HSI)

8MHz

RC

SYSCLK

低速内部振荡器(LSI)

40KHz

RC

RTC/IWDG

系统时钟从STM32CubeMx中来看:

STM32F103最大系统时钟为72MHz,HSE与HSI想要得到72MHz需要经过PLL锁相环进行倍频,内部时钟能达到的最大频率为64Mhz,

低速时钟源,LSI常作为独立看门狗和RTC时钟源。

delay延时函数:

延时函数的思想:

主要使用的是系统滴答定时器来实现延时的思想,主要用于提供系统时基。SysTick 是一个 24 位的向下递减的计数定时器,当计数值减到 0 时,将从 RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。只要不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息。

但系统滴答定时器一般不能随意更改,要实现delay_ms和delay_us的延迟,主要采用时钟摘取法。都是基于delay_us来实现ms的延迟。

假设使用delay_us(50),系统时钟频率72Mhz,systick的频率经过8分频后,时钟频率为9Mhz,每增加1,就是1/9us,然后我们就一直统计 systick 的计数变化,直到这个值变化了 50*9,一旦检测到变化达到或者超过这个值,就说明延时 50us 时间到了。

下表是systick寄存器含义:

使用正点原子的delay函数用法:

首先扩大时间加载的倍数,清空计数器,使能systick,然后不断获取位0的值,监测位15是否到达1,证明已经完成递减。关闭systick,清空计数器。

ms的延时函数:

以72Mhz为例,systick时钟频率9Mhz,计一个数时间1/9us,可以计2的24次方个,也就是说可以延迟1.864s,如果为128Mhz,就是1s左右,在换算成毫秒,可以实现毫秒级延迟。

作者:行者、Z

物联沃分享整理
物联沃-IOTWORD物联网 » STM32系统时钟和delay函数详解

发表评论