STM32硬件调试过程遇中到Delay_ms()函数卡死的问题

原创 2016年08月30日 20:14:16
程序在LCD初始化过程中卡死,通过硬件调试发现卡在Delay_ms()函数,转到定义发现其为Delay_us的宏定义函数:
#define Delay_ms(x) Delay_us(1000*x)//单位ms
即延迟x单位ms,转到Delay_us()函数定义:
void Delay_us(__IO u32 nTime)
{ 
    TimingDelay = nTime;    
    while(TimingDelay != 0);
}
可以发现若参数TimingDelay不为零则此处为while死循环,通过研究发现TimingDelay参数需要在系统滴答定时器中断中递减,即:
/**@filename stm32f10x_it.c 
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
    TimingDelay_Decrement();
}
函数TimingDelay_Decrement()定义如下:
/*-------------------------------------------------------------------------------
程序名称:TimingDelay_Decrement
程序描述:数字递减直到0  
输入参数:无
返回参数:无
备    注:需要在中断函数SysTick_Handler()中调用
---------------------------------------------------------------------------------*/
void TimingDelay_Decrement(void)
{
    if (TimingDelay != 0x00)
    { 
    TimingDelay--;
    }
}
程序卡死的原因就是中断函数SysTick_Handler(void)中没有对TimingDelay进行递减(没有调用函数TimingDelay_Decrement())从而跳不出死循环
另外值得注意的是SysTick使用前必须初始化,以使能中断:
void SysTick_Init(void)
{
     // SystemFrequency / 1000       1ms中断一次
     // SystemFrequency / 100000     10us中断一次
     // SystemFrequency / 1000000    1us中断一次

    if (SysTick_Config(SystemCoreClock / 1000000))    // 1us ST3.5.0库版本
    { 
        /* Capture error */ 
        while (1);
    }
}
若不使能中断会导致无法进入定时器中断函数,也会卡死在while循环中。

版权声明:本文为博主原创文章,转载请声明出处:)

Delay_ms延时函数详解

void Delay_ms(unsigned int time) { unsigned char n; while(time>0) { for(n=0;n
  • sxnuqk
  • sxnuqk
  • 2017年11月13日 21:24
  • 269

中断里调用HAL_Delay()进入死循环的原因

CUBE生成的程序中, SysTick是中断型延时(利用中断来查询时间到了没)。   /* Use systick as time base source and configure 1ms ti...
  • alwxkxk
  • alwxkxk
  • 2015年08月02日 09:50
  • 3934

STM32延时函数的三种方法——最好掌握第三种

单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。 1.普通延时法 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来...
  • luodonghuan1
  • luodonghuan1
  • 2015年06月20日 14:25
  • 14307

关于STM32莫名死机的一些问题记录

问题描述 ZET6跑了ucosII系统,在运行过程中有时会出现死机的情况,经过硬件调试发现,是进入延时的时候导致的这个问题,延时函数是没有问题的,而且这个问题是偶尔出现 问题排查 死机之后指针指向了硬...
  • CallMeSumo
  • CallMeSumo
  • 2017年06月02日 10:10
  • 983

中断中处理延时及一些函数的调用规则

转自:http://blog.csdn.net/samantha_sun/article/details/6790492 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kma...
  • wff_wf
  • wff_wf
  • 2018年01月16日 16:38
  • 20

stm32 使用正点原子delay延时函数,主函数延时失效

stm32 使用正点原子延时函数库 主函数延时失效
  • ylzmm
  • ylzmm
  • 2017年10月31日 14:18
  • 315

STM32菜鸟成长记录---系统滴答定时器(systick)应用

1.systick介绍      Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。滴答中断?这里来简单地解释一下。操作系...
  • pppjza
  • pppjza
  • 2015年07月31日 10:35
  • 444

void HAL_Delay(__IO uint32_t Delay) 函数溢出的问题

计数器的更新计数器uwTick是在每次Systick中断中加一更新,此处配置Systick中断为每1ms中断一次。uwTick为uint32_t类型,那么uwTick的最长计时为0xFFFFFFFF毫...
  • sinat_20598829
  • sinat_20598829
  • 2017年08月23日 17:51
  • 219

stm32系统在线调试时程序运行正常输出正常,但是一旦把程序烧写进去则输出不正常

stm32系统在线调试时程序运行正常输出正常,但是一旦把程序烧写进去则输出不正常。后面对比正确的程序配置发现只要把debug 下的run to main勾选框勾选即可。 勾选后重新编译一下,...
  • yayasidak
  • yayasidak
  • 2016年01月05日 18:59
  • 1900

stm32 使用正点原子delay延时函数,主函数延时失效

stm32 使用正点原子延时函数库 主函数延时失效
  • ylzmm
  • ylzmm
  • 2017年10月31日 14:18
  • 315
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STM32硬件调试过程遇中到Delay_ms()函数卡死的问题
举报原因:
原因补充:

(最多只允许输入30个字)