我正在使用 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
- }
- }