IWDG_SetReload(1500/4); 为什么这能将看门狗复位时间设置为1.5秒
时间: 2024-04-22 16:22:50 浏览: 143
在这段代码中,IWDG_SetReload(1500/4) 的作用是设置看门狗定时器的重装载值。看门狗定时器是一种硬件定时器,它的作用是在一段时间内检测系统是否正常运行。如果系统出现异常情况,看门狗定时器将会复位系统。这里的1500是看门狗定时器的时钟周期数,除以4是因为看门狗定时器的时钟源为LSI,而LSI的时钟频率一般是比较低的,因此需要除以4进行补偿。通常情况下,通过设置重装载值来控制复位时间,具体时间与时钟频率、重装载值的设定有关。所以,这段代码可以将看门狗复位时间设置为1.5秒。
相关问题
解释一下这个代码 void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作 IWDG_SetPrescaler(prer); //设置IWDG预分频值:设置IWDG预分频值为64 IWDG_SetReload(rlr); //设置IWDG重装载值 IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器 IWDG_Enable(); //使能IWDG }
这段代码是初始化独立看门狗(IWDG)的函数定义。下面是这段代码的详细解释:
1. `IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);` 使能对寄存器IWDG_PR和IWDG_RLR的写操作,因为这两个寄存器默认情况下是只读的。
2. `IWDG_SetPrescaler(prer);` 设置IWDG预分频值,用来控制IWDG的计数频率。这里设置IWDG预分频值为64。
3. `IWDG_SetReload(rlr);` 设置IWDG重装载值,用来控制IWDG的计数周期。当IWDG计数器计数到该值时,就会产生复位信号。
4. `IWDG_ReloadCounter();` 根据IWDG重装载寄存器的值重装载IWDG计数器,以避免产生复位信号。
5. `IWDG_Enable();` 使能IWDG,使其开始计数。
这段代码的作用是初始化IWDG,并设置计数频率和计数周期,并使其开始计数。初始化IWDG后,如果在计数周期内系统出现异常,IWDG会产生复位信号,从而保护系统不崩溃。
stm32f10x利用外部中断按钮,实现按下2时,启动独立看门狗,重设复位时间为1.5秒;
好的,针对你的问题,我可以给出以下的解决方案:
1. 首先需要在你的单片机中配置外部中断,使得按下按钮时能够触发中断服务程序。
```c
/* 配置外部中断GPIO的引脚 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 配置外部中断线路 */
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* 配置中断优先级 */
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
```
2. 在中断服务程序中,判断是否按下了2号按钮,如果按下了,则执行启动独立看门狗的操作。
```c
void EXTI2_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line2) != RESET)
{
/* 判断是否按下2号按钮 */
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2) == RESET)
{
/* 启动独立看门狗 */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_256); // 4分频,时钟为40KHz
IWDG_SetReload(1500 / 4); // 设置重载值,1.5s
IWDG_ReloadCounter();
IWDG_Enable();
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
```
3. 在启动独立看门狗之前,需要先对看门狗的定时器进行配置,将复位时间设置为1.5秒。
```c
/* 配置独立看门狗 */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 允许写寄存器
IWDG_SetPrescaler(IWDG_Prescaler_256); // 4分频,时钟为40KHz
IWDG_SetReload(1500 / 4); // 设置重载值,1.5s
IWDG_ReloadCounter(); // 喂狗
IWDG_Enable(); // 使能看门狗
```
4. 在程序的其他部分,需要定时喂狗,以确保独立看门狗不会触发复位操作。
```c
while (1)
{
/* 定时喂狗 */
Delay(1000); // 延时1s
IWDG_ReloadCounter(); // 喂狗
}
```
5. 如果在程序执行过程中发生了错误,导致程序无法正常运行,那么独立看门狗就会在1.5秒后触发复位操作,将程序强制重启,从而保证系统的可靠性。
希望这个解决方案能够帮助到你,如果你还有其他问题,可以继续提出来哦。
阅读全文