STM32死机,内部硬件st32hal看门狗复位死机也不复位

单片机、电路板
连接器、接插件
其他元器件
STM32—IWDG独立看门狗的使用
STM32—IWDG独立看门狗的使用
STM32---IWDG独立看门狗的使用&&&&独立看门狗(IWDG)由专用的40kHz的低速时钟驱动,&&&&即使主时钟发生故障它也仍然有效。&&&&窗口看门狗由从APB1时钟分频后得到的时钟驱动,&&&&通过可配置的时间窗口来检测应用程
STM32---IWDG独立看门狗的使用&&&&独立看门狗(IWDG)由专用的40kHz的低速时钟驱动,&&&&即使主时钟发生故障它也仍然有效。&&&&窗口看门狗由从APB1时钟分频后得到的时钟驱动,&&&&通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。&&&&IWDG最适合应用于那些需要看门狗作为一个在主程序之外,&&&&能够完全独立工作,并且对时间精度要求较低的场合。&&&&WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。&&&&IWDG主要性能&&&&●自由运行的递减计数器&&&&●时钟由独立的RC振荡器提供(可在停止和待机模式下工作)&&&&●看门狗被激活后,则在计数器计数至0x000时产生复位&&&&在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;&&&&此时计数器开始从其复位值0xFFF递减计数。&&&&当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。&&&&无论何时,只要键寄存器IWDG_KR中被写入0xAAAA,&&&&IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位 。&&&&如果用户在选择字节中启用了“硬件看门狗“功能,&&&&在系统上电复位后,看门狗会自动开始运行;&&&&如果在计数器计数结束前,若软件没有向键寄存器写入相应的值,&&&&则系统会产生复位寄存器访问保护&&&&IWDG_PR和IWDG_RLR寄存器具有写保护功能。&&&&要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。&&&&以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。&&&&重装载操作(即写入0xAAAA)也会启动写保护功能。&&&&状态寄存器指示预分频值和递减计数器是否正在被更新。&&&&//启动独立看门狗&&&&IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //访问之前要首先使能寄存器写&&&&IWDG_SetPrescaler(IWDG_Prescaler_64);//64分频 一个周期1.6ms&&&&IWDG_SetReload(800);//最长12位 [0,.6=1.28S&&&&/* Reload IWDG counter */&&&&IWDG_ReloadCounter();&&&&IWDG_Enable();// Enable IWDG (the LSI oscillator will be enabled by hardware)&&&&因为独立看门狗使用的是LSI,所以最好程序启动的时候,使时钟源稳定:&&&&/* LSI的启动*/&&&&RCC_LSICmd(ENABLE);//打开LSI&&&&while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);//等待直到LSI稳定
上一篇:已经是第一篇
型号/产品名
潍坊展赫信息技术有限公司
深圳市锐技电子商行
中山市锐钜智能电子有限公司
深圳创德兴科技有限公司查看: 989|回复: 21
STM32的看门狗复位,是否会复位RTC的实时时钟
STM32的看门狗复位,是否会复位RTC的实时时钟。想用电池供电,保证系统的实时时钟一直处于工作状态,但是外接了一个硬件看门狗电路,当系统掉电以后,看门狗会产生复位,会不会复位实时时钟的值?
数据手册上面有写不会复位(RTC需要使用LSE)。
数据手册上面有写不会复位(RTC需要使用LSE)。
谢谢!!!
数据手册上面有写不会复位(RTC需要使用LSE)。
如果LSE被选为RTC时钟:
1、如果VDD供电被切断, AWU状态不能被保证
2、如果VDD供电被切断或内部电压调压器被关闭(1.8V域的供电被切断),则RTC状态不确定。
数据手册中提到这两点,是不是表明系统断电后,对RTC还是会有所影响???
VDD断掉,RTC还能运行吗?
VDD断掉,RTC还能运行吗?
如果LSE被选为RTC时钟:
●只要VBAT维持供电,尽管VDD供电被切断,RTC仍继续工作。
如果LSE被选为RTC时钟:
1、如果VDD供电被切断, AWU状态不能被保证
2、如果VDD供电被切断或内部电压调压 ...
现在看明白了:
如果LSE被选为RTC时钟:
只要VBAT维持供电,尽管VDD供电被切断,RTC仍继续工作。
如果LSI被选为自动唤醒单元(AWU)时钟:详见6.2.5节LSI时钟。
如果VDD供电被切断, AWU状态不能被保证
如果HSE时钟128分频后作为RTC时钟:
如果VDD供电被切断或内部电压调压器被关闭(1.8V域的供电被切断),则RTC状态不确定。
都是有前提条件的,只要选择LSE为RTC时钟,就可以电池供电保证RTC正常运行
如果LSE被选为RTC时钟:
●只要VBAT维持供电,尽管VDD供电被切断,RTC仍继续工作。 ...
那功耗可以做的比较低了。
现在用的片子RTC都公用VDD
那功耗可以做的比较低了。
现在用的片子RTC都公用VDD
你们用来做什么产品的?这个断电后,程序跑不起来了
你们用来做什么产品的?这个断电后,程序跑不起来了
RTC用于路灯控制类产品,停电后是不需要运行程序的,但RTC必须正确运行。
RTC单元独立供电,灵活性比较好。若想停电后运行程序,可以把VBAT和VDD连起来
RTC单元独立供电,灵活性比较好。若想停电后运行程序,可以把VBAT和VDD连起来 ...
恩,是的&&我们也是想用到这个停电后还能继续跑RTC的功能。正常的纽扣电池要支持这个RTC工作,可以正常工作多长时间?
恩,是的&&我们也是想用到这个停电后还能继续跑RTC的功能。正常的纽扣电池要支持这个RTC工作,可以正常工 ...
纽扣电池有很多种,不同型号容量不尽相同,即使相同型号,不同厂家也有所区别。
比如CR2032 有的厂家220mah,有的是200,根据容量除以RTC耗电,可以得到时间。
RTC单元独立供电,灵活性比较好。若想停电后运行程序,可以把VBAT和VDD连起来 ...
断电后把VDD和VBAT接起来,纽扣电池撑得住?
学习下,mark
断电后把VDD和VBAT接起来,纽扣电池撑得住?
撑不撑得住这个是靠整体设计的,并不是简单的Y/N选择。
很多含RTC的MCU就是一体供电的。
断电后把VDD和VBAT接起来,纽扣电池撑得住?
不能直接连起来&&否则电池不可能供的起整个芯片的电
撑不撑得住这个是靠整体设计的,并不是简单的Y/N选择。
很多含RTC的MCU就是一体供电的。 ...
我们刻意把两个地方的供电给分开,只要断电后保证电池能够正常供RTC的电就行了
原来试过STM32的RTC 很不准啊
原来试过STM32的RTC 很不准啊
很不准能达到多大的误差,第一次使用这个模块,楼上能分享点经验不?
我们刻意把两个地方的供电给分开,只要断电后保证电池能够正常供RTC的电就行了 ...
硬件供电设计分开才行,否则,也只能走软RTC。
硬件供电设计分开才行,否则,也只能走软RTC。
硬件电路已经分开了
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.comSTM32笔记之十三:恶搞,两只看门狗
> STM32笔记之十三:恶搞,两只看门狗
STM32笔记之十三:恶搞,两只看门狗
a)目的:了解两种看门狗(我叫它:系统运行故障探测器和独立系统故障探测器,新手往往被这个并不形象的象形名称搞糊涂)之间的区别和基本用法。本文引用地址:b)相同:都是用来探测系统故障,通过编写代码定时发送故障清零信号(高手们都管这个代码叫做&喂狗&),告诉它系统运行正常。一旦系统故障,程序清零代码(&喂狗&)无法执行,其计数器就会计数不止,直到记到零并发生故障中断(狗饿了开始叫唤),控制CPU重启整个系统(不行啦,开始咬人了,快跑&&)。c)区别:独立看门狗Iwdg&&我的理解是独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器。(这条狗是借来的,见谁偷懒它都咬!)主要用于监视硬件错误。窗口看门狗wwdg&&我的理解是系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。(这条狗是老板娘养的,老板不干活儿他不管!)主要用于监视软件错误。d)初始化函数定义:鉴于两只狗作用差不多,使用过程也差不多初始化函数栓一起了,用的时候根据情况删减。void WDG_Configuration(void);e)初始化函数调用:WDG_Configuration();f)初始化函数void WDG_Configuration()//看门狗初始化{//软件看门狗初始化WWDG_SetPrescaler(WWDG_Prescaler_8); //时钟8分频4ms// (PCLK1/4 Hz (~4 ms)WWDG_SetWindowValue(65);//计数器数值WWDG_Enable(127);//启动计数器,设置喂狗时间// WWDG timeout = ~4 ms * 64 = 262 msWWDG_ClearFlag();//清除标志位WWDG_EnableIT();//启动中断//独立看门狗初始化IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//启动寄存器读写IWDG_SetPrescaler(IWDG_Prescaler_32);//40K时钟32分频IWDG_SetReload(349);//计数器数值IWDG_ReloadCounter();//重启计数器IWDG_Enable();//启动看门狗}g)RCC初始化:只有软件看门狗需要时钟初始化,独立看门狗有自己的时钟不需要但是需要systic工作相关设置。RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);h)独立看门狗使用systic的中断来喂狗,所以添加systic的中断打开代码就行了。软件看门狗需要在NVIC打开中断添加如下代码:NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQC //通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //占先中断等级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应中断优先级NVIC_Init(&NVIC_InitStructure);//打开中断i)中断程序,软件看门狗在自己的中断中喂狗,独立看门狗需要使用systic的定时中断来喂狗。以下两个程序都在stm32f10x_it.c文件中。void WWDG_IRQHandler(void){WWDG_SetCounter(0x7F);//更新计数值WWDG_ClearFlag();//清除标志位}void SysTickHandler(void){IWDG_ReloadCounter();//重启计数器(喂狗)}j)注意事项:i.有狗平常没事情可以不理,但是千万别忘了喂它,否则死都不知道怎么死的!ii.初始化程序的调用一定要在systic的初始化之后。iii.独立看门狗需要systic中断来喂,但是systic做别的用处不能只做这件事,所以我写了如下几句代码,可以不影响systic的其他应用,其他systic周期代码也可参考:第一步:在stm32f10x_it.c中定义变量int Tic_IWDG;//喂狗循环程序的频率判断变量第二步:将SysTickHandler中喂狗代码改为下面:Tic_IWDG++;//变量递增if(Tic_IWDG>=100)//每100个systic周期喂狗{IWDG_ReloadCounter();//重启计数器(喂狗)Tic_IWDG=0;//变量清零}
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一stm32独立看门狗实验,为什么时间到了不会复位,喂下狗确立马复位
刚好反了。_stm32吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:30,701贴子:
stm32独立看门狗实验,为什么时间到了不会复收藏
stm32独立看门狗实验,为什么时间到了不会复位,喂下狗确立马复位
刚好反了。
stm32f405rgt6,电子元器件商城,满额送网红吹风机和平板电脑!百万库存线上订购,Future Electronics,原厂授权,,在线咨询下单,便捷购买,售后无忧.
登录百度帐号您当前的位置:&>&&>&&>&
stm32看门狗的使用
为什么使用看门狗
事情很简单先前做的一款采集数据的产品不知道为何异常,陷入死循环然后&死机&,分析了很多次,没发现原因,但是每次重新上点后就能正常采集到数据。后来找到了解决方法:看门狗!目的是当程序走入死循环或者硬件异常时,可以自动复位,这样就可以得到跟重新上电后差不多的效果了。
我使用的平台:stm32f103系列单片机
使用的烧写调试模式:Jlink SWD 模式。
使用官方模板库。
系列单片机看门狗分为两种:
1.独立看门狗,2.窗口看门狗。
独立看门狗:
可参看RM(reference Manual)的Independent watchdog (IWDG)
当然,只是简要查看下RM中的介绍(至于寄存器的操作,我们可以略过,因为我们使用库的开发,但是基本流程一定要了解!)。
在这里我们要抓住几个关键点:
a、stm32f10x系列有两个看门狗,看门狗主要用于检测由于软件出错的问题,并触发系统自动复位,或者触发一个中断(窗口看门狗才有)。
b、独立看门狗的时钟源为LSI,尽管主时钟出错,它还是能保持激活状态。窗口看门狗的时钟源为APB1时钟,并且可以修改分频值。
c、独立看门狗:有独立时钟(内部低速时钟LSI),所以不受系统硬件影响的系统故障探测器。主要用于监视硬件错误。精确度要求比较低。
d、窗口看门狗:时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了,主要用于监视软件错误。精确度要求更高。
看门狗原理简介:有某个寄存器按照时钟源不断的递减(有只狗,不断的消耗能量),当该寄存器为0时则会触发系统复位(狗会叫),为了不使得寄存器为0,我们就要按时的重新设置寄存器的值(喂狗),这样当软件正常工作时(正常喂狗,狗就不会叫)不断的重设寄存器就不会导致复位。当万一软件陷入死循环,不再重设寄存器(没有喂狗,狗就会叫)。这样就会产生复位了。
因此,假设我们有个软件有时候会内存出错,或者陷入死循环,那么我们就可以通过独立看门狗来使得该器件复位。
废话少说:
代码示例:伸手党快来!
//----------------------
void IWDG_Init()
//Enable write access to IWDG_PR and IWDG_RLR registers
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//Configure the IWDG prescaler
IWDG_SetPrescaler(IWDG_Prescaler_16); //10k
//Configure the IWDG counter value
IWDG_SetReload(2500); // Bits11:0 RL[11:0]: Watchdog counter reload value ~ Only 12bit ~max value = 4096
IWDG_ReloadCounter();
IWDG_Enable();
//----------------------
What?这代码是怎么写出来的,Don't worry,Let me tell you !
由于我们使用的是官方的库,因此有很多文档说明!看看注释就知道啦!如下:
首先,打开官方库的任一template:使用keil MDK 打开如下目录
stsw-stm32062.zip\STM32F2xx_StdPeriph_Lib_V1.1.0\Project\STM32F2xx_StdPeriph_Template\MDK-ARM
这样你就会在左手边看到一个如下图一样的文件。简要查看下,我们所要使用的是IWDG这个功能。因此肯定是stm32f2xx_iwdg.c这个文件啦!(f2xx系列的库才有注释,10x的没有。。不过差不多,可能10x的教程相对较多。
打开后就有相关的详细介绍了!
* ===================================================================
* How to use this driver
* ===================================================================
* 1. Enable write access to IWDG_PR and IWDG_RLR registers using
* IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) function
* 2. Configure the IWDG prescaler using IWDG_SetPrescaler() function
* 3. Configure the IWDG counter value using IWDG_SetReload() function.
* This value will be loaded in the IWDG counter each time the counter
* is reloaded, then the IWDG will start counting down from this value.
* 4. Start the IWDG using IWDG_Enable() function, when the IWDG is used
* in software mode (no need to enable the LSI, it will be enabled
* by hardware)
* 5. Then the application program must reload the IWDG counter at regular
* intervals during normal operation to prevent an MCU reset, using
* IWDG_ReloadCounter() function.
别说看不懂哈!
如下验证整个看门狗的过程:
IWDG_Init();
IWDG_ReloadCounter();
printf(&SysInit\r\n&);
Delay_us(1000);
IWDG_ReloadCounter();
printf(&1000 \r\n&);
Delay_us(10000);
IWDG_ReloadCounter();
printf(&10000 \r\n&);
Delay_us(100000);
IWDG_ReloadCounter();
printf(&100000 \r\n&);
Delay_us(200000);
IWDG_ReloadCounter();
printf(&200000 \r\n&);
Delay_us(300000);
IWDG_ReloadCounter();
printf(&200000 \r\n&);
Delay_us(400000);
IWDG_ReloadCounter();
printf(&400000 \r\n&);
Delay_us(500000);
IWDG_ReloadCounter();
printf(&500000 \r\n&);
Delay_us(600000);
IWDG_ReloadCounter();
printf(&600000 \r\n&);
Delay_us(700000);
IWDG_ReloadCounter();
printf(&700000 \r\n&);
Delay_us(800000);
IWDG_ReloadCounter();
printf(&800000 \r\n&);
Delay_us(900000);
IWDG_ReloadCounter();
printf(&900000 \r\n&);
Delay_us(1000000);
IWDG_ReloadCounter();
printf(&1000000 \r\n&);
IWDG_ReloadCounter();
Delay_us(2000000);
printf(&2000000\r\n&);
这样,设置的看门狗必须为每1s喂狗一次,因此,到最后的延时2s的打印函数是不会被打印出来的,直接又一次复位了.
另外,需要注意的是:
独立看门狗的ReloadCounter寄存器只有12位~!意思就是,最大值为2的12次方 = 4096,千万不能超出!
独立看门狗的时钟如上图为40khz.

我要回帖

更多关于 看门狗1主线任务攻略 的文章

 

随机推荐