STM32
直播中

ronga245

12年用户 590经验值
私信 关注
[问答]

独立看门狗IWDG的结构是如何构成的

独立看门狗IWDG的结构是如何构成的?

怎样对独立看门狗IWDG进行配置?有哪些步骤?

回帖(1)

李冬梅

2021-9-22 16:28:25
  看门狗简介
  看门狗外设:
  独立/窗口看门狗,均可用于检测并解决由软件错误导致的故障,由 VDD 电压域供电,在停止模式和待机模式下仍能工作。
  看门狗分类:
  (1)窗口看门狗 WWDG:
  (2)独立看门狗 IWDG:
  独立看门狗可以看做一个 12 位递减计数器,计数器从某一个值递减到 0 时(如果看门狗已激活)系统就会产生一次复位。如果在计数器递减到 0 之前刷新了计数器值,那么系统就不会产生复位。
  喂狗:刷新计数器值的过程
  TIP:IWDG 在一旦启用,就不能再被关闭,想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧存在。所以不用 IWDG 的话,就不要去打开它
  IWDG 结构框图
  
  (1)IWDG 时钟
  由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持工作状态。 LSI其频率一般在 30-60KHz 之间,通常选择 40KHz 作为IWDG 时钟。且时钟频率并不非常精确,所以独立看门狗只适用于对时间精度要求比较低的场合。
  (2)预分频器寄存器
  LSI 时钟并不直接提供给计数器时钟,而通过一个 8 位预分频寄存分频后输入给计数器时钟。
  分频因子: 4、8、16、32、64、128、256。
  分频后的计数器时钟:CK_CNT= 40/ 4*2^PRE,PRE 为预分频系数(0-6), 4*2^PRE 大小就是 4、8、16、32、64、128、256 值。每经过一个计数器时钟,计数器就减 1。
  (3)计数器
  12 位的递减计数器,计数最大值为 0XFFF,递减到 0 时,产生一个复位信号,让系统重新启动运行,如果在计数器减到 0 之前刷新了计数器值的话,就不会产生复位信号
  (4)重装载寄存器
  12 位的寄存器,装着要刷新到计数器的值,值的大小决定独立看门狗的溢出时间。
  溢出时间 Tout = (4*2^pre) / 40 * rlr(ms)
  pre 是预分频器系数(0-6)
  rlr 是重装载寄存器的值,公式内的 40 是独立看门狗的时钟。
  (5)标号 5:密钥寄存器(IWDG_KR)
  也称为关键字寄存器或键寄存器。是 IWDG 的一个控制寄存器。往该寄存器写入三种值会有三种控制效果:
  ①写入 0X5555,IWDG_PR 和 IWDG_RLR 寄存器具有写访问保护。若要修改寄存器,必须首先对 IWDG_KR 寄存器写入代码 0x5555。若写入其他值将重启写保护。
  ②写入 0XAAAA,把 IWDG_RLR 寄存器内值重装载到计数器中。
  ③写入 0XCCCC,启动 IWDG 功能。此方式属于软件启动,一旦开启独立看门狗,它就关不掉,只有复位才能关掉。
  (6)标号 6:状态寄存器 IWDG_SR
  只有位 0: PVU 和位 1: RVU 有效,这两位只能由硬件操作。
  RVU:看门狗计数器重装载值更新,硬件置 1 表示重装载值的更新正在进行中,更新完毕之后由硬件清 0。
  PVU: 看门狗预分频值更新,硬件置 1表示预分频值的更新正在进行中,当更新完成后,由硬件清 0。
  IWDG 配置步骤
  开启寄存器访问(给 IWDG_KR 寄存器写入 0X5555)
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
  设置 IWDG 预分频系数和重装载值
  void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
  计算溢出时间: Tout = (4*2^pre) / 40 * rlr
  重载计数器值(喂狗)(给 IWDG_KR 寄存器写入 0XAAAA)
  IWDG_ReloadCounter(); //重装载初值
  开启 IWDG(给 IWDG_KR 寄存器写入 0XCCCC)
  要使用独立看门狗,我们还需要打开它,开启 IWDG 的库函数是:
  IWDG_Enable(); //打开独立看门狗
  ` IWDG 初始化函数
  void IWDG_Init(u8 pre,u16 rlr)
  {
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
  IWDG_SetPrescaler(pre);//设置预分频系数 0-6
  IWDG_SetReload(rlr);//设置重装载值
  IWDG_ReloadCounter(); //重装载初值
  IWDG_Enable(); //打开独立看门狗
  }
  喂狗就是重载初始值,可以和按键联动
  void IWDG_FeedDog(void) //喂狗
  {
  IWDG_ReloadCounter(); //重装载初值
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分