• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

STM32 systick延时问题

代人凌峰 2017-12-22 浏览量:2091

systick延时程序参考野火的例程

#include "SysTick.h"

static __IO u32 TimingDelay;


void SysTick_Init(void)
{
 if (SysTick_Config(SystemCoreClock / 100000)) 
 { 
  while (1);
 }
 SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}


void Delay_us(__IO u32 nTime)
{
 TimingDelay = nTime; 

 SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;

 while(TimingDelay != 0);
}


void TimingDelay_Decrement(void)
{
 if (TimingDelay != 0x00)
 {
 TimingDelay--;
 }
}


void SysTick_Handler(void)
{
 TimingDelay_Decrement(); 
}

平常使用是没有任何问题的,但是有时候在定时器中断中调用延时函数就会卡死在延时中,

 while(TimingDelay != 0); 就是这一句话,不知道有没有人遇到这样的问题

​​

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 定时器的中断等级一般都高于systick中断,你在其中运行程序,按理应该是进不了sysytick中断的吧,设置成非中断延时应该会好一点

    参考下这个http://blog.csdn.net/hust_xu/article/details/47088365

    确实如上所说,中断里的代码尽量精简,只设置一些标志位,在主函数里轮询会好一点
    • 发布于 2017-12-25
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :前缀NCV的符合汽车级,具备PPAP功能,MC7812BD2TR4G:通用级 回复

其他答案 数量:5
  • 卡死应该是TimingDelay数值过大或者TimingDelay没有进行自减操作。

    • 发布于2017-12-22
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :这个附件产品molex已经报废,产品系卖给TE厂牌。现在有由TE生产。以下截图有TE的型号。 回复

  • 定时器中断最好不要加延时,非常容易出现你这个问题
    • 发布于2017-12-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 定时器中断中,要尽量简化程序内容,只进行标志位赋值这样的简单操作,最好别有占用时间较长的函数。

    你可以这样操作:

    设置一个系统标志位name_flag;

    然后在定时器中断中进行置1,在主循环中检测name_flag等于1时,执行你需要在定时器中执行的函数,并将该标志位置0.


    • 发布于2017-12-23
    • 举报
    • 评论 2
    • 0
    • 0
代人凌峰 回复了 qizc :我想要获得快速响应,但是又必须用到精确延时,该怎么办 回复
电子老工程师 回复了  :HIF3BA-30D-2.54C(63)是HIF3BA-30D-2.54C(即将停产)替代料件。 回复

  • 中断里面,只进行标志位清除赋值的操作;像延时、取数据、筛选数据等耗时的操作不放在里面。
    • 发布于2017-12-25
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :就是, 回复

  • 定时器和滴答定时器的中断有冲突了
    • 发布于2017-12-25
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

STM32 systick延时问题