写了个独立看门狗的小程序,帮忙看下出了什么问题。。。
时间:10-02
整理:3721RD
点击:
今天学了独立看门狗,写个小程序,想要实现的功能如下:
程序开始,led灯灭,1s后亮,1s后再灭,如果按键1检测到被按下,就执行喂狗,LED灯就会一直灭,独立看门狗设置的复位时间大约是1s,如果1s内没喂狗即未检测到按键1被按下,程序就会复位,重新执行,LED灯被复位就会再灭亮灭闪烁一次。
我写的下面这个程序执行后,led是不断的灭亮灭,就算很快的按下键,也是不断灭亮灭,也就是说是在不断复位,喂狗程序一直没有执行,所以我怀疑是不是判断喂狗的条件出现错误,但又不知道哪里错了。
附图是按键和led的接线图。
#include "stm32f10x.h"
#include "delay_ms.h"
#define BitBand(addr,n) *(volatile unsigned long*)((addr & 0xf0000000)+0x2000000+(addr & 0xfffff)*32+n*4) //位绑定公式
#define GPIOC_ODR_A (GPIOC_BASE+0x0c)
#define GPIOC_IDR_A (GPIOC_BASE+0x08)
#define GPIOD_ODR_A (GPIOD_BASE+0x0c)
#define GPIOD_IDR_A (GPIOD_BASE+0x08)
#define PCout(n) BitBand(GPIOC_ODR_A,n)
#define PCin(n) BitBand(GPIOC_IDR_A,n)
#define PDout(n) BitBand(GPIOD_ODR_A,n)
#define PDin(n) BitBand(GPIOD_IDR_A,n)
#define Key1 PCout(4) //位绑定
#define LED1 PDout(2)
void RCC_Configuration(void); //声明
void GPIO_Configuration(void);
int main(void)
{
RCC_Configuration(); //打开时钟
GPIO_Configuration(); //GPIO配置
//设置led灯的主要目的就是为了显示出是否实现了IWDG的功能
LED1=1; //LED的公共端接的是3.3V,复位值是0,复位亮,置1使灭
delay_ms(1000); //延时1s
LED1=0; //1s后亮
delay_ms(1000); //延时1s
LED1=1; //灭
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(4);
IWDG_SetReload(625);
IWDG_ReloadCounter();
IWDG_Enable();
while(1)
{
if(Key1==0)
{
delay_ms(10);
if(Key1==0) IWDG_ReloadCounter();
}
}
}
void RCC_Configuration()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);
}
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
程序开始,led灯灭,1s后亮,1s后再灭,如果按键1检测到被按下,就执行喂狗,LED灯就会一直灭,独立看门狗设置的复位时间大约是1s,如果1s内没喂狗即未检测到按键1被按下,程序就会复位,重新执行,LED灯被复位就会再灭亮灭闪烁一次。
我写的下面这个程序执行后,led是不断的灭亮灭,就算很快的按下键,也是不断灭亮灭,也就是说是在不断复位,喂狗程序一直没有执行,所以我怀疑是不是判断喂狗的条件出现错误,但又不知道哪里错了。
附图是按键和led的接线图。
#include "stm32f10x.h"
#include "delay_ms.h"
#define BitBand(addr,n) *(volatile unsigned long*)((addr & 0xf0000000)+0x2000000+(addr & 0xfffff)*32+n*4) //位绑定公式
#define GPIOC_ODR_A (GPIOC_BASE+0x0c)
#define GPIOC_IDR_A (GPIOC_BASE+0x08)
#define GPIOD_ODR_A (GPIOD_BASE+0x0c)
#define GPIOD_IDR_A (GPIOD_BASE+0x08)
#define PCout(n) BitBand(GPIOC_ODR_A,n)
#define PCin(n) BitBand(GPIOC_IDR_A,n)
#define PDout(n) BitBand(GPIOD_ODR_A,n)
#define PDin(n) BitBand(GPIOD_IDR_A,n)
#define Key1 PCout(4) //位绑定
#define LED1 PDout(2)
void RCC_Configuration(void); //声明
void GPIO_Configuration(void);
int main(void)
{
RCC_Configuration(); //打开时钟
GPIO_Configuration(); //GPIO配置
//设置led灯的主要目的就是为了显示出是否实现了IWDG的功能
LED1=1; //LED的公共端接的是3.3V,复位值是0,复位亮,置1使灭
delay_ms(1000); //延时1s
LED1=0; //1s后亮
delay_ms(1000); //延时1s
LED1=1; //灭
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(4);
IWDG_SetReload(625);
IWDG_ReloadCounter();
IWDG_Enable();
while(1)
{
if(Key1==0)
{
delay_ms(10);
if(Key1==0) IWDG_ReloadCounter();
}
}
}
void RCC_Configuration()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);
}
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
是不是没有打开相应的时钟啊
应该在喂狗时加一个LED显示,判断是否有喂狗,这种情况,除非你一直按着按键,不然一松按键超过一秒就又复位了,要通过另一个标志来判断有没有喂狗,不能通过同一个LED来判断有没有喂狗
按键应该设置为浮空输入