|
发表于 2014-4-11 11:52:48
|
显示全部楼层
本帖最后由 Gorgon_Meducer 于 2014-4-11 12:00 编辑
芯片型号?你的WDT寄存器操作时序有问题,我记得WDT操作是有严格时序的。你这样用与或操作多半是
没法满足要求的。
这里是我以前写的一个WDT初始化代码的例子——没有初始化成中断模式,但是你可以修改下:
你要特别注意代码的注释——我从PDF上抄下来的。特别说明下,这里SAFE_ATOM_CODE是处理关中断开中断的,
以保证括号里面的代码执行的时候不会被中断处理程序打断。
- void Enable_Watchdog(void)
- {
- SAFE_ATOM_CODE (
- //! In the same operation, write a logic one to WDCE and WDE.
- WDTCR = BIT(WDCE) | BIT(WDE);
- /*! Within the next four clock cycles, in the same operation,
- * write the WDE and WDP bits asdesired, but with the WDCE bit cleared.
- */
- WDTCR = BIT(WDE) | (0x06 << WDP0); //! 0.24s(3.0v) 0.22s(5.0v)
- );
- }
复制代码
你要注意到,代码里面对看门狗寄存器的操作都是直接的写操作,并且有严格的顺序
1、同时对WDCE和WDE位置位
2、在步骤1之后的4个时钟周期内,同时置位WDE以及对应的WDP设置。
你的代码用了与或操作,也没有做中断保护,根本不可能保证上面的时序要求。另外特别说明下,对于某些编译器
比如GCC,即便你代码写成我这样,不开优化,生成的代码会非常笨,仍然会超过4个时钟周期的要求。 |
|