- 阅读看门狗资料,要把握以下部分
- 原理图
- 复位CPU条件
- 使能以及关闭看门狗
- 喂狗(方式 时间)
- 寄存器
- Debug模式下是否使能
- stm32包括2个看门狗,拥有不同的时钟
- 内置 low-speed clock (LSI 40KHZ) ,用于 Independent watchdog (IWDG)
- from the APB1 clock,用于Window watchdog(WWDG)
- 区别
- IWDG安全性能高,他是独立时钟,独立运行,但是由于时钟独立,因此频率不高(40KHZ)
- WWDG适用于对时间要求精准
- 时钟来自外部,频率高,可以很高精度
- 可以设置喂狗窗口,过早喂狗、过晚喂狗都会复位CPU,可以实现更精准的控制要求
- 独立看门狗 Independent watchdog (IWDG)
- 原理图
- 复位CPU条件
- 倒计时(downcounter)从0xFFF递减,等于0时候复位CPU
- 使能以及关闭看门狗
- Hardware watchdog使能,上电自动启动
- 没有上电自动启动,往 IWDG_KR 写入 0xCCCC,启动IWDG
- CPU复位后,看门狗随之复位
- 喂狗(方式 时间)
- 方式
- 往 IWDG_KR 写入0xAAAA,将 IWDG_RLR 数值加载进计时器
- 只有在 IWDG_SR Bit 1 RVU=0(不在更新),才能改变IWDG_RLR的数值
- 时间
- 看门狗复位时间= (加载值/40) * prescaler divider value 毫秒,加载值范围0-4095,prescaler divider value=4 / 8 / 16 / 32 / 64 / 128 / 256
- 例如加载值=0xFFF, IWDG_PR[2:0] =5(prescaler divider value=128)
- 看门狗时间=(0xFFF /40) * 128 毫秒=13.104秒
- 最大时间 6553ms
- 设计原则
- prescaler divider value尽量最小,这样单个计数代表的时间越大
- 方式
- 寄存器
- Key register,IWDG_KR
- 预分频器,IWDG_PR [2:0]
- 先往 IWDG_KR 写入 0x5555,才能修改IWDG_PR 数值
- 重新装载寄存器,IWDG_RLR
- 先往 IWDG_KR 写入 0x5555,才能修改IWDG_RLR数值
- 状态寄存器,IWDG_SR
- Bit 1 RVU: Watchdog counter reload value update(更新中,RVU=1,此时不能改变IWDG_RLR),硬件置位/复位
-
Bit 0 PVU: Watchdog prescaler value update(更新中,PVU=1,此时不能改变IWDG_PR ),硬件置位/复位
- Debug模式下是否使能
- 取决于 DBG_IWDG_STOP configuration bit in DBG module
- 如果需要 Debug模式下不使能,可以在main函数调用__HAL_DBGMCU_FREEZE_IWDG
-
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 *///当内核进入调试状态时看门狗停止工作__HAL_DBGMCU_FREEZE_IWDG();/* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();
- 原理图
- 窗口看门狗 Window watchdog (WWDG)——Programmable free-running downcounter
- 原理图
- 复位CPU条件
- 当倒计时(downcounter ) < 0x40(7-bit downcounter 从 0x40 变成 0x3F (T6 bit=0))
- 或者:窗口大小为 0x3F~WWDG_CFR[6:0],当倒计时器在窗口之外(大于WWDG_CFR)的数值被重新加载的时候,复位CPU
- 使能以及关闭看门狗
- 使能:WDGA bit i in WWDG_CR 置位,使能后不能关闭看门狗,只有等到CPU复位
- 即使看门狗不使能,倒计时器(downcounter )还会在运行
- CPU复位后,看门狗复位(不能软件复位)
- 喂狗(方式 时间)
- 当倒计时器数值在窗口之内才能重新加载(喂狗),否则会复位CPU
- 喂狗:写入 WWDG_CR,T6一定要为1,[T5:0]为超时计数
- 看门狗复位时间(36MHZ 最大58.25ms )
- The Early Wakeup Interrupt (EWI)
-
当倒计时小于0x40(T6=0)时候,WWDG会复位设备
-
当倒计时等于0x40时候,可以产生EWI中断
-
使能中断: EWI bit in WWDG_CFR 置位
-
清除中断:写0到 EWIF bit in WWDG_SR
-
中断产生在设备复位之前
-
- 寄存器
- 控制寄存器 WWDG_CR
- 配置寄存器 WWDG_CFR
- 状态寄存器 WWDG_SR
- Bit 0 EWIF:中断标志位,有中断等于1,中断不使能也会等于1,写入0复位标志位,写入1无效
- Debug模式下是否使能
- 取决于 DBG_IWDG_STOP configuration bit in DBG module
- 原理图
- 定时器的选择与使用
- 2个看门狗都是用,一个主用,一个备用
- WWDG 有自带中断,方便记录看门狗复位的现场,查找复位原因,作为主用
- IWDG作为备用,以防WWDG 损坏
- WWDG 的超时时间很短,一般在几十ms左右。如果喂狗条件不能满足,就不要使用WWDG
- 使用WWDG ,可以把窗口开到最大( WWDG_CFR[bit6:bit0] = 0x7F ),避免在窗口外喂狗触发CPU复位
- 喂狗时间不超过1/2超时时间(IWDG超时时间1.6s——外部看门狗超时时间为1.6秒,喂狗时间不超过0.8秒)