stm32如何使程序卡死

现在论坛里面都是程序崩溃找不到方法,今天我们反其道而行,讨论在程序中写入一些东西使程序卡死。

我的检测方法是用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战队电控组)所有,需要转载或引用请注明来历和作者,若为其他用途或者有其他疑问则联系本文作者。

猜你喜欢

转载自blog.csdn.net/weixin_45850927/article/details/121055396