程序调试已经过了12点,之所以这么晚是因为窗口看门狗遇到了问题,遇到了跟大多数坛友一样的问题
当我将窗口看门狗初始化函数的顺序稍微变一下是,程序完全不按套路出牌。
先看看我开始的代码吧!
[mw_shl_code=c,true]WWDG_SetWindowValue(0x5f);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_ClearFlag();
WWDG_SetCounter(0x7f);
WWDG_Enable(0x7f);//错误写法
WWDG_EnableIT();[/mw_shl_code]
程序下载进去之后,DS0常亮;
到底是什么原因呢?后来我改了好几回,却始终不见什么起色,
最后只好对着源码逐行更改,这一行不行,这一行也不行。。。。。。
但当我改变着一行的顺序时,终于可以了
修改后的代码:
[mw_shl_code=c,true]WWDG_Enable(0x7f);
WWDG_SetWindowValue(0x5f);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_ClearFlag();
/WWDG_SetCounter(0x7f);
WWDG_EnableIT();[/mw_shl_code]
再后来我在ST官方指南上看到这样一句话:
那么我们可以想象这样一种情况:
程序开始运行,递减计数器运行,T6没被设置,低于窗口值产生复位信号,
然后重新进入主程序继续点亮DS0,这一次跟上次是一样的运行条件,
所以这次一样会产生复位信号,这样的话,我们的程序就在窗口初始化函数之前进入死循环了;
所以会看到DS0一直亮,没有进入主程序的死循环;
这样一来,以后每次操作窗口寄存器的时候首先应该写Enable()函数
这样的话可以在启用时马上装初值,实测通过。
ps:我也是ARM初学者,很多寄存器都不熟悉,以上只是个人调试程序之后的见解,
难免有不当之处,还请大家指正。  
|