STM32F4xx内置俩个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备可用来检测和解决由软件错误引起的故障;当计数器大道给定的超时值触发一个中断(触发中断仅适用于窗口看门狗)或产生系统复位。
地理看门狗IWDG有用们的低速时钟LSI驱动,及时主时钟发生故障他也任然有效。窗口看门狗由APB1是中国分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
IWDG最时候用于哪些需要一个看门狗在主程序之外能够独立工作并且对时间精度要求较低的场合,WWDG适合用于哪些要求看门狗在精确计算计时窗口起作用的应用程序。
IWDG主要特性与功能
·自由运行的递减计数器
·时钟由独立RC振荡器提供(可工作在停止和待机模式下)
·看门狗被激活后,则在计数器计到0x000是产生复位
在寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器寄到末尾0x000时会产生一个复位信号(IWDG_RESET)。无论何时,只要在寄存器IWDG中写入IWDG_KR中写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器,从而避免产生看门狗复位。
硬件看门狗
如果用户在选择字节中启用了“硬件看门狗”,在系统上电复位后,看门狗会自动开始运行;如果在计数器结束前,若软件没有向寄存器写入相应的值,则系统会产生复位。
寄存器访问保护
IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555.以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装在操作(写入0
xAAAA)也会启动写保护功能。状态寄存器指示预分配寄存器跟递减计数器是否正在被更新。
调试模式
当微控制器进入调试模式时(M4核心停止),根据调试模块中的DBG_IWDG_STOP配置位状态,IWDG的计数器能够继续工作或停止。
STM32F4的IWDG库
下面是介绍如何使用看门狗驱动 :
·通过函数IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable)使能写寄存器IWDG_PR和IWDG_RLR
·通过函数IWDG_SetPrescaler()配置IWDG分频
·通过函数IWDG_SetReload配置IWDG计数器,每次重装后,计数器将这个值做递减。
·通过IWDG_Enable()来使能IWDG,当看门狗工作在软件模式时(不需要使能LSI,会有硬件自动使能)。
·定时器应该定时调用函数IWDG_ReloadCounter()防止系统复位。
分频器和计数器配置函数
void IWDG_WriteAccessCmd(unit16_t IWDG_WriteAccess)
void IWDG_SetPrescaler(unit8_t IWDG_Prescaler)
void IWDG_SetPrescaler(uint16_t Relaod)
void IWDG_ReloadCounter(void)
看门狗激活函数
void IWDG_Enable(void)使能看门狗
标志管理函数
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG)用于检测看门狗标志
WWDG的主要特性与功能
·可编程的自由运行递减计数器
·条件复位
当递减计数器值小于0x40,若看门狗被启动则产生复位
当递减计数器在窗口外被重新装载,若看门狗被启动则产生复位
·若果启动了看门狗并允许中断,当递减计数器等于0x40是产生早起唤醒中断(EWI),他可以被用于重装载计数器避免WWD复位。
如果看门狗被启动(WWDG_CR寄存器中的WDGA位被置1),并且7位递减计数器T【6:0]从0x40翻转到0x3f(T6位清零)时则产生一个复位。如果软件计数器大于窗口寄存器中的数值时重装载计数器将产生一个复位。
应用程序在正常运行过程中必须定期的写入WWDG_CR寄存器以防止MCU发生复位。只有当计数器值小于窗口寄存器时,才能进行写操作。存储在WWDG_CR寄存器中的数值必须在0xff和0xc0之间。
启动看门狗
在系统复位后,看门狗总归是处于关闭状态,设置WWDG_CR寄存器的WDGA位能够开启看门狗,随后他不能再被关闭,除非发生复位。
控制递减计数器
递减计数器处于自由运行状态,即使看门狗被关闭递减计数器任然继续递减计数。当看门狗被启用时T6位必须被设置,以防止产生一个复位。T【5:0】位包含了看门狗复位产生之前的计数数目;复位前的延时在一个最小值和一个最大值之间变化,这是应为写入WWDG_CR是其预分频是未知的。配置WWDG_CFR中包含窗口的上限值:要避免产生复位递减计数器的值小于窗口寄存器的数值且大于0x3f时被重新装载,0描述了窗口寄存器的工作过程。另一个重装载计数器的方法是利用早期唤醒中断EWI。设置WWDG_CFR寄存器中的WEI位开启中断。当递减计数器到达0x40时,则产生次中断,相应的中断服务程序ISR可以用来加载计数器防止WWDG复位。在WWDG_SR寄存器中写0可以清楚该中断。
注意:可以用 T6 位 产生一个软件复位(设置 WDGA位为’ 1’, T6 位为’ 0’)。
看门狗中断特性
实际的复位产生前,如果需要执行专门的安全操作或者记录数据,呢么EWI中断就派上了用场。EWI终端有WWDG_CFR的EWI使能位。当地建计数器计到0x40的时候,EWI中断将产生,在设备复位前,我们可以在中断服务程序里面执行或者数据记录。
在一些应用中,EWI终端可以被用来管理软件系统检查/或系统恢复graceful degradation,而不会产生一个WWDG复位。这种情况的话,用户需要在ISR中清除中断标志并喂狗,防止产生系统复位。然后出发需要的操作。
EWI中断可以通过向寄存器WWDG_SR的EWIF位写0来清除。
调试模式
当微控制器进入调试模式(M4核心停止),根据调试中的DBG_WWDG_STOP配置位的状态,WWDG的计数器能够继续工作或停止
如何编写串口看门狗程序
STM32F4的WWDG库
WWDG计数器输入时钟是由 APB1时钟分频而来:
WWDG 计数器时钟 = PCLK1 / Prescaler
WWDG 溢出时间 = (WWDG counter clock) * (counter value)
最大最小溢出时间: @42 MHz(PCLK1): ~97.5 us / 49.9 ms
如何使用看门狗驱动
·通过函数RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE)使能窗口看门狗时钟
·通过函数WWDG_SetPrescaler()设置看门狗分频。
·设置WWDG计数器数值,通过函数WWDG_Enable()启动WWDG,情动WWDG以后,计数器的数值设置要大于0x40,防止立即产生复位
·用户可以悬着是否产生EWI中断,在此中断计数器到0x40时产生,一旦是能。系统复位时将无法将其关闭
·在阻止系统产生福诶的正常操作期间,用户需要在每个时间间隔通过函数WWDG_SetCounter()刷新计数器没刷新操作只能在计数器值小于设定窗口只时进行,窗口只通过函数WWDG_SetWindowValue()设定。
分频器,窗口刷新,计数器配置函数
void WWDG_DeInit(void)
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)
void WWDG_SetWindowValue(uint8_t WindowValue)
void WWDG_EnableIT(void)
void WWDG_SetCoounter(uint8_t Counter)
独立看门狗激活函数
void WWDG_Enable(uint8_t Counter)
中断标志管理
FlagStatus WWDG_GetFlagStatue(void)
void WWDG_CLearFlag(void)