配置
wwdg配置:
104是递减计数器刷新值
96上限窗口值
8分频值
配置中断:
超时计算公式:
计数频率= psc∗4096/8000000 =244HZ(记一次数需要时间约4ms)
超时时间=记一次数需要时间∗(counter−64)=4ms∗(104−64)≈160ms
以此类算出上限前的时间为=记一次数需要时间∗(window value -64)=4ms*(96-64)=128ms
所以只能在128ms-160ms间刷新喂狗,否则看门狗使其复位
代码
int fputc(int ch,FILE *f)
{
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1,temp,1,2);
}
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)//wwdg中断回调喂狗
{
HAL_WWDG_Refresh(hwwdg);//喂狗此时是计数器达到下窗口值时
}
主函数:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_WWDG_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("****start******\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(30);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_3);
printf("****running****\n");
}
/* USER CODE END 3 */
}
仿真
中断不喂狗效果:
中断喂狗效果: