现在论坛里面都是程序崩溃找不到方法,今天我们反其道而行,讨论在程序中写入一些东西使程序卡死。
我的检测方法是用LED灯的亮灭来判断,使用窗口看门狗令程序复位。
代码如下(以下代码省略初始化,只有main.c里的文件):
//程序重点
__asm void HAHDAI(void)
{
BX R0
}
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2
delay_init(168); //初始化延时函数
UART_Init(115200); //初始化打印串口
LED_Init(); //初始化LED
KEY_Init();
delay_ms(1000);
// TIM6_Init(1000);
GPIO_ToggleBits(GPIOH,GPIO_Pin_10);
delay_ms(500);
GPIO_ResetBits(GPIOH,GPIO_Pin_11 | GPIO_Pin_12);//亮白灯
WWDG_Init(0x7F,0X5F,WWDG_Prescaler_8);
while(1)
{
GPIO_ToggleBits(GPIOH,GPIO_Pin_11);
delay_ms(50);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0)//按键按下
{
HAHDAI();
}
}
}
int i = 0;
//void TIM6_DAC_IRQHandler()
//{
// if(TIM_GetITStatus(TIM6,TIM_IT_Update) == SET)
// {
// i++;
// if(i%50 == 0)
// {
// GPIO_ToggleBits(GPIOH,GPIO_Pin_10);
// }
// }
// TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
//}
int ii =0;
//窗口看门狗中断服务程序
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT); //重设窗口看门狗值
WWDG_ClearFlag();//清除提前唤醒中断标志位
ii++;
}
函数体里面的是B指令,即最简单的跳转指令,当程序写入B指令时,ARM处理器会立刻跳转至给定的目标地址。在给定的地址里继续运行。而我们的程序里面给的是一个不存在的地址R0,故程序不能正常运行,窗口看门狗复位。
该程序运行时,没有按下按键时,程序正常运行,即程序运一秒后蓝色灯亮0.5秒,然后蓝色和绿色LED闪烁。按下按键后,HAHDAI函数运行,可以看到此时LED熄灭,一秒后又运行了上述内容,可以看出程序被复位。这样就实现了用简单的代码实现程序卡死。
版权归作者(Alliance战队电控组)所有,需要转载或引用请注明来历和作者,若为其他用途或者有其他疑问则联系本文作者。