上次发现WWDG不能用,准确的说是不能仿真.所以就没有弄了.前几天,没事干的时候把它再弄了一下,突然发现keil的仿真中WWDG->CR寄存器的值能动了,一下就来劲了.不过后来发现又不行了.于是又看书,看究竟是怎么搞的.后来发现在寄存器描述里面提到,在发生wwdg复位之后,一定要硬件复位,EWI标志才会清除,不过这个和WWDG->CR计数器的关系不大,看资料说WWDG->CR是只要开启,就会进行自减计数的.
keil不知道能不能仿真硬件复位.不过照这样的仿真结果,应该是keil的仿真有问题的.所以就按IWDG的思路写了代码:
int main(void)//GPIO
{
Stm32_Clock_Init();//系统时钟设置
led_init();
delay_init(72);//72M系统时钟
delay_ms(300);
wwdg_init(); //配置并使能WWDG
while (1)
{
LED0_SET(0);
delay_us(500000);//在这里系统重启
}
}
直接刷stm32.发现LED亮一下就不亮了,估计是发生了重启,然后我的BOOT设置还是在串口下载模式,于是吧boot改了,发现整个就运行起来了,灯一闪一闪的...
证明我的WWDG设置是正确的,而keil仿真,则出不了结果.所以提醒网友在使用wwdg的时候,keil仿真出不了,但是实际只要你的寄存器设置正确了,还是会跑的.也说明了一个仿真,不是万能的,啥都得实际验证才能算数.想起毛爷爷一句话:实践是检验真理的唯一标准.
附上wwdg的设置头函数
#ifndef __WWDG_H
#define __WWDG_H
//WWDG使用
//下载完后,把BOOT0改为低电平,
//并按复位键后,才能看到现象!!
//正点原子@SCUT
//2008/12/19
//V1.0
//复位时间59ms左右.
void wwdg_init(void)
{
RCC->APB1RSTR|=1<<11; //复位wwdg
RCC->APB1RSTR&=~(1<<11);
RCC->APB1ENR|=1<<11; //使能wwdg时钟
WWDG->CFR|=3<<7; //PCLK1/4096再8分频
WWDG->CFR|=80; //设定窗口值为80
WWDG->CR|=1<<7; //使能WWDG看门狗
}
#endif
用户506238 2009-3-12 13:04
liujun6037_345432000 2009-3-5 16:26
用户506238 2009-3-5 13:08