Регистры IWDG STM32F4
Регистры независимого сторожевого таймера IWDG STM32F4: ключевой регистр KR, предделитель PR, значение перезагрузки RLR и флаги обновления SR. Сторож тактируется от генератора LSI и сбрасывает микроконтроллер, если программа перестала его обслуживать.
IWDG — 12-битный вычитающий счётчик, тактируемый от внутреннего генератора LSI (32 кГц) через предделитель на 4…256. Он работает независимо от основной частоты, в том числе в режимах Stop и Standby, и при достижении нуля сбрасывает микроконтроллер (RM0090, раздел 21.4).
Сторож запускают записью 0xCCCC в KR, обслуживают записью 0xAAAA — счётчик перезагружается значением RLR. Чтобы изменить PR или RLR, сначала пишут 0x5555 в KR; флаги PVU и RVU в SR показывают, что новое значение ещё переносится в домен сторожа. Запущенный IWDG остановить нельзя — только сбросом. Опция IWDG_SW в байтах опций может запускать его аппаратно при включении питания.
Таймаут = 4 × 2^PR × (RL + 1) / fLSI: от 0,125 мс при делителе 4 и RL = 0 до 32,8 с при делителе 256 и RL = 0xFFF. Частота LSI заметно гуляет от экземпляра к экземпляру — запас по времени берите по минимальной частоте из даташита.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| IWDG | 0x4000 3000 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| IWDG_KR | 0x00 | Ключевой регистр: запуск, обслуживание, доступ | 0x0000 0000 (сбрасывается в режиме Standby) |
| IWDG_PR | 0x04 | Предделитель | 0x0000 0000 |
| IWDG_RLR | 0x08 | Значение перезагрузки | 0x0000 0FFF (сбрасывается в режиме Standby) |
| IWDG_SR | 0x0C | Флаги обновления PR и RLR | 0x0000 0000 (не сбрасывается в режиме Standby) |
Конструктор значения
Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.
Значение: 0x00000000
0000 0000 0000 0000 0000 0000 0000 0000
IWDG->KR = 0x00000000;IWDG_KR — ключевой регистр: запуск, обслуживание, доступ
Смещение 0x00, адрес 0x4000 3000, 32 бит, после сброса 0x0000 0000 (сбрасывается в режиме Standby). В коде: IWDG->KR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| KEY | |||||||||||||||
- KEY (биты 15:0) — Ключ: 0xCCCC — запуск, 0xAAAA — обслуживание, 0x5555 — доступ к PR и RLR.
IWDG_PR — предделитель
Смещение 0x04, адрес 0x4000 3004, 32 бит, после сброса 0x0000 0000. В коде: IWDG->PR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | PR | ||||||||||||||
- PR (биты 2:0) — Предделитель частоты LSI.
PR Значение 000 Деление на 4 001 Деление на 8 010 Деление на 16 011 Деление на 32 100 Деление на 64 101 Деление на 128 110 Деление на 256 111 Деление на 256
IWDG_RLR — значение перезагрузки
Смещение 0x08, адрес 0x4000 3008, 32 бит, после сброса 0x0000 0FFF (сбрасывается в режиме Standby). В коде: IWDG->RLR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | RL | ||||||||||||||
- RL (биты 11:0) — Значение, которым перезагружается счётчик при записи 0xAAAA.
IWDG_SR — флаги обновления PR и RLR
Смещение 0x0C, адрес 0x4000 300C, 32 бит, после сброса 0x0000 0000 (не сбрасывается в режиме Standby). В коде: IWDG->SR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | RVU | PVU | |||||||||||||
- RVU (бит 1) — Идёт перенос нового значения RLR.
- PVU (бит 0) — Идёт перенос нового значения PR.
Частые вопросы
Как запустить IWDG STM32F4 на 1 секунду?
При LSI 32 кГц и делителе 32 (PR = 3) один отсчёт длится 1 мс, значит RL = 999. Запишите IWDG->KR = 0x5555, IWDG->PR = 3, IWDG->RLR = 999, затем IWDG->KR = 0xCCCC. В основном цикле периодически пишите IWDG->KR = 0xAAAA.
Как узнать, что сброс вызвал сторожевой таймер?
После сброса проверьте флаг IWDGRSTF в регистре RCC_CSR и сбросьте флаги записью единицы в RMVF того же регистра.
Можно ли остановить IWDG при отладке?
Да: бит DBG_IWDG_STOP в регистрах отладки DBGMCU останавливает счётчик, пока ядро стоит на точке останова. В работе запущенный IWDG выключить нельзя.
Источники
- STMicroelectronics. RM0090: Reference manual (Rev 22) — раздел 21.4: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-f4 v2.6.11: заголовки CMSIS stm32f405xx.h, stm32f407xx.h, stm32f415xx.h, stm32f417xx.h, stm32f427xx.h, stm32f429xx.h, stm32f437xx.h, stm32f439xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32F4
- Все регистры STM32F4Блоки периферии и заголовки CMSIS
- RCC — сброс и тактированиеRCC_CR, RCC_PLLCFGR, RCC_CFGR, RCC_CIR, RCC_AHB1RSTR, RCC_AHB2RSTR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_MEMRMP, SYSCFG_PMC, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4
- EXTI — контроллер внешних прерываний и событийEXTI_IMR, EXTI_EMR, EXTI_RTSR, EXTI_FTSR, EXTI_SWIER, EXTI_PR
- USART — последовательные порты USART и UARTUSART_SR, USART_DR, USART_BRR, USART_CR1, USART_CR2, USART_CR3
- SPI — интерфейсы SPI и I2SSPI_CR1, SPI_CR2, SPI_SR, SPI_DR, SPI_CRCPR, SPI_RXCRCR
- I2C — интерфейс I2CI2C_CR1, I2C_CR2, I2C_OAR1, I2C_OAR2, I2C_DR, I2C_SR1
- TIM — таймерыTIMx_CR1, TIMx_CR2, TIMx_SMCR, TIMx_DIER, TIMx_SR, TIMx_EGR
- DMA — контроллеры прямого доступа к памятиDMA_LISR, DMA_HISR, DMA_LIFCR, DMA_HIFCR, DMA_SxCR, DMA_SxNDT
- ADC — аналого-цифровые преобразователиADC_SR, ADC_CR1, ADC_CR2, ADC_SMPR1, ADC_SMPR2, ADC_JOFR1
- WWDG — оконный сторожевой таймерWWDG_CR, WWDG_CFR, WWDG_SR
- CRC — блок вычисления CRCCRC_DR, CRC_IDR, CRC_CR
- DBGMCU — регистры отладкиDBGMCU_IDCODE, DBGMCU_CR, DBGMCU_APB1_FZ, DBGMCU_APB2_FZ