本帖最后由 ouxili 于 2016-11-27 12:18 编辑
学习了窗口看门狗后对例程工作工程基本弄明白了,但是还是有两个问题,先说一下窗口看门狗的工作原理:窗口看门狗开始使能位WWDGATE位后,能够使系统产生复位有两种情况一种是计数器计数到0x3f,T6位跳变为0,;一种情况是WWDG_CR的值大于WWDG_CFR的值。因此为了防止产生复位,例程采用中断使窗口看门狗不断的喂狗,防止系统复位,效果就是led1不断的反转。
问题1:例程参数设置第一个参数设置为7f(因为与WWDG_CNT进行了与运算所以它的值不可能比7f大)设置的是计数初值,第二个参数是窗口上限值5f。问题来了,计数的初值7f比5f值大,满足系统复位的第二种情况为什么没有复位呢(从实验效果中得出的)。而且之后的每次喂狗值都是7f,也比5f值(窗口上限值)大,怎么就没有复位呢。
问题2:例程中开启窗口看门狗中断位使能EWI这个位我根据他的定义位置,推导一下:CFR_EWI_BB=0X420080A4这是这个使能寄存器具体地址,这个地址和中文参考手册没有对上号,因为这个EWI位属于WWDG_CFR寄存器的位9,该寄存器的偏移地址为04h,WWDG的挂载地址是直接在外设APB1PRIPPH_BASE下,也就是0x40000000.那么WWDG_CFR寄存器的地址应该是0X40000004下才对,这个和CFR_EWI_BB=0X420080A4对不上啊,请前辈们指点一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
刚学到这里,根据我的理解,回答你的第一个问题。
问题1:例程参数设置第一个参数设置为7f(因为与WWDG_CNT进行了与运算所以它的值不可能比7f大)设置的是计数初值,第二个参数是窗口上限值5f。问题来了,计数的初值7f比5f值大,满足系统复位的第二种情况为什么没有复位呢(从实验效果中得出的)。而且之后的每次喂狗值都是7f,也比5f值(窗口上限值)大,怎么就没有复位呢。
根据中文手册 窗口看门狗一节的描述 MCU产生复位的两种情况 ,这两种情况都与递减计数器的值何时刷新(喂狗)有关,也就是我们所说的“喂狗”操作,而并非指装载的值大小,被装载的值最大是0x7f,也可以是 0x6f(你测试试试)。窗口上限值要小于被装载的值,不然这个监控意义就小了一半。
当递减计数器被装载之后,它就会执行递减操作,其频率也可以计算。当减到0x40时会产生唤醒中断,在这个中断里面我们又再次喂狗。这个递减计数器就一直重复这个过程,系统不会复位。。。
至于第二个问题,就爱莫能助了
非常感谢你的解释,我再试试,看看这是不是这个样子。
看了看你的第二个问题,WWDG_CFR是挂在APB1PRIPPH_BASE,APB1PRIPPH_BASE就是APB1PRIPPH总线的基地址---0x40000000,而WWDG_BASE是挂在 APB1PRIPPH总线下,其基地址由下面语句定义。是0x40000000 + 0x2C00=0x40002C00。。
#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00),
然后在 WWDG_BASE下面计算各寄存器的地址。
这个图是参考手册存储器映射的截图,所以从图里看值应该是 0x40002C00-0X40002FFF,所以你说的CFR_EWI_BB=0X420080A4应该不对....
一周热门 更多>