单片机
返回首页

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

2018-04-23 来源:eefocus

程序在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循环中。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章