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

发布者:大树下的大白菜y最新更新时间:2018-04-23 来源: eefocus关键字:STM32  硬件调试  函数卡死 手机看文章 扫描二维码
随时随地手机看文章

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


关键字:STM32  硬件调试  函数卡死 引用地址:STM32硬件调试过程遇中到Delay_ms()函数卡死的问题

上一篇:STM32学习笔记——高级定时器TIM1更新中断配置
下一篇:STM32 延时函数解析

推荐阅读最新更新时间:2024-03-16 16:00

stm32之keil开发环境搭建
本篇内含工程建立以及JLINK设置,内容借鉴了前人经验,在此感谢各位前人的贡献。 1 下载stm32F10x的官方库 http://www.st.com/web/en/catalog/tools/PF257890 2 新建工程 工程名设为stm32_demo,选择芯片型号为STM32F103B,如图, 因为下载的stm32库中有启动代码,所以这里选择 否 ,不拷贝启动代码。 在工程文件下,新建Startup 、Headers、User、Libraries、CMSIS、Lists、Output文件夹。 文件夹 用途 Startup 启动文件,Flash在16~32Kb小容量,64~128Kb中
[单片机]
<font color='red'>stm32</font>之keil开发环境搭建
STM32_ADC单通道单次采集
一、RCC时钟配置 该函数位于在bsp.c文件下面; 使能RCC时钟:RCC_APB2Periph_ADC1 二、引脚配置 该函数位于在adc.c文件下面; 对AD通道2所使用的引脚进行配置。 问题: 细心的人可能会发现数据手册中PA2引脚的复用功能是“ADC123_IN2”,我们明明使用的ADC1,为什么不是ADC1_IN2或者ADC2_IN2? 大家先想一下为什么是ADC123_IN2,最后我会揭晓答案。 三、ADC配置 该函数位于在adc.c文件下面; 对AD进行配置。 配置的每一条语句都有注释,请看源代码,重点讲一下“ADC_Channel_2”,这里必须和上面引脚配置对
[单片机]
STM32_ADC单通道单次采集
STM32菜鸟之初始化函数以及延时函数
1、STM32时钟配置初始化函数: void Stm32_Clock_Init(){ unsigned char temp = 0; //定义一个无符号型的char类型的变量,变量名为temp MYRCC_DeInit(); //复位并配置向量表,此函数是keil自动写好的,可以不用去管他 RCC- CR |= 0x00010000; //把stm32的时钟控制寄存器的第16位置1来使能外部时钟(HSE),具体说明见STM32参考手册第85页对RCC_CR寄存器的说明 while(! (RCC- CR 17)); //判断RCC_CR寄存器的第17位,即判断外部高速时钟是否就绪 RCC- CFGR = 0x0000040
[单片机]
STM32外设驱动篇——AT24C02(I2C接口)
SOC:STM32F103RCT6 软件平台:STM官方库V3.5.0 开发工具:Keil 1. 摘要   本文章将给出STM32F103RCT6控制AT24C02的代码。如有疑问和错误,欢迎留言告之。 2.硬件连接 AT24C02使用I2C进行数据访问,板子上使用STM32的I2C控制器2和AT24C02进行连接。 具体来说,PB10作为SCL和AT24C02相连,PB11作为SDL和AT24C02相连。 这里就不给出硬件连接图了,比较简单。 3. AT24C022C访问代码(轮询) I2C这里使用轮询方法,不是中断,请留意。 首先,给出I2C控制器的初始化代码,和读写代码,一共三个函数,对应三个功能。 注
[单片机]
STM32 启动文件选择
简介:STM32 启动文件选择的简单介绍 - startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices - startup_stm32f10x_ld.s: for STM32 Low density devices - startup_stm32f10x_md_vl.s: for STM32 Medium density Value line devices - startup_stm32f10x_md.s: for STM32 Medium density devices - startup_stm32f10x_hd.s: for
[单片机]
STM32GPIO口的工作原理
stm32f4有7组IO口,每组有16个IO口,GPIO的的引脚与外部设备连接,可以实现与外部的通信,控制外部硬件,采集外部硬件数据的功能,与之对应的常见应用分别为串口,电机 ,ADC采集。 GPIO口的基本结构 每个GPIO口的内部都有这样一个电路图 GPIO有四种输入模式(浮空输入,上拉输入,下拉输入,模拟输入),四种输出模式(开漏输出,开漏复用输出,推挽输出,推挽复用输出)。 此外,GPIO在输出模式下支持三种翻转速度2MHz,10MHz,50MHz,在不要求转换速度很快的情况下,一般采用低速,目的是节省功耗。但是在通信协议中一般采用50MHz, GPIO_Mode_AIN 模拟输入 GPIO_Mode_IN
[单片机]
STM32GPIO口的工作原理
STM32几种操作的寄存器版本和库函数版本对比
1、USART1接收完成标志检测 USART1- SR&0X40 == 0 USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET 2、USART1发送数据 USART1- DR = (u8) ch; USART_SendData(USART1,(u8)ch);
[单片机]
认识STM32的复位与电源管理
复位功能是一个非常重要的功能,大到PC,小到单片机,每一台计算机系统都有。在我小时候,去网吧的时候,但凡是电脑出现任何一点小问题,网管的第一回答一定是重启。重启和复位就是同一个意思。 发展到现在PC已经很稳定了,复位按钮慢慢的淡出我们的视野,但是在主板上我们依然可以找到复位电路的存在。单片机上的复位功能也有着类似的变化,在我们学单片机那个年代,需要在单片机的外部一个复位电路,从专用引脚上接一个电阻和电容组成的复位电路。如果没有这个电路,单片机就没法工作。现在的新款单片机都把复位功能内置到单片机中。如果是开发项目要手动复位,我们可以在复位引脚上接一个按键用来手动复位。 复位 复位功能的作用是让RAM 中的数据清空,让所有连接
[单片机]
认识<font color='red'>STM32</font>的复位与电源管理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved