赞
踩
时钟系统是CPU的“脉搏”。只有有了系统时钟单片机才会协调、稳定的工作。STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切问题。
STM32整个系统的时钟源、时钟流向等都放在这个时钟框图中
STM32F4可以有5个时钟源:
SysTick一系列定时器,是属于CortexM4内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器。计数器每计数一次的时间为:1/SYSCLK。当重装载数值寄存器的值递减到0时,系统定时器产生一次中断,以此循环往复。
基础知识:
f
f
f代表频率,单位是HZ(次/秒);
T
T
T代表周期,单位是s(秒)。
频率与周期:
f
(
H
z
)
=
1
/
T
(
s
)
f(Hz)=1/T(s)
f(Hz)=1/T(s),1Hz:1s;1KHz:1ms;1MHz:1us;100MHz:10ns
1 秒(s) = 1000 毫秒(ms)
1 毫秒(ms) = 1000 微秒(us)
1 微秒(us) = 1000 纳秒(ns)
SysTick定时器的工作原理图如下所示:
【例如】计数时钟使用系统时钟SYSCLK:100MHz,则计数一次的时间为:10ns,我们需要延时1us,则需要100次计数。需要延时1ms,则需要计数100 000次。
SysTick是属于CortexM4的外设,所以有关寄存器的定义和配置函数都在core_m4.h文件中。SysTick一共有4个寄存器,见下表。其中定时器配置时只需要配置前三个寄存器,最后一个校准寄存器不需要配置。
首先需要初始化SysTick定时器,选择时钟源,以及设置计数器因子
static uint8_t fac_us=0; // 计数器因子
void Delay_init(uint8_t SysCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // 设置SysTick时钟源:HCLK/8
fac_us=SysCLK/8; // 设置计数器因子
}
然后就是延时函数的编写,分别实现了ms和us的延时函数,在这里均使用查询的方式进行SysTick的延时,中断方式延时将在后续操作系统中讲解。
/// @brief nus延时 /// @param nus 延时的nus数 void delay_us(uint32_t nus) { uint32_t temp; SysTick->LOAD=nus*fac_us-1; // 计数值加载 SysTick->VAL=0x00; // 清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; // 开始计数 do { temp=SysTick->CTRL; // 读取控制寄存器状态 }while((temp&0x01)&&!(temp&(1<<16))) // temp&0x01:定时器使能,!(temp&(1<<16)):定时器计数值不为0 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; // 关闭计数 SysTick->VAL=0x00;// 清空计数器 } /// @brief nms延时 /// @param nus 延时的ms数 void delay_ms(uint32_t nms) { uint32_t repeat=nms/540; uint32_t remain=nms%540; while(repeat) { delay_us(540*1000); // 延时 540 ms repeat--; } if(remain) { delay_us(remain*1000); // 延时remain ms } }
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。