【stm32】debug时总是卡在B处

问题原因:

程序卡死在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中断在那里,而不能继续执行!。使用外设功能,需要初始化!

你可能感兴趣的:(stm32,stm32)