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