标题: 关于STM32单片机嘀嗒定时器SysTIck的疑惑 [打印本页]

作者: shaofengxu2000    时间: 2023-9-14 09:37
标题: 关于STM32单片机嘀嗒定时器SysTIck的疑惑
各位老师,嵌入式大拿:
本人初学,关于嘀嗒定时器请各位给指点一下,static u32 time;

void Delay(u32 t)
{
        time=t;//要计时的数
        while(time!=0);        //这个地方一直等待,循环---看中断后time值--循环,直到等于0
}

void SysTick_Handler(void)
{
        time--;//中断后做一件事情,time-1;
}
int main()
{
        SysTick_Config(SystemCoreClock/1000);//确定中断间隔
Delay(200);
}
通过以上代码可以实现延时,那么在Delay中其实就是cpu不断循环,看一下中断继续循环直到目标时间全部结束, 那么这个过程中CPU是不是不可以用来做其他操作?

如果CPU原地打转,那么定时器不就是为了解放CUP的么,嘀嗒的意义何在呢?
还请高手能够指点迷津,不胜感激!

作者: Hephaestus    时间: 2023-9-14 10:04
这种写法就是死等,不可以进行别的操作,想要解放CUP就不能要BRA。
作者: shaofengxu2000    时间: 2023-9-14 12:47
Hephaestus 发表于 2023-9-14 10:04
这种写法就是死等,不可以进行别的操作,想要解放CUP就不能要BRA。

谢谢,感觉就是死等和直接while循环并没有什么区别,要说有就是精确了。
作者: Y_G_G    时间: 2023-9-14 12:53
SysTIck和软件延时其实并没有本质上的区别,都是死等,无非就是精度,不被打断之类的区别
在一些数码时钟,温度控制......之类,对效率要求不高的地方,用来做精确延时的,因为并不是所有的程序都需要很高效率的
但如果是对CPU效率要求很高的地方,延时就不能用这种方法了
作者: lkc8210    时间: 2023-9-14 15:21
非死等式
  1. static u32 time = 200;

  2. void SysTick_Handler(void)
  3. {
  4.         if(time)time--;//中断后做一件事情,time-1;
  5. }
  6. int main()
  7. {
  8.         SysTick_Config(SystemCoreClock/1000);//确定中断间隔
  9.         while(1)
  10.         {
  11.                 if(!time)
  12.                 {
  13.                         time = 200;
  14.                         //your code
  15.                 }
  16.         }
  17. }
复制代码




作者: sttt300    时间: 2023-9-14 15:37
嘀嗒定时器是一直计数,如果中断了,CPU跑去做其他事,再回来,这延时就加长了
嘀嗒定时器设计的目的就是提供一个精确的等待延时,并不是当普通定时器来用
如果有需要在延时的时候去干点别的,就要用普通的定时器Timer
在stm32cubeMX中,SysTick默认的中断优先级时比较低的,会被其他中断打断
而如果不小心在中断中加了嘀嗒定时器的延时,那就会直接卡死






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1