STM32 独立看门狗使用 40Khz 低速时钟驱动,通过设置 IWDG_PR 和 IWDG_RLR 寄存器可以修 改看门狗溢出时间。请写一个初始化函数 IWDG_Init 将看门狗溢出时间设置为2秒
时间: 2024-02-01 19:13:29 浏览: 172
好的,以下是一个简单的初始化函数 IWDG_Init,将看门狗溢出时间设置为2秒:
```c
void IWDG_Init(void)
{
// 使能看门狗时钟
RCC->CSR |= RCC_CSR_IWDG1RST;
// 配置看门狗预分频器和重载值
IWDG->KR = 0x5555; // 使能访问寄存器
IWDG->PR = 0x6; // 预分频器,低速时钟/256
IWDG->RLR = 0x0FFF; // 重载值,计算公式: T = (4 * 2^PR * RLR) / f_LSI
// 启动看门狗
IWDG->KR = 0xAAAA;
}
```
其中,IWDG_PR 寄存器用于设置看门狗预分频器,IWDG_RLR 寄存器用于设置重载值。根据计算公式:T = (4 * 2^PR * RLR) / f_LSI,我们可以得到 PR 和 RLR 的值。在本例中,低速时钟频率为 40Khz,我们需要将预分频器设置为 256,以便将计算结果转换为秒。因此,PR 的值为 0x6。另外,根据题目要求,看门狗溢出时间为 2 秒,因此,我们可以通过试错法得到 RLR 的值为 0x0FFF。最后,我们通过向 IWDG->KR 寄存器写入特定的值,使能访问寄存器并启动看门狗。
相关问题
STM32 独立看门狗使用 40Khz 低速时钟驱动,通过设置 IWDG_PR 和 IWDG_RLR 寄存器可以修 改看门狗溢出时间。请写一个初始化函数 IWDG_Init 将看门狗溢出
时间设置为1秒,并使能看门狗。
```c
void IWDG_Init(void)
{
// 使能看门狗时钟
RCC->CSR |= RCC_CSR_IWDG1RSTF;
RCC->CSR &= ~RCC_CSR_IWDG1RSTF;
RCC->APB1ENR1 |= RCC_APB1ENR1_IWDG1EN;
// 配置看门狗预分频器和重载寄存器,使溢出时间为1秒
IWDG->KR = 0x5555; // 开启对寄存器的写操作
IWDG->PR = 6; // 预分频器值,40KHz / 64 = 625Hz
IWDG->RLR = 625; // 重载寄存器值,1秒 / 625Hz = 625
// 使能看门狗
IWDG->KR = 0xCCCC; // 启动看门狗
}
```
注意,在 STM32 中,看门狗定时器 IWDG 的时钟源只能是内部低速时钟 LSI,其频率为 40KHz,相应的 IWDG 定时器最大溢出时间为 32768 / 40KHz = 819.2ms。因此,如果需要设置更长的看门狗超时时间,可以考虑使用外部看门狗(WWDG)或者使用硬件定时器。
独立看门狗使用 40Khz 低速时钟驱动,通过设置 IWDG_PR 和 IWDG_RLR 寄存器可以修 改看门狗溢出时间。请写一个初始化函数 IWDG_Init 将看门狗溢出时间为2秒
下面是一个简单的 IWDG 初始化函数,将看门狗溢出时间设置为2秒:
```c
void IWDG_Init(void)
{
// 使能 IWDG 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_IWDG, ENABLE);
// 配置 IWDG 计数器的预分频值,这里设置为 IWDG_PRESCALER_4
IWDG_SetPrescaler(IWDG_Prescaler_4);
// 配置 IWDG 计数器的重载值,这里设置为 2000,即 2 秒
IWDG_SetReload(2000);
// 使能 IWDG
IWDG_Enable();
}
```
需要注意的是,IWDG 的溢出时间不是精确的,可能会存在一定的误差。在实际使用中,需要根据具体的需求和实际情况来选择合适的溢出时间。此外,IWDG 的溢出时间不能太长,否则可能会导致系统无法及时响应故障。
阅读全文