【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
项目开发中,我们总是希望固件代码能够稳定、健壮。为此,我们进行了各种软件质量管理,从需求开发开始,一直到静态检查、单元测试、代码review、黑盒测试、压力测试等等。但是,谁也不能保证,经过这样的流程验证之后,软件质量就是万无一失的。所以,为了解决mcu死锁的问题,人们设计了开门狗这个功能。
所谓的看门狗,就是要求我们单位时间内必须有一个喂狗操作。如果没有做到这一点,那么系统就会reset复位重启。为什么做不到这一点呢?一般就是程序跑飞,或者是系统进入了死循环状态。看门狗只是我们系统开发的底线,并不意味着我们就不需要做好软件质量的管理了。
今天,我们继续看下stm32f103下面看门狗是怎么做的?
1、直接查看main函数
main函数是系统功能的主窗口,我们从这里出发,
int main(void)
{
SystemClock_Config();
LED_GPIO_Config();
LED1_OFF;
Key_GPIO_Config();
IWDG_Config(IWDG_PRESCALER_64 ,625);
HAL_Delay(200);
while(1)
{
if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON )
{
HAL_IWDG_Refresh(&IWDG_Handle);
}
LED1_ON;
}
}
代码本身并不复杂。首先设置时钟,接着配置LED,并且把LED熄灭。然后配置输入key。这一切都做完之后,就到了今天的重点,配置和启动看门狗,时间为1s。这个地方,我们延时200ms,主要是为了观察使用,使得系统启动后有一个明显的熄灯动作。
初始化都做完之后,下面就是开始循环检测。如果系统发现KEY1被按下去的时候,那么定时喂狗,LED持续点亮。如果没有,那么我们可以看到,LED灯周期性熄灭,这主要是发生了系统重启复位。
2、看门狗初始化
关于看门狗的设置,建议会使用、会配置参数就好了,
void IWDG_Config(uint8_t prv ,uint16_t rlv)
{
IWDG_Handle.Instance = IWDG;
IWDG_Handle.Init.Prescaler = prv;
IWDG_Handle.Init.Reload = rlv;
HAL_IWDG_Init(&IWDG_Handle);
}
3、喂狗操作
这里喂狗的操作直接调用了HAL_IWDG_Refresh函数即可。
4、其他所要做的修改
因为我们测试的是stm32f103核心板,和代码匹配的板子不一样,所以一部分配置需要修改下。第一,LED需要绑定到pc13上面;第二,只需要一个a0 key,另外一个可以删除掉;第三,Key_Scan函数修改成非阻塞的形式;第四,SysTick_Handler中一定要添加HAL_IncTick,不然HAL_Delay会hang在那里。
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )
{
return KEY_ON;
}
else
{
return KEY_OFF;
}
}
5、编译、测试
测试相对就比较简单了。首先我们确保编译没有问题,接着通过st-link v2下载到开发板上,最后用短接线把a0和gnd或者3.3v进行短接。观察一下,如果接到gnd发生了闪烁,但是接到3.3v没有闪烁,这就代表看门狗发挥了效果。反之,就要去好好检查失败的原因了。
另外为了测试方便,可以把烧录后重启勾选上,