【问题】设置完wakeup时间后,启用wakeup中断后,立刻就收到了该中断。
之前的很多次只是,将 中断位清除了,但是,中断源并没有禁止.
所以,在第一次的wakeup中断处理函数里面,将中断使能禁止了.
但是,中断源还是存在的,其如果是电平触发中断,那么比如其已经是高电平去触发了该中断,
但是对应的中断位并没有被清除,而且,如果只是单单清除了中断位,那么实际上,
由于中断源并没有被立刻禁止,而其高电平还没有消失,那么,中断位马上又被电平触发的中断源置成1了,
所以,再重新设置wakeup时间的时候,即使去清除了中断源,结果再写完对应的wakeup时间后,立刻
enable wakeup中断,期望的是经过多少多少秒之后收到wakeup中断,但是实际却是立刻收到了中断,
使得程序允许不正常。
具体原理解释如下:
(1)—————-> (2)[1 bit 0/1]—>(3)[寄存器的某位 Enable/Disable]—>(4)实际中断输出
其中:
(1)中断源:此处是电平触发,如果高电平,则表明中断发生,同时将(2)中断位置1,表明中断发生。
特别要注意的是,如果中断位被清除成0,但是此时电平仍旧为高电平,电平没有消失的话,
那么还是会将中断位重新置1的。
(2)中断位:表明是否有中断发生。1:发生;0:未发生。
(3)中断使能:表示是否允许该中断发生。
此处是通过向某个对应的寄存器的某位,写1使得允许此中断发生,写0,不允许该中断发生。
也就是说,即使物理上发生了该中断源,即中断源是高电平将中断位置1了,但是如果关闭中断使能,
外部也就是(4)是收不到中断的。
(4)外部能否收到该中断。
【解决办法】
要先清除中断源,然后再清除中断位,这样就可以达到彻底清除相关信息了,
再设置新的wakeup时间和启用wakeup中断后,程序就会按照期望的,等过了对应设置的时间后,
才会收到wakeup中断。
【总结】
此办法是通过硬件工程师的帮助才解决的。
理解底层软件运行机制和解决问题,需要对硬件各个部分的机制很了解才可以。