STM32
直播中

大彭

10年用户 1061经验值
擅长:电源/新能源 嵌入式技术
私信 关注
[问答]

STM32窗口看门狗的喂狗初值是如何去传递的

窗口看门狗的源文件有何作用?
STM32窗口看门狗的喂狗初值是如何去传递的?

回帖(1)

陈莉

2021-8-5 15:10:23
  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状态翻转
  }
  经过改动后,程序能正常运行,实现既定的功能,希望大家一起来讨论,还有没有更好的办法来将参数传送到中断服务函数中来,请大家批评指正,多多吐槽,谢谢!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分