ST意法半导体
直播中

李丽华

7年用户 1403经验值
私信 关注
[问答]

STM32L452中的IWDG无论预分频器寄存器的值如何

我正在使用 Nucleo-L452RE 板上带有 STM32L452 MCU 的独立看门狗,我在尝试在重载寄存器中设置低值时遇到问题。当我尝试将重载寄存器的值设置为低于 5 个周期 (IWDG->RLR < 4) 时,无论预分频器寄存器的值如何,看门狗都会重置系统。
系统中使用的时钟是 HSI,它被配置为 sysclk 的源。
我怀疑,正如 VDD 电压域的状态寄存器所说,需要一些 LSI/预分频器周期来考虑刷新。但在数据表(DS11912 修订版 7,第 180 页)中指定最小重载值适用于 RL = 0x000,并且在设备勘误表(ES0388 修订版 8)中没有说明外设的限制。
我做错了什么或遗漏了什么吗?
我留下了我正在执行的代码来重现错误。它配置 HAL 和系统时钟。然后禁用 IRQ,并配置电路板的 LED 和 IWDG。如果看门狗复位,则 LED 点亮,执行结束
  • int main(void) {
  •   // reset of all peripherals, Initializes the Flash interface and the Systick
  •   HAL_Init();
  •   // configure the system clock
  •   SystemClock_Config();
  •   // disable IRQs
  •   __disable_irq();
  •   /* configure LED */
  •   // enable clock
  •   uint32_t temp;
  •   RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN;
  •   (void) RCC->AHB2ENR;
  •   // set GPIO_PIN_5 from GPIOA
  •   GPIOA->OTYPER &= ~(0x1 << 5);
  •   GPIOA->PUPDR &= ~(0x3 << (5 * 2));
  •   temp = GPIOA->MODER;
  •   temp &= ~(0x3 << (5 * 2));
  •   temp |= (GPIO_MODE_OUTPUT_PP << (5 * 2));
  •   GPIOA->MODER = temp;
  •   // check reset cause and set led if iwdg reset
  •   if (RCC->CSR & (1 << RCC_CSR_IWDGRSTF_Pos)) {
  •     // clear reset cause
  •     RCC->CSR |= RCC_CSR_RMVF;
  •     // set LED
  •     GPIOA->BSRR = GPIO_PIN_5;
  •     while (1) {} // infinite wait
  •   }
  •   /* configure IWDG peripheral */
  •   // stop IWDG in debug
  • #ifdef DEBUG
  •   DBGMCU->APB1FZR1 |= DBGMCU_APB1FZR1_DBG_IWDG_STOP;
  • #endif
  •   // configure registers
  •   IWDG->KR = ((uint32_t)0x0000CCCC); // enable
  •   IWDG->KR = ((uint32_t)0x00005555); // enable register access
  •   IWDG->PR = ((uint32_t)0x00000006); // prescaler (no matter the value, but < 0x7)
  •   IWDG->RLR = ((uint32_t)0x00000003); // reload (>= 0x4 OK, < 0x4 NOK)
  •   while (IWDG->SR != 0x00u) {} // wait
  •   // infinite loop
  •   while (1) {
  •     IWDG->KR = ((uint32_t)0x0000AAAA); // feed
  •   }
  • }







更多回帖

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