实验步骤:
1、使能窗口看门狗时钟(※)
2、设置窗口值, 分频数 和计数器 初始值(※)
3、开启WWDG(※)
4、喂狗(WWDG 的喂狗操作实际就是往 CR 寄存器重写计数器值)
(可选:当窗口看门狗的计数器值减到 0X40 的时候,若开启了中断,则会产生中断,但是计数器仍会递减)
5、使能中断通道并配置中断优先级(※)
6、编写中断服务函数
看门狗的计数器值,随每个窗口看门狗计数周期(4096×分频系数)/PCLK1 减 1
窗口看门狗工作示意图:
1、使能窗口看门狗时钟(※)
不同于独立看门狗,窗口看门狗使用的是PCLK1时钟
__HAL_RCC_WWDG_CLK_ENABLE();
2、设置窗口值, 分频数 和计数器 初始值(※)
WWDG_HandleStruct.Instance = WWDG;
WWDG_HandleStruct.Init.Counter = 0x7f; //0x40~ 0x7f
WWDG_HandleStruct.Init.Prescaler = WWDG_PRESCALER_8; //分频系数 1,2,4,8
WWDG_HandleStruct.Init.Window = 0x5f; //《0x80
HAL_WWDG_Init(&WWDG_HandleStruct);
3、开启WWDG(※)
HAL_WWDG_Start_IT(&WWDG_HandleStruct);
或者
HAL_WWDG_Start(&WWDG_HandleStruct);
注意,两者使用一个即可,我刚开始用时没弄清两个的区别,两个都添加到程序中(先HAL_WWDG_Start,再HAL_WWDG_Start_IT)导致出错(但是反过来却没问题),看了一下源码HAL_WWDG_Start_IT里面包含了HAL_WWDG_Start的操作。
4、喂狗(WWDG 的喂狗操作实际就是往 CR 寄存器重写计数器值)
HAL_WWDG_Refresh(&WWDG_HandleStruct,0x7f);
(可选:当窗口看门狗的计数器值减到 0X40 的时候,若开启了中断,则会产生中断,但是计数器仍会递减)
5、使能中断通道并配置中断优先级(※)
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); //设置优先级分组
HAL_NVIC_SetPriority(WWDG_IRQn,2,2); //设置优先级
HAL_NVIC_EnableIRQ(WWDG_IRQn); //使能中断
6、编写中断服务函数
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&WWDG_HandleStruct);//官方提供HAL_WWDG_IRQHandler
}
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg) //回调函数
{
HAL_WWDG_Refresh(&WWDG_HandleStruct,0x7f);
LED0^=1;
}
建议使用官方的HAL_WWDG_IRQHandler,里面已经添加好了清除中断标志等一系列操作,将自己要做的操作在回调函数HAL_WWDG_WakeupCallback中编写。
实验步骤:
1、使能窗口看门狗时钟(※)
2、设置窗口值, 分频数 和计数器 初始值(※)
3、开启WWDG(※)
4、喂狗(WWDG 的喂狗操作实际就是往 CR 寄存器重写计数器值)
(可选:当窗口看门狗的计数器值减到 0X40 的时候,若开启了中断,则会产生中断,但是计数器仍会递减)
5、使能中断通道并配置中断优先级(※)
6、编写中断服务函数
看门狗的计数器值,随每个窗口看门狗计数周期(4096×分频系数)/PCLK1 减 1
窗口看门狗工作示意图:
1、使能窗口看门狗时钟(※)
不同于独立看门狗,窗口看门狗使用的是PCLK1时钟
__HAL_RCC_WWDG_CLK_ENABLE();
2、设置窗口值, 分频数 和计数器 初始值(※)
WWDG_HandleStruct.Instance = WWDG;
WWDG_HandleStruct.Init.Counter = 0x7f; //0x40~ 0x7f
WWDG_HandleStruct.Init.Prescaler = WWDG_PRESCALER_8; //分频系数 1,2,4,8
WWDG_HandleStruct.Init.Window = 0x5f; //《0x80
HAL_WWDG_Init(&WWDG_HandleStruct);
3、开启WWDG(※)
HAL_WWDG_Start_IT(&WWDG_HandleStruct);
或者
HAL_WWDG_Start(&WWDG_HandleStruct);
注意,两者使用一个即可,我刚开始用时没弄清两个的区别,两个都添加到程序中(先HAL_WWDG_Start,再HAL_WWDG_Start_IT)导致出错(但是反过来却没问题),看了一下源码HAL_WWDG_Start_IT里面包含了HAL_WWDG_Start的操作。
4、喂狗(WWDG 的喂狗操作实际就是往 CR 寄存器重写计数器值)
HAL_WWDG_Refresh(&WWDG_HandleStruct,0x7f);
(可选:当窗口看门狗的计数器值减到 0X40 的时候,若开启了中断,则会产生中断,但是计数器仍会递减)
5、使能中断通道并配置中断优先级(※)
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); //设置优先级分组
HAL_NVIC_SetPriority(WWDG_IRQn,2,2); //设置优先级
HAL_NVIC_EnableIRQ(WWDG_IRQn); //使能中断
6、编写中断服务函数
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&WWDG_HandleStruct);//官方提供HAL_WWDG_IRQHandler
}
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg) //回调函数
{
HAL_WWDG_Refresh(&WWDG_HandleStruct,0x7f);
LED0^=1;
}
建议使用官方的HAL_WWDG_IRQHandler,里面已经添加好了清除中断标志等一系列操作,将自己要做的操作在回调函数HAL_WWDG_WakeupCallback中编写。
举报