STM32窗口看门狗的喂狗初值传递的思考
利用原子哥的精英板学习窗口看门狗的过程中,有点疑问,在此写下来,希望能够起到抛砖引玉的作用,希望大家指正。
本次讨论的内容是窗口看门狗的源文件(wwdg.c),该源文件可在正点原子精英板的附带实例中找到,在该文件的第39行,定义了一个变量:
u8 WWDG_CNT=0x7f;//保存WWDG计数器的设置值,默认为最大。
在该文件的最后是一个中断服务函数,在该函数中实现喂狗操作,如下:
viod WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT); //当禁掉此句后,窗口看门狗将产生复位
WWDG_ClearFlag(); //清除提前唤醒中断标志位
LED1=!LED1; //LED状态翻转
}
我们注意到,喂狗就要写入初值,但该处写入的并不是初值,而是初值能取的最大值,
这个值可以是0x7f,也可以是小于等于0x7f,且大于等于0x4f的任何值,基于此,我认为应该对此处进行更改,以还原喂狗的初衷。
我在源文件中声明了一个变量“u8 WWDG_counter”,注意是声明而不是定义,因为我希望通过第19行的初始化函数“void IWDG_Init(u8 prer,u16 rlr) ”的第一个参数来初始化该变量,通过在该函数中加入 “WWDG_counter = prer;“语句来实现该变量的初始化,这样就把喂狗的计数初值传递到源文件中,这样中断服务函数中喂狗操作就能取得该值,从而避开了中断服务函数不能传入或返回参数的问题。改动如下:
viod WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_counter); //当禁掉此句后,窗口看门狗将产生复位
WWDG_ClearFlag(); //清除提前唤醒中断标志位
LED1=!LED1; //LED状态翻转
}
经过改动后,程序能正常运行,实现既定的功能,希望大家一起来讨论,还有没有更好的办法来将参数传送到中断服务函数中来,请大家批评指正,多多吐槽,谢谢!
STM32窗口看门狗的喂狗初值传递的思考
利用原子哥的精英板学习窗口看门狗的过程中,有点疑问,在此写下来,希望能够起到抛砖引玉的作用,希望大家指正。
本次讨论的内容是窗口看门狗的源文件(wwdg.c),该源文件可在正点原子精英板的附带实例中找到,在该文件的第39行,定义了一个变量:
u8 WWDG_CNT=0x7f;//保存WWDG计数器的设置值,默认为最大。
在该文件的最后是一个中断服务函数,在该函数中实现喂狗操作,如下:
viod WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT); //当禁掉此句后,窗口看门狗将产生复位
WWDG_ClearFlag(); //清除提前唤醒中断标志位
LED1=!LED1; //LED状态翻转
}
我们注意到,喂狗就要写入初值,但该处写入的并不是初值,而是初值能取的最大值,
这个值可以是0x7f,也可以是小于等于0x7f,且大于等于0x4f的任何值,基于此,我认为应该对此处进行更改,以还原喂狗的初衷。
我在源文件中声明了一个变量“u8 WWDG_counter”,注意是声明而不是定义,因为我希望通过第19行的初始化函数“void IWDG_Init(u8 prer,u16 rlr) ”的第一个参数来初始化该变量,通过在该函数中加入 “WWDG_counter = prer;“语句来实现该变量的初始化,这样就把喂狗的计数初值传递到源文件中,这样中断服务函数中喂狗操作就能取得该值,从而避开了中断服务函数不能传入或返回参数的问题。改动如下:
viod WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_counter); //当禁掉此句后,窗口看门狗将产生复位
WWDG_ClearFlag(); //清除提前唤醒中断标志位
LED1=!LED1; //LED状态翻转
}
经过改动后,程序能正常运行,实现既定的功能,希望大家一起来讨论,还有没有更好的办法来将参数传送到中断服务函数中来,请大家批评指正,多多吐槽,谢谢!
举报