STM32
直播中

池鹄展

9年用户 1021经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

WWDG当前计数器的值以及激活位与哪个寄存器有关啊

WWDG当前计数器的值以及激活位与哪个寄存器有关啊?
STM32f10x的库函数提供了哪几种设置WWDG_CR[0:6]位的方式?

回帖(1)

刘占宽

2021-9-22 12:02:50
  WWDG当前计数器的值以及激活位和WWDG_CR这个寄存器相关。如下图所示:
  
  而STM32f10x的库函数提供了两种设置WWDG_CR[0:6]位的方式。
  WWDG_SetCounter方法
  #define BIT_Mask = 0x7F
  /**
  * @brief Sets the WWDG counter value.
  * @param Counter: specifies the watchdog counter value.
  * This parameter must be a number between 0x40 and 0x7F.
  * @retval None
  */void WWDG_SetCounter(uint8_t Counter)
  {
  /* Check the parameters */
  assert_param(IS_WWDG_COUNTER(Counter));
  /* Write to T[6:0] bits to configure the counter value, no need to do
  a read-modify-write; writing a 0 to WDGA bit does nothing
  */ WWDG-》CR = Counter & BIT_Mask;
  }
  该方法直接将传入的Counter作为WWDG_CR寄存器里的值。
  WWDG_Enable方法
  #define CR_WDGA_Set 0x80
  /**
  * @brief Enables WWDG and load the counter value.
  * @param Counter: specifies the watchdog counter value.
  * This parameter must be a number between 0x40 and 0x7F.
  * @retval None
  */void WWDG_Enable(uint8_t Counter)
  { /* Check the parameters
  */ assert_param(IS_WWDG_COUNTER(Counter));
  WWDG-》CR = CR_WDGA_Set | Counter;
  }
  该方法将传入的Counter | 0x80(也就是WDGA为1)作为CR寄存器的值。
  这样有一个潜在问题就是,我们在调用WWDG_Enable方法时,必须指定初始化的Counter。
  我之前犯过这样的错误,我企图使用WWDG_Enable(0x80)来激活窗口看门狗,因为该函数名称是使能WWDG,但是发现板子一直在不断地重启,仔细分析发现调用WWDG_Enable(0x80)后WWDG-》CR = CR_WDGA_Set | 0x80 = 0x80,于是WWDG_CR寄存器里的[0:6]变成了0,所以窗口看门狗疯狂复位。。
  在此记录这个错误。。
  还有一点需要注意的是,WWDG_SetCouner方法的最开始有一句
  assert_param(IS_WWDG_COUNTER(Counter));
  #define IS_WWDG_COUNTER(COUNTER) (((COUNTER) 》= 0x40) && ((COUNTER) 《= 0x7F))
  所以说该assert语句会确保输入的Counter为0x40到0x7F之间的数,调用该函数会将WWDG_CR寄存器里的第7位WDGA清0,导致窗口看门狗不工作。于是该函数只能在初始化时使用,,甚至可以不使用。。直接使用WWDG_Enable代替。
  该WDGA位只能在复位时由硬件清零,但最好还是使用WWDG_Enable函数。
举报

更多回帖

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