stm32的systick(滴答定时器)实现精准延时

stm32具有systick定时器,该外设属于内核外设,时钟一般选择系统时钟的8分频。使能后,计数寄存器递减到0后,会自动重装值。
需要注意的是滴答定时器的计数器是24位的,最大值为2^24(16,777,216)。
(1)72MHz利用滴答定时器实现us级延时:
72MHz/8=9Mhz

//最大值:1864135us
void delay_us(u32 i)
{
    u32 temp;
    SysTick->LOAD=9*i;      //设置重装数值
	SysTick->VAL=0;            //清零计数器
    SysTick->CTRL=0X01;        //使能,减到零时无动作,采用外部时钟源(系统时钟的8分频)
    do
    {
        temp=SysTick->CTRL;       //读取当前倒计数值
    }
    while((temp&0x01)&&(!(temp&(1<<16))));    //等待时间到达
    SysTick->CTRL=0;    //关闭计数器
	SysTick->VAL=0;        //清空计数器
}

(2)168MHz利用滴答定时器实现us级延时:
168MHz/2=21MHz

//最大值:798915us
void delay_us(u32 i)
{
    u32 temp;
    SysTick->LOAD=21*i;      //设置重装数值, 72MHZ时
	SysTick->VAL=0;            //清零计数器
    SysTick->CTRL=0X01;        //使能,减到零是无动作,采用外部时钟源(系统时钟的8分频)
    do
    {
        temp=SysTick->CTRL;       //读取当前倒计数值
    }
    while((temp&0x01)&&(!(temp&(1<<16))));    //等待时间到达
    SysTick->CTRL=0;    //关闭计数器
	SysTick->VAL=0;        //清空计数器
}

(3)72MHz利用滴答定时器实现ms级延时:

//最大值:1864ms
void delay_ms(u32 i)
{
    u32 temp;
    SysTick->LOAD=9000*i;      //设置重装数值, 72MHZ时
	SysTick->VAL=0;            //清零计数器
    SysTick->CTRL=0X01;        //使能,减到零是无动作,采用外部时钟源(系统时钟的8分频)
    do
    {
        temp=SysTick->CTRL;       //读取当前倒计数值
    }
    while((temp&0x01)&&(!(temp&(1<<16))));    //等待时间到达
    SysTick->CTRL=0;    //关闭计数器
	SysTick->VAL=0;        //清空计数器
}

(4)168MHz利用滴答定时器实现ms级延时:

最大:798ms
void delay_ms(u32 i)
{
    u32 temp;
    SysTick->LOAD=21000*i;      //设置重装数值, 72MHZ时
	SysTick->VAL=0;            //清零计数器
    SysTick->CTRL=0X01;        //使能,减到零是无动作,采用外部时钟源(系统时钟的8分频)
    do
    {
        temp=SysTick->CTRL;       //读取当前倒计数值
    }
    while((temp&0x01)&&(!(temp&(1<<16))));    //等待时间到达
    SysTick->CTRL=0;    //关闭计数器
	SysTick->VAL=0;        //清空计数器
}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值