本帖最后由 Afanx 于 2022-10-31 13:47 编辑
独立看门狗(IWDG)时钟源:40kHz LSI
功能:内置12位递减计数器,减到0时,可以产生复位或低功耗唤醒(PWR_CTRL2配置)。若要防止复位,程序需要在计数达到0前重新加载计数器。
计数时间:
预分频因子 | 计数频率(Hz) | 步进时间(ms) | 最大计数时间(s) | /4 | 10k | 0.1 | 0.4096 | /8 | 5k | 0.2 | 0.8192 | /16 | 2.5k | 0.4 | 1.6384 | /32 | 1.25k | 0.8 | 3.2768 | /64 | 625 | 1.6 | 6.5536 | /128 | 312.5 | 3.2 | 13.1072 | /256 | 156.25 | 6.4 | 26.2144 |
软件配置流程:
1. 将 0x5555 写入 IWDG_KEY.KEYV[15:0]位以启用对 IWDG_PREDIV 和 IWDG_RELV 寄存器的写访问;
2. 检查 IWDG_STS.PVU 位或 IWDG_STS.CRVU 位,如果为 0,则继续下一步;
3. 配置 IWDG_PREDIV.PD[2:0]位以选择预分频值;
4. 配置 IWDG_RELV.REL[11:0]位重装载值;
5. 将 0xAAAA 写入 IWDG_KEY.KEYV[15:0]位,用重装载值更新计数器;
6. 通过软件或硬件将 0xCCCC 写入 IWDG_KEY.KEYV[15:0]位来启用看门狗。
如果用户想改变预分频值和重装载值,重复步骤 1~5。如果没有,只需按照第 5 步喂狗。
代码配置:
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] IWDG初始化
*/
void IWDG_Initial(void)
{
/* Enable write access to IWDG_PR and IWDG_RLR registers */
IWDG_WriteConfig(IWDG_WRITE_ENABLE);
/* IWDG counter clock: LSI/8 = 40kHz/8 = 5kHz = 0.2ms */
IWDG_SetPrescalerDiv(IWDG_PRESCALER_DIV8);
/* Set counter reload value : 0.2ms * 1000 = 200ms */
IWDG_CntReload(1000);
/* Reload IWDG counter */
IWDG_ReloadKey();
/* Enable IWDG (the LSI oscillator will be enabled by hardware) */
IWDG_Enable();
}
*/
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] IWDG测试
*/
void IWDG_Task(void)
{
/* Check if the system has resumed from IWDG reset */
if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) {
/* IWDGRST flag set */
printf("\r\n reset by IWDG \r\n");
/* Clear reset flags */
RCC_ClrFlag();
}
while (1) {
/* Reload IWDG counter */
IWDG_ReloadKey();
/* Delay < 200ms */
DelayMs(198);
/* Toggle LED */
GPIO_ToggleBit(GPIOA, GPIO_PIN_8);
}
}
|