当前位置: 代码迷 >> 综合 >> 【stm32】debug时总是卡在B处
  详细解决方案

【stm32】debug时总是卡在B处

热度:79   发布时间:2024-02-02 10:14:53.0

问题原因:

程序卡死在B处说明有中断没有处理,导致程序进入中断后无法跳出。

之后查看程序发现,程序中定义了一个中断,但是之前一次偶然把中断处理程序屏蔽了,导致没有中断处理函数

问题解决:

代码卡死在SysTick_Init()处

int main(void){		BASIC_TIM_Init();         //基本定时器初始化GENERAL_TIM_Init();       //通用定时器初始化 SysTick_Init();           //系统定时器初始化DEBUG_USART_Config();		 	//串口初始化                       FSMC_SRAM_Init();			    //外部SRAM初始化 

debug时进入函数SysTick_Init()内,卡在if (SysTick_Config(SystemCoreClock / 100000))处

/*** @brief  启动系统滴答定时器 SysTick* @param  无* @retval 无*/
void SysTick_Init(void)
{/* SystemFrequency / 1000    1ms中断一次* SystemFrequency / 100000	 10us中断一次* SystemFrequency / 1000000 1us中断一次*/
//	if (SysTick_Config(SystemFrequency / 100000))	// ST3.0.0库版本if (SysTick_Config(SystemCoreClock / 100000))	// ST3.5.0库版本//10us中断一次{ /* Capture error */ while (1);}
}/*** @brief   us延时程序,10us为一个单位* @param  *		@arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us* @retval  无*/
void Delay_us(__IO u32 nTime)
{ TimingDelay = nTime;	// 使能滴答定时器  SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;while(TimingDelay != 0);
}/*** @brief  获取节拍程序* @param  无* @retval 无* @attention  在 SysTick 中断函数 SysTick_Handler()调用*/
void TimingDelay_Decrement(void)
{if (TimingDelay != 0x00){ TimingDelay--;}
}

阅读代码,发现中断函数并未调用TimingDelay函数

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

进入系统的中断函数文件:stm32f10x_it.c/h里面,修改系统自带的systick函数。这个函数要么没有声明或是为空操作。这里加入
定时延时里的处理。即中断后,全局变量做个--处理即可。也即调用上图的代码。

在::stm32f10x_it.c里修改如下:
添加外部的声明:

extern void TimingDelay_Decrement(void);

 修改这个函数: SysTick_Handler,这是系统的关于SysTick_Handler的中断服务程序名,
在启动文件里如:startup_stm32f10x_hd.s   有它的定义的名字。不要弄错了。否则无法中断处理。

void SysTick_Handler(void)
{TimingDelay_Decrement();
}

 以上,即定义配置好了Systick定时器。如何使用呢?
很简单。
Delay_us(500);  即为延时500ms。

 当然,使用前,需要先初始化:
SysTick_Init();
否则无法使用并影响后续的程序运行,这个很重要,就像打开了串口中断,你不清标志位,也同样在接收字符后,CPU中断在那里,而不能继续执行!。使用外设功能,需要初始化!

  相关解决方案