开启独立看门狗, WK_UP按键喂狗防止看门狗复位。 WK_UP —— PA0 LED0 —— PA8 要求:初始状态:LED0点亮。 WK_UP 按下一次,喂狗一次:LED0长亮。 不按下WK_UP键:看门狗不断复位,LED0闪烁
时间: 2024-03-08 10:47:59 浏览: 132
好的,以下是符合您要求的代码实现:
```
#include "stm32f10x.h"
#define IWDG_PR_VALUE 4
#define IWDG_RLR_VALUE 5000
void IWDG_Config(void)
{
/* 使能IWDG时钟 */
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
/* 选择IWDG时钟 */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_4);
IWDG_SetReload(5000);
IWDG_ReloadCounter();
IWDG_Enable();
}
void GPIO_Config(void)
{
/* 使能GPIOA时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* 配置PA0和PA8为输入模式 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
int main(void)
{
/* 初始化IWDG和GPIO */
IWDG_Config();
GPIO_Config();
/* 初始状态,LED0点亮 */
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
while(1)
{
/* 判断WK_UP按键是否被按下 */
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET)
{
/* 喂狗一次 */
IWDG_ReloadCounter();
/* LED0长亮 */
GPIO_SetBits(GPIOA, GPIO_Pin_8);
}
else
{
/* 看门狗不断复位,LED0闪烁 */
GPIO_ToggleBits(GPIOA, GPIO_Pin_8);
/* 延时一段时间 */
for(int i = 0; i < 1000000; i++);
}
}
}
```
以上代码中,`IWDG_Config()`和`GPIO_Config()`函数分别用于配置独立看门狗和GPIO。在`main()`函数中,首先调用了这两个函数进行初始化。在每次循环中,判断WK_UP按键是否被按下,如果按下则喂狗一次,同时LED0长亮;否则看门狗不断复位,LED0闪烁。在循环中加入了延时,以便更好地观察LED0的闪烁情况。
阅读全文