STM32
直播中

jsqueh

8年用户 1177经验值
私信 关注
[问答]

请问一下stm32的systick实现精准延时的方法是什么?

请问一下STM32的systick实现精准延时的方法是什么?

回帖(1)

毛雅清

2021-11-24 09:28:27
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;        //清空计数器
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分