stm32 HAL库学习笔记6——独立看门狗
环境
- 开发板:stm32F407ZG EXPLORER
- STM32CubeMX: Version 6.1.0
CubeMX设置
- IWDG时钟为32KHz
- IWDG 设置
CubeMX 生成的代码
- main.c
注意:hal库中与原子标准库demo中,关于分频值有区别,原子标准库中为4分频,对应hal库的分频值为64
/**
* @brief IWDG Initialization Function
* @param None
* @retval None
*/
static void MX_IWDG_Init(void)
{
/* USER CODE BEGIN IWDG_Init 0 */
/* USER CODE END IWDG_Init 0 */
/* USER CODE BEGIN IWDG_Init 1 */
/* USER CODE END IWDG_Init 1 */
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 500;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN IWDG_Init 2 */
/* USER CODE END IWDG_Init 2 */
}
添加的代码
- 键值枚举变量
/* USER CODE BEGIN PTD */
typedef enum {
KEY_WAKEUP=0,
KEY_0,
KEY_1,
KEY_2,
KEY_NULL
}KEY_user_t;
/* USER CODE END PTD */
- 以下代码作用是当看门狗超时重启时,DS0熄灭一次
/* USER CODE BEGIN 2 */
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET);
/* USER CODE END 2 */
- 以下代码作用是,不停的按KEY_UP键 喂狗,这样DS0就不会熄灭
/* USER CODE BEGIN WHILE */
while (1)
{
if ( key_input == KEY_WAKEUP ) {
HAL_IWDG_Refresh( &hiwdg );
key_input = KEY_NULL;
}
/* USER CODE END WHILE */
- 按键响应
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_Delay(20);
switch (GPIO_Pin) {
case GPIO_PIN_0:
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
//HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_8);
key_input = KEY_WAKEUP;
printf("wake up\r\n");
}
break;
case GPIO_PIN_2:
......
另外: CubeMX 生成的代码缩进为2个空格,所以为了同一可以将keil设置如下