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