STM WWDG使用注意.doc_第1页
STM WWDG使用注意.doc_第2页
STM WWDG使用注意.doc_第3页
STM WWDG使用注意.doc_第4页
STM WWDG使用注意.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

于WWDG的疑问 回复数:18,点击数:565 【楼主位】 jeowill 积分:18派别:等级:-来自:环境如下: IDEMDK 板子STM3210E 测试程序: voidWWDG_Test(void) /EnableWDGclocks RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); /PCKL1:36MHZ WWDG_SetPrescaler(WWDG_Prescaler_8); /SetWindowvalueto65 WWDG_SetWindowValue(65); WWDG_Enable(127); /ClearEWIflag WWDG_ClearFlag(); /EnableEWinterrupt WWDG_EnableIT(); while(1) voidWWDG_IRQHandler(void) /WWDG_SetCounter(0x7F); /WWDG_ClearFlag(); /香水城的文章/STM32/135104/message.aspx中说:在中断里面喂狗是没有意义的; /从灯灭,灯亮(示波器也可以看到)来看,如果这两句存在的话;灯可以持续闪烁,但是程序不会重启; /看起来狗被喂了; /但是终究不能把狗放到这里来喂,比如应该在上面的那个while(1)里面来喂,但是当我注释掉这里的“喂狗”, /将WWDG_SetCounter(0x7F);WWDG_ClearFlag();移动到上面的while(1)后,系统就不断的重启; /现在的问题是:WWDG的这个狗到底该怎么喂? if(1) staticunsignedcharbval=0; if(0=bval) GPIO_SetBits(GPIOF,GPIO_Pin_9);/LED4亮 bval=1; else GPIO_ResetBits(GPIOF,GPIO_Pin_9);LED4灭 bval=0; 2009-05-22,17:02:48 资料 邮件 回复 引用回复 编辑 删除 【1楼】 _STM32_ 积分:1128派别:等级:-来自:窗口看门狗的特点是:不能在狗饱时喂狗,也不能在狗饿时喂狗 狗饿时喂狗,狗要咬人;狗饱的时候喂,狗也要咬人;只能在一个时间段内、当狗半饱的时候喂,狗才能乖乖地干活。 一般的看门狗是在任何时间都可以喂狗,不管狗是不是已经饱了。 你把喂狗操作放到主循环中,就是属于狗饱的时候喂,它当然要咬人了。 WWDG_IRQHandler是在喂狗窗口的最后产生的中断,产生这个中断时表示即将产生看门狗复位,也就是说程序中出现了问题,预定的喂狗操作没有被执行,出现了意想不到的错误,在这个中断里你需要赶紧把重要的数据存起来,做紧急关机等动作,而不是简单地喂狗,那样只能是错上加错,掩盖了其它的错误。正常情况下,不应该进入这个中断。 可以看看我的博客:如何使用STM32的窗口看门狗 2009-05-22,17:21:13 资料 邮件 回复 引用回复 编辑 删除 【2楼】 jeowill 积分:18派别:等级:-来自:你好,香水城;谢谢你这么快的回复; 理论上,我理解WWDG_IRQHandler的用途;它只是为了在复位前做一些关键的操作,比如重要数据的保存; 只是目前,我还没不知道狗是不是办饱; 我猜想:WWDG_Enable(0x7F);0x7F递减到0x3F的时候,应该就产生RESET,事件也就在0X3F的前一个计数; 那么半饱是不是意味这Counter=0x3F+(0x7F-0x3F)/2也就是Counter=0x5F? 那么这个函数就改写成: voidWWDG_Test(void) /EnableWDGclocks RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); /PCKL1:36MHZ WWDG_SetPrescaler(WWDG_Prescaler_8); /SetWindowvalueto65 WWDG_SetWindowValue(65); WWDG_Enable(127); /ClearEWIflag WWDG_ClearFlag(); /EnableEWinterrupt WWDG_EnableIT(); while(1) if(WWDG-CR&0x7F)=0x5F) WWDG_SetCounter(0x7F); WWDG_ClearFlag(); 中断中没有喂狗,只对指示灯进行电平翻转 但是这样测试以后,没有起到喂狗的作用 仍然不断的重启。 2009-05-22,17:47:43 资料 邮件 回复 引用回复 编辑 删除 【3楼】 _STM32_ 积分:1128派别:等级:-来自:正常情况下,根本不可能进WWDG中断,怎么可能点亮LED? 是不是半饱是你自己设置的,WWDG_SetWindowValue就是做这个的。 2009-05-22,17:53:17 资料 邮件 回复 引用回复 编辑 删除 【4楼】 jeowill 积分:18派别:等级:-来自:是这样的,当我启动了WWDG后, 我就直接进入一个死循环, while(1) ; 59毫秒后,就产生了中断WWDG_IRQHandler(void); 59毫秒,我可以看到LED闪一下然后就重启了,然后不断的重启,看灯不可靠,用示波器可以很清楚的看到灯确实被点亮了, 我把中断中的电灯代码注释掉,灯就不会闪烁,示波器也没有脉冲,当然仍然是不断的重启。 (如果在中断里面写,就不会重启,灯就会的闪烁频率就是60ms的方波) 我现在疑惑的是,WWDG喂狗的代码应该写在哪个地方; 2009-05-22,21:18:21 资料 邮件 回复 引用回复 编辑 删除 【5楼】 jeowill 积分:18派别:等级:-来自:我的例子就是基于官方的STM3210E的例子um0549, WWDG的代码很少,基本上任何一款STM3210X的开发板的例程都可以进行WWDG的测试; 第一步,在原有函数InterruptConfig里面追加: NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_Init(&NVIC_InitStructure); 第二步,编写WWDG测试函数voidWWDG_Test(),并在main函数的时钟,端口,中断等初始化完成后,调用; voidWWDG_Test(void) /*CheckifthesystemhasresumedfromWWDGreset-*/ if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)!=RESET) /*WWDGRSTflagset*/ /*Clearresetflags*/ RCC_ClearFlag(); /*WWDGconfiguration-*/ /*EnableWWDGclock*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); /*WWDGclockcounter=(PCLK1/4096)/8*/ WWDG_SetPrescaler(WWDG_Prescaler_8); /*SetWindowvalueto0x41*/ WWDG_SetWindowValue(0x41); /*EnableWWDGandsetcountervalueto0x7F,WWDGtimeout=4ms*64=262ms*/ WWDG_Enable(0x7F); /*ClearEWIflag*/ WWDG_ClearFlag(); /*EnableEWinterrupt*/ WWDG_EnableIT(); while(1) /这里并非说我要做个死循环,他只是代表我的这段代码将需要很长一段时间才能完成; /为了方便测试,把这个时间做成无限长罢了; /如果这里不能喂狗,哪里喂狗才适合呢?中断里面喂狗又没有意义。 第三步,编写WWDG_IRQHandler()函数(当然,这个函数的声明加一个到头文件中去) voidWWDG_IRQHandler(void) /WWDG_SetCounter(0x7F); /WWDG_ClearFlag(); if(1)/如果不想看到灯闪烁,就if(0)即可,这个已经用示波器验证。 staticunsignedcharbval=0; if(0=bval) GPIO_SetBits(GPIOF,GPIO_Pin_9); bval=1; else GPIO_ResetBits(GPIOF,GPIO_Pin_9); bval=0; 上面三部,也基本是参考了英贝特网上的评估程序包200842318393237770,我就写了点灯的而已; 最后,就是说,这个WWDG应该怎么喂? 2009-05-22,21:35:40 资料 邮件 回复 引用回复 编辑 删除 【6楼】 fandipeng412 积分:154派别:等级:-来自:窗口看门狗的特点是:不能在狗饱时喂狗,也不能在狗饿时喂狗 说的很贴切,记下 2009-05-22,21:53:34 资料 邮件 回复 引用回复 编辑 删除 【7楼】 jeowill 积分:18派别:等级:-来自:这个事情非常困扰我; 晚上看到笨笨的解释http:/www.*.com/html/99/t-2599.html 他把IWDG的喂狗动作给了SysTick_Handler中断函数, 如果放到这种恒运行的中断里面来喂狗;应该达不到监控的目的;因为主循环跑飞了,中断说不定还正常; 他把WWDG的喂狗动作给了WWDG_IRQHandler中断函数, 那这种做法正好跟香水楼的设计理念相违背; 2009-05-22,22:08:51 资料 邮件 回复 引用回复 编辑 删除 【8楼】 jeowill 积分:18派别:等级:-来自:六楼的含义基本和香水楼的吻合;只是在如何去执行WWDG的喂狗动作; 从条件上来看,在WWDG_IRQHandler函数被触发的时候, 1.正好满足“狗不饱”,因为counter已经接近复位临界; 2.正好满足“狗不饿”,因为counter还没有达到临界; 事实上,我只要在这个函数里面喂狗,保证就不会重启了。 六楼的意思是应该在WWDG_IRQHandler函数内喂狗?但是香水楼的实际操作并非要这样啊。 2009-05-22,22:15:25 资料 邮件 回复 引用回复 编辑 删除 【9楼】 _STM32_ 积分:1128派别:等级:-来自:回4楼:启动了WWDG后直接进入一个死循环,如果不做任何事情,狗刚刚吃过还没有饿就喂狗,当然要产生复位。 说了半天你还是没有明白。 你需要先做一些事情,让狗有时间消化。 比如你已经看到,看门狗大概59ms会产生复位,即从0x7F减到0x3F需要这么长时间,即大约0.923ms看门狗计数器减1,那么如果按照楼主位程序的设置,WWDG_SetWindowValue(65)设置了窗口值,既只能在计数器值为65(0x41)至0x3F这段时间喂狗才可以,早了晚了都不行。这就是时间窗口,你的程序必须在初始化好WWDG后先做57.156ms的事情,然后在57.156ms59ms之间的时间中喂狗;57.156ms对应窗口值65,就是WWDG_SetWindowValue(65)设置的时间。 注意:所有计算是按照你给的这个59ms参数计算,如果使用其它参数,按比例计算即可。另:按照STM32参考手册上的数据,估计你的设置产生复位的准确时间应是58.25ms。 2009-05-22,22:31:36 资料 邮件 回复 引用回复 编辑 删除 【10楼】 jeowill 积分:18派别:等级:-来自:斑竹居然还在线,敬佩! 0x41到0x3F之间时间可以说很短了,看来我要启动一个全局的定时器,从systick取值; 然后不断的判断当前时间差,判断大概走了多少个计数,如果大于(0x7F-0x41),就马上喂狗; 感觉牵扯的东西有点多,这只狗要吃天鹅肉一样的感觉,呵呵; 另外,我在/stonline/mcu/MCU_Pages.htm网站上下载了一些实例, 其中就有WWDG的,居然例子是在WWDG_IRQHandler中喂狗!不可思议。 2009-05-22,22:47:02 资料 邮件 回复 引用回复 编辑 删除 【11楼】 _STM32_ 积分:1128派别:等级:-来自:首先,那个例子只是为你演示如何喂狗,并不是演示应不应该在中断中喂狗。 其次,窗口型看门狗本来是其它MCU中没有的功能,应该说是ST首创,目的是为了更好更精确地保证软件的坚强性。这是一个新的概念,首次接触可能一时不好理解,所以会感到有点麻烦,但如果你真正地理解了它,学会会用它,你就会逐渐地体会到它的好处,并最终爱上这只狗,呵呵。 2009-05-22,22:53:29 资料 邮件 回复 引用回复 编辑 删除 【12楼】 jeowill 积分:18派别:等级:-来自:谢谢香水城不厌其烦的帮助, . WWDG_SetWindowValue(0x42);/这个值很关键,如果设置成0x41,中断会被触发,0x42到0x7F之间,则可以达到喂狗的效果; . while(1) if(WWDG-CR&0x7F)CFR&0X7F) WWDG_SetCounter(0x7F); WWDG_ClearFlag(); 于是,可以制作一个函数,如下,指定的位置调用,好像很方便; voidfeed_wwdg() if(WWDG-CR&0x7F)CFR&0X7F) WWDG_SetCounter(0x7F); WWDG_ClearFlag(); 但是这个中断,什么时候关呢?难道所有的应用层函数,都需要来调用这个喂狗函数? 这样一来,好像别IWDG没有好到哪里去,仅仅得到了最后的一次处理异常的机会,是不是? 2009-05-22,23:05:46 资料 邮件 回复 引用回复 编辑 删除 【13楼】 clever0725 积分:380派别:等级:-来自:浙江.桐乡马上就要用到了谢谢啊 2009-05-22,23:18:19 资料 邮件 回复 引用回复 编辑 删除 【14楼】 jeowill 积分:18派别:等级:-来自:/startWWDGinterrupt delay_ms(56);/如果这里的等待时间小于等于56ms,就可以顺利的喂狗,如果超过56ms就危险了; if(WWDG-CR&0x7F)CFR&0X7F) WWDG_SetCounter(0x7F); WWDG_ClearFlag(); WWDG_SetWindowValue如果设置的值设置的越小,说明对监控部分的代码要求等级越高; 2009-05-22,23:27:32 资料 邮件 回复 引用回复 编辑 删除 【15楼】 jeowill 积分:18派别:等级:-来自:修正理解, 应该是 if(WWDG-CR&0x7F)CFR&0X7F)/前面写的是cmp_val) i-=50;/这里是故意将值打乱,这样就没有机会产生break; if(icmp_val) break;/本来是希望这

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论