基于stm32的精确延时利用系统滴答systick 下载本文

内容发布更新时间 : 2024/5/21 5:10:28星期一 下面是文章的全部内容请认真阅读。

基于 stm32 的精确延时利用系统滴答 systick

利用系统滴答定时器来实现精确延时,需要以下五步:1、设置滴答定时 器的时钟,通过设置其控制寄存器,选择外部时钟,即为系统时钟的八分之一, 若系统时钟为 72M,则滴答定时器时钟为 9M。即定时一秒需要 9M 个时钟周 期。

2、设置滴答定时器的重装载寄存器的数值,即需要延时的时钟周期数。如: 若需要延时 20 微秒,则重装载值为 20*9.若要延时 20 毫秒,则设置重装载值 为 20*9000.

3、清空滴答定时器当前值寄存器的值,使之为零,以便使能计数时能够从 设定值开始倒数计时。

4、设置滴答定时器的控制寄存器,开始倒计数。

5、查询滴答定时器的状态位,定时时间到,关闭定时器,清空定时器当前 值。

void delay_init(u8 SYSCLK) {

SysTick->CTRL&=0xfffffffb;//控制寄存器,选择外部时钟即系统时钟的八分 之一(HCLK/8;72M/8=9M) fac_us=SYSCLK/8; (72/8=9,单位为微妙)

fac_ms=(u16)fac_us*1000; //一毫秒所需的时钟周期数(9000) }

void Delay_us(u32 nus) {

//定义全局变量,即延时一微秒所需的的时钟周期数

u32 temp;

SysTick->LOAD=nus*fac_us; //时间加载(即延时多少个时钟周期) SysTick->VAL=0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数 do {

temp=SysTick->CTRL; }

while(temp&0x01&&!(temp&(1 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } 或者

void Delay_us(u32 Nus) {

SysTick->LOAD=Nus*9; //时间加载 72M 主频 SysTick->CTRL|=0x01; //开始倒数 while(!(SysTick->CTRL&(1

SysTick->CTRL=0X00000000; //关闭计数器 SysTick->VAL=0X00000000; //清空计数器 }

tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!