一、前因后果
工程中,设备为了稳定可靠,会增加外部看门狗,但是外部看门狗一旦启动,就停不下来,必须在固定的时间范围内进行喂狗,不然看门狗芯片就会产生一个复位信号复位MCU。以前大家都认为看门狗一旦工作,就不能进行控制,也不便于程序调试,所以在硬件上,会使用单片机来控制看门狗芯片的电源,原理图如下:
最近在工程中由于MCU的复位信号一直是低电平,导致程序下不下去,最后查原因,发现是看门狗电路这一块造成的,然后就仔细看SP706SEN的手册,发现WDI引脚这样描述:如果WDI引脚处于浮空或高阻状态,则禁止看门狗功能;
二、程序处理
在程序中,初始化引脚时,把WDI初始化为浮空输入,当需要开启看门狗的时候,把WDI引脚设置为推挽输出,开启后,在定时器函数里翻转该引脚状态,以达到喂狗的目的,程序如下:
1 /*Configure GPIO pin : PtPin */ 2 GPIO_InitStruct.Pin = WATCHDOG_FLAG_Pin; 3 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 4 GPIO_InitStruct.Pull = GPIO_NOPULL; 5 HAL_GPIO_Init(WATCHDOG_FLAG_GPIO_Port, &GPIO_InitStruct); 6 7 } 8 9 /* USER CODE BEGIN 2 */ 10 // 开启看门狗函数 11 void watchDogEN(void) 12 { 13 GPIO_InitTypeDef GPIO_InitStruct; 14 GPIO_InitStruct.Pin = WATCHDOG_FLAG_Pin; 15 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 16 GPIO_InitStruct.Pull = GPIO_NOPULL; 17 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; 18 HAL_GPIO_Init(WATCHDOG_FLAG_GPIO_Port, &GPIO_InitStruct); 19 }
1 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 2 { 3 if(htim == (&htim3)) // 定时1s 4 { 5 HAL_GPIO_TogglePin(WATCHDOG_FLAG_GPIO_Port, WATCHDOG_FLAG_Pin); // 喂狗 6 HAL_GPIO_TogglePin(RUN_GPIO_Port, RUN_Pin); 7 } 8 else if (htim == (&htim4)) 9 { 10 SensRxFlag = 1; 11 } 12 }