STM32开发笔记WWDG和IWDG的用法
STM32IWDG设置
STM32IWDG设置
STM32 有两个看门狗,这里介绍的是IWDG内部看门狗。
时钟来源:内部的40KHz的时钟,与系统时钟无关!
如下所示:
这里的fsoc才是IWDG真正的时钟!(IWDG_Prescaler_XX指的是XX分频)。
IWDG的重载值寄存器:RLR 是一个16位的寄存器,只有低12bit可以使用,其他的保留!所以重载值最大是0xFFF
也就是从IWDG最大从0xFFF减到0 然后如果没有喂狗就会引起系统软件复位!
所以定时时间Time可以如下计算:
Time = (XX /(40*10^3))*Val(RLR) (s)
XX表示40KHz的分频!
设置2s的IWDG如下:
[plain] view plain copy
1.IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //允许写IWDG
2.IWDG_SetPrescaler(IWDG_Prescaler_64); //设置分频
3.IWDG_SetReload(1250); //设置Reload
4.IWDG_ReloadCounter();//重载值
5.IWDG_Enable();//时能IDWG
Time = (64/(40*10^3))*1250 =2s
注意在程序里面要手动喂狗!喂狗代码如下:IWDG_ReloadCounter();
如果大于2S不喂狗就会复位了!。
Finder自学stm32笔记之电源时钟
电源STM32的工作电压(VDD)为2.0~3.6V。
通过内置的电压调节器提供所需的1.8V电源。
当主电源VDD掉电后,通过VBA T脚为实时时钟(RTC)和备份寄存器提供电源。
由上图可知VDDA.VSSA分别是独立给ADC的电源盒电源地。
ADC需要准确的精度因此需要独立的电源供电。
使用电池或其他电源连接到VBAT脚上,当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。
以便于RTC、后备区域、一些寄存器工作当然也需要外部振荡器提供时钟,所以也为LSE振荡器供电。
stm32中有上电复位掉电复位电路,可以设置通过设置PVDE位设置PVD阀值,当VDD 电压异常的时候就会复位,可以设置中断。
低功耗模式三种低功耗模式睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)停止模式(所有的时钟都已停止而电压还在供给) :是深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。
此时在1.8V供电区域的的所有时钟都被停止,PLL、HSI和HSE RC振荡器的功能被禁止,SRAM和寄存器内容被保留下来。
在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态。
待机模式(1.8V电源关闭):待机模式可实现系统的最低功耗。
该模式是在Cortex-M3深睡眠模式时关闭电压调节器。
整个1.8V供电区域被断电。
PLL、HSI和HSE振荡器也被断电。
SRAM和寄存器内容丢失。
只有备份的寄存器和待机电路维持供电。
前面是三者的详细介绍,初一看看不出有什么区别,我当时都看的晕呼呼地,做笔记时候才发现他们真正的不同。
现在讲解一下。
睡眠模式只是关掉了CM3的内核,外设都在运行包过内部外部时钟、IO口、中断NVIC 等等。
停止模式是进一步的睡眠模式它是关掉了所有的外设时钟,但是仍旧在供电。
待机模式是最低功耗的模式,它连时钟供电全部禁止除了备份的寄存器和待机电路维持供电。
ARM原理及应用复习题(附答案)
《ARM原理及应用》复习题填空题1.STM32F103是_32_位单片机,内核是ARM公司的___Cortex-M3___。
2.STM32F103最高工作频率___72MHz___。
片内具有多种外设,它们分别是:_GPIO_、_USART_、_I2C_、_SPI_、_ADC_、_DAC_、_TIM_、_RTC_、_IWDG_、_WWDG_。
IWDG:独立看门狗WWDG:窗口看门狗3.STM32103的GPIO端口具有多种配置状态,输入有3种状态,它们分别是_模拟输入_、_浮空输入__和上拉/下拉输入;输出有4种状态,它们分别是_通用推挽输出_、_通用开漏输出_、_复用推挽输出_和_复用开漏输出_。
5.当STM32I/O端口配置为输入时,输出功能被_禁止_,施密特触发器被激活__。
6.STM32的所有端口都有外部中断能力。
当使用外部中断线时,相应的引脚必须配置成输入模式。
7.STM32具有单独的位设置或位清除能力。
这是通过GPIOx->BSRR_和GPIOx->BRR寄存器来实现的。
8.STM32芯片内部集成的12位位ADC是一种逐次逼近(比较)型模拟数字转换器,具有18个通道,可测量16个外部和2个内部信号源。
9.STM32的NVIC管理着包括Cortex-M3核异常等中断,其和ARM处理器核的接口紧密相连,可以实现时延的中断处理,并有效地处理后到中断。
10.系统计时器(SysTick)提供了1个24位二进制递减计数器,具有灵活的控制机制11.STM32通用定时器TIM的16位计数器可以采用三种方式工作,分别为向上计数模式、向下计数模式和向上下计数模式。
12.STM32系列ARM Cortex-M3芯片支持三种复位形式,分别为上电复位、按键复位和备份复位。
简答题1.什么是嵌入式系统?嵌入式系统一般由哪几部分构成?它与通用计算机有何区别?答:是一种嵌入受控器件内部,为特定应用而设计的专用计算机系统,具有“嵌入性”、“专用性”和“计算机系统”3个基本要素。
如何设计STM32单片机独立看门狗程序?
如何设计STM32单片机独立看门狗程序?[导读]今天要学习的是独立看门狗,看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O 引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位。
即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
今天要学习的是独立看门狗,看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位。
即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
1.1独立看门狗简介看门狗定时器 (WDT,Watch Dog Timer)是单片机的组成部分,它实际上是一个计数器,一般给看门狗一个数值,程序开始运行后看门狗开始倒计时。
如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始计数,也就是所谓的“喂狗”。
如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。
独立看门狗由专用低速时钟(LSI)驱动,计时主时钟发生故障它也仍然有效。
看门狗主要是用于在发生系统软件故障时,将系统复位。
也可以用于将系统从休眠或空闲模式唤醒。
STM32看门狗WWDG和IWDG的区别是什么
STM32 看门狗WWDG 和IWDG 的区别是什么STM32 有2 个看门狗:独立看门狗和窗口看门狗。
独立看门狗IWDG:独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。
窗口看门狗WWDG:系统内部的故障探测器,时钟与系统相同。
如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。
简单的讲,看门狗就是检测系统故障的,如果因为系统故障而没有及时喂狗,则引发复位重启。
对于一般的独立看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但是这样有一个隐患,有可能程序跑乱了又跑回正常的地方,或者跑乱的程序正好执行了刷新看门狗操作,这样的情况下一按的看门狗就检测不出来故障了;但是如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗,也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行,非正常地跳过了某些程序段的情况。
IWDG和WWDG分析
IWDG和WWDG分析关于本博文的介绍:1.基于STM32F103ZET芯片和3.5V标准库2.分开介绍两种模式:独立看门狗IWDG和窗口看门狗WWDG3.从寄存器,介绍到对应的库函数;一什么是看门狗?单片机系统在正常执行程序时,当收到外界各种物理干扰或其他原因出现程序跑飞或者陷入死循环的现象,而使得正常的程序无法正常运行,导致MCU挂掉,看门狗就是为了解决这么个问题而出现的;二工作原理在一定时间内(时间由看门狗定时计数器决定)没有接收到喂狗信号(表示MCU挂了),便实现处理器自动复位重启(发出复位信号);** IWDG和WWDG的时钟源 **从图中可以看出:1.独立看门狗IWDG有自己独立的时钟源——LSI2. 窗口看门狗WWDG的时钟源——PCLK1由此图可以看出:在编程时,IWDG不需要使能时钟源,而WWDG需要;所以IWDG的操作会比较简单一些;独立看门狗定时器IWDG一相关寄存器以及功能(1)键值寄存器IWDG_KR功能和使用方法:1.当[15:0]位被写入0xCCCC时,使能,此时寄存器从其0xFFF 开始递减计数,当递减到0x0000时,会产生一个复位信号(IWDG_RESET)2.当[15 : 0]位被写入0xAAAA时,IWDG_RLR寄存器中的值将会被重新加载到计数器中(这就是喂狗的过程),就是通过这个功能,从而避免产生MCU复位;3.当寄存器被写入0x5555时,可以访问IWDG_PR和IWDG_RLR寄存器;(这里要注意了,这个重要,因为如果IWDG_PR和IWDG_RLR不能被写入数据,也就是相当于无法给IWDG预分频和重载值)(2)预分频寄存器IWDG_PR功能和使用:对照着对[2:0]位的介绍选择分频因子;(3)重载寄存器IWDG_RLR功能和使用方法:看方框中吧;(4)状态寄存器IWDG_SR功能和使用方法:看方框中吧;二编程步骤1.取消寄存器写保护(也即是先IWDG_KR中写入0x5555)2.目的:取消PR和RLR寄存器写保护,从而可以操作这两个寄存器3.库函数:4.void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);5.设置预分频系数和重装载值6.库函数:7.void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);8.void IWDG_SetReload(uint16_t Reload);9.这里要明白一个重要的概念:10.Tout(ms) = ((4*2^prer) * rlr)/40;Tout:要设置的溢出时间,也就是多久初始化一次MCU,单位是msprer :分频系数rlr :重载值;比如:prer = 4,rlr = 625时,Tout = 1000ms11.重载计数值喂狗(向IWDG_KR写入0xAAAA)12.库函数:13.void IWDG_ReloadCounter(void);14.启动看门狗(向IWDG_KR 写入0xCCCC)15.库函数:16.void IWDG_Enable(void);自此,整个程序就完成了;比较简单;窗口看门狗WWDG“窗口”的原因:因为喂狗的时间有一个时间上的限制,必须在一定时间范围内(窗口);这个时间范围(窗口)上限是相关寄存器配置;下限时间是0x40;在这段时间内要完成喂狗,否则将会发生MCU复位;一 WWDG发出复位信号的条件1.计数器的数值从0x40减到0x3F时候;2.喂狗的时候,计数器的值大于WWDG_CFG寄存器设置的数值;注意:上面第二点需要特别注意,在后面进行编程的时候,我们会发现有两个喂狗函数:1.看门狗设置计数器(喂狗)函数WWDG_SetCounter(0xXX),这是一个经常放在WWDG中断函数中的一个专门又来喂狗的函数,0XX被送往CR寄存器;2.看门狗启动函数**WWDG_Enable(0xXX)**的这个括号里有一个0xXX值,也同样被送到CR函数执行了一次喂狗操作;所以一定要注意一个原则:这两个函数的实参都不能是大于窗口值,否则就直接发生复位了;**二 WWDG的特点 **当MCU受到外界干扰或者内部干扰时候,导致程序出现跑飞或者死循环现象的时候,有一种情况是:程序在死循环的时候同时执行了喂狗程序,这就尴尬了,看门狗就无法起到了作用;如果使用窗口看门狗,程序员可以根据程序执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗或滞后刷新看门狗,这样可以检测出程序有没有正常的执行程序;三相关寄存器功能先总结一下:控制寄存器——WWDG_CR——使能WWDG,WWDG倒计数计时器;配置寄存器——WWDG_CFG——设置唤醒中断标志位,设置分频因子,设置上窗口的值;状态寄存器——WWDG_SR——唤醒中断位中断标志;1.控制寄存器WWDG_CR2.3.功能和使用:4.[7]:WWDG功能的开关位;5.[6:0] : 1. 这7位的值为要递减的值;6.2. 喂狗就是要对这7位赋值(赋值的时候绝对不能大于窗口值);7.3. 这几个位所能承受的最大值0x7F,最小值是0x40;2.配置寄存器WWDG_CFG[9] : EWI提前唤醒中断,说白了此位置1会开启WWDG中断,调用相应中断相应函数;[8:7]:设置分频因子;经过此处分频后,即可得到CR寄存器中的递减周期;[6:0]:窗口值,是可以喂狗和不可以喂狗的临界点,当此处的值大于计数器的值时方可喂狗,否则不可喂狗;3.状态寄存器WWDG_SR当EWIF位被置1,说明程序正在执行中断函数或并没有开启WWDG中断四窗口看门狗WWDG关于周期的计算:《STM32f103使用手册》中给出了下面这个超时公式,但是我觉得实在是有些无厘头的计算,为什么要给一个T[5:0]的计算,并且我也没搞懂所谓的超时公式这个“超时”到底超的是谁;所以我觉得要正确的配置窗口值和喂狗的值只要对计数器T[6:0]的递减周期足够理解就好了;所以我总结如下:一,计数器T[6:0]的递减周期:T1 = (4096*2^WDGTB)/PCLK1;PCLK1:APB1上的时钟频率,在库函数提供的默认配置下,PCLK1默认为36MHz;WDGTB:分频系数(1,2,4,8);二,在配置窗口值,喂狗值时要遵循的规则:0x7F >= 窗口值 >= 喂狗值 >=0x41; 超时时间范围:(图片下方用我总结的计数器递减周期公式计算一下怎么得到的下边的这个表格)![这里写图片描述](https:///20170526101137239?watermark/2/text/aHR0cDo vL2Jsb2cuY3Nkbi5uZXQvd3V5dXp1bg==/font/5a6L5L2T/fontsi ze/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 例如:当配置将使WDGTB=2^3时,PCLK1=36MHz时,可得递减周期约为910us,然而我们又知道T[6:0]的最大值为0x7f,最小值为0x40,则(0x7f - 0x3f)=0x40=64(十进制),即64*910=58240us=58.240≈58.25ms;当窗口值和喂狗值同时设置为0x41时,中断周期就是910us,为0x7f时,中断周期就是58.25ms;所以当WDGTB=8时,中断周期就可以认为的在910us~58.25ms中间设定;事实就是这样;编程思路五编程步骤一定要切记这个步骤,不然因为对EWIF位的不理解导致错误(1)开启WWDG时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);(2)设置窗口值和分频系数值(配置WWDG_CFG)void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);//设置分频因子void WWDG_SetWindowValue(uint8_t WindowValue);//设置窗口值(3)使能WWDG,并加载初值void WWDG_Enable(uint8_t Counter);这里需要特别注意:如果说Counter的值为0x7F(MAX),会使得WWDG_SR寄存器中的EWIF位(提醒中断标志位)。
STM WWDG使用注意
565【楼主位】jeowi ll积分:18派别:等级:------来自:环境如下:IDE MDK板子STM3210E-------------------------------------------------------测试程序:void WWDG_Test(void){// Enable WDG clocksRCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG , ENABLE);// PCKL1: 36MHZWWDG_SetPrescaler(WWDG_Prescaler_8);// Set Window value to 65WWDG_SetWindowValue(65);WWDG_Enable(127);// Clear EWI flagWWDG_ClearFlag();//Enable EW interruptWWDG_EnableIT();while(1){}}void WWDG_IRQHandler(void){//WWDG_SetCounter(0x7F);//WWDG_ClearFlag();//香水城的文章/STM32/135104/message.aspx 中说:在中断里面喂狗是没有意义的;//从灯灭,灯亮(示波器也可以看到)来看,如果这两句存在的话;灯可以持续闪烁,但是程序不会重启;//看起来狗被喂了;//但是终究不能把狗放到这里来喂,比如应该在上面的那个while(1)里面来喂,但是当我注释掉这里的“喂狗”,//将WWDG_SetCounter(0x7F); WWDG_ClearFlag(); 移动到上面的while(1)后,系统就不断的重启;//现在的问题是:WWDG的这个狗到底该怎么喂?if(1){static unsigned char bval=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派别:等级:------来自:窗口看门狗的特点是:不能在狗饱时喂狗,也不能在狗饿时喂狗狗饿时喂狗,狗要咬人;狗饱的时候喂,狗也要咬人;只能在一个时间段内、当狗半饱的时候喂,狗才能乖乖地干活。
27. 窗口看门狗实验
窗口看门狗实验
普中STM32开发板带您进入ARM世界
本讲主要内容
1.WWDG介绍 2.WWDG配置步骤 3.硬件电路 4.编写窗口看门狗控制程序
பைடு நூலகம்
普中STM32开发板带您进入ARM世界
1.WWDG介绍
1.1 WWDG简介 上一章我们已经介绍了IWDG,知道它的工作原理就是一个12位递减计
数器不断递减计数,当减到0之前还未进行喂狗的话,产生一个MCU复位 。窗口看门狗WWDG其实和独立看门狗类似,它是一个7位递减计数器不断 的往下递减计数,当减到一个固定值 0X40 时还不喂狗的话,产生一个 MCU复位,这个值叫窗口的下限,是固定的值,不能改变。这个和独立看 门狗是类似的,不同的是窗口看门狗的计数器的值在减到某一个数之前 喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置 。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以刷新(喂狗 ),这也是窗口看门狗中“窗口”两个字的含义。
普中STM32开发板带您进入ARM世界
窗口看门狗时序图:
T[6:0]是窗口控制寄存器(WWDG_CR)的低7位,W[6:0]是窗口配置寄 存器(WWDG_CFR)低7位。T[6:0]就是窗口看门狗的计数器值,而W[6:0] 是窗口看门狗的上窗口,下窗口是固定值0X40。当窗口看门狗的计数器 在上窗口值之外或者低于下窗口值被刷新都会产生复位。
(3)开启WWDG中断并分组
NVIC_Init(); WWDG_EnableIT();
普中STM32开发板带您进入ARM世界
(4)设置计数器初始值并使能WWDG
void WWDG_Enable(uint8_t Counter); void WWDG_SetCounter(uint8_t Counter);
stm32看门狗时间计算 独立看门狗和窗口看门狗的特性是什么
stm32看门狗时间计算独立看门狗和窗口看门狗的特性是什么STM32看门狗时间计算(TWDG):1.STM32看门狗的例子IWDG的时限定为280微秒。
这个时限可能会随着LSI(内部低速时钟)的频率漂移而产生微小的变化。
/* IWDG TImeout equal to 280 ms (the TImeout may varies due to LSI frequency dispersion) -------------------------------------------------------------*//* Enable write access to IWDG_PR and IWDG_RLR registers */IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);/* IWDG counter clock: 40KHz(LSI) / 32 = 1.25 KHz */IWDG_SetPrescaler(IWDG_Prescaler_32);/* Set counter reload value to 349 */IWDG_SetReload(349);/*该参数允许取值范围为0 0x0FFF */* Reload IWDG counter */IWDG_ReloadCounter();/* Enable IWDG (the LSI oscillator will be enabled by hardware) */IWDG_Enable();2.独立看门狗(IWDG)由专用的40kHz 的低速时钟为驱动; 因此,即使主时钟发生故障它也仍然有效。
窗口看门狗由从APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的行为。
可通过IWDG_SetPrescaler(IWDG_Prescaler_32); 对其时钟进行分频,4-256,通过以下方式喂狗:/* Reload IWDG counter */IWDG_ReloadCounter();3. 1.25KHz 即每周期为0.8ms。
STM32库开发实战指南:基于STM32F103(第2版)
42.2 OV7725摄像 头
B
42.3 摄像头驱动实 验
C
42 OV7725摄像头驱动
第二部分 提高篇
43 移植Huawei LiteOS到STM32
1
43.1 Huawei LiteOS简介
2
43.2 Huawei LiteOS内核移 植
感谢聆听
2.2 硬件连 接
04
2.4 选择目 标板
03
2.3 仿真器 配置
2 如何用DAP仿真器下载程序
第一部分 基础篇
3 如何用串口下载程序
3.1 安装 USB转串
口驱动
3.2 硬件 连接
3.4 ISP 一键下载 原理分析
3.3 开始 下载
第一部分 基础篇
4.1 什么是 STM32
4.2 STM32 能做什么
第一部分 基础篇
0
0
1
2
17.1
17.2 EXTI
功能框图
EXTI简介
剖析
0
0
0
3
4
5
17.3 中断 /事件线
17.4 EXTI 初始化结 构体详解
17.5 外部 中断控制
实验
17 EXTI——外部中断/事件控 制器
第一部分 基础篇
18.2 SysTick 寄存器介绍
1
2
3
18.1 SysTick 简介
验
第一部分 基础篇
20 USART——串口通信
20.2 STM32的USART简介
20.4 USART初始化结构体 详解
20.6 使用USART1指令控制 RGB彩灯的实验
21.1 DMA简介
21.3 DMA数据配置
STM32嵌入式常见英文缩写和词汇
STM32常见英文缩写和英文词汇(按字母排序)AAPCS:ARM Architecture Process Call Standard ARM体系结构过程调用标准AFIO:Alternate Function IO 复用IO端口AHB-AP:Advanced High-Performance Bus-Access Port 高级高性能总线-访问端口ALU:Arithmetic Logical Unit 算术逻辑单元APB: Advanced Peripheral Bus 高级外围总线APB1: Low Speed APB 低速外围总线APB2: High Speed APB 高速外围总线ARM:Advanced RISC Machine 高级RISC处理器ASIC: Application Specific Integrated Circuit 专用集成电路BSS:Block Started by Symbol 以符号开始的块(未初始化数据段)CAN:Controller Area Network 控制器局域网CLZ:Count Leading Zero 前导零计数(指令)COM: Cluster Communication Port 串口(串行通讯端口)CPLD: Complex Programmable Logic Device 可编程逻辑器件CPSP:Current Program Status Register 当前程序状态寄存器CSR:Clock Control/Status Register 时钟控制状态寄存器DAP: Debug Access Port 调试访问端口DBG:Debug 调试DMA:Direct Memory Access 存储器直接访问DP:Debug Port 调试端口DWT: Data Watchpoint And Trace 数据观测与跟踪单元ETM:Embedded Trace Macrocell 嵌入式追踪宏单元EXTI: External Interrupts 外部中断FA:Full Ascending 满栈递增FD:Full Desending 满栈递减EA:Empty Ascending 空栈递增ED:Empty Desending 空栈递减FIQ:Fast Interrupt Request 快速中断请求FLITF:The Flash Memory Interface 闪存存储器接口FPB:Flash Patch And Breakpoint 闪存补丁及断点FPGA: Field Programmable Gate Array 现场可编程门阵列FSMC: Flexible Static Memory Controller 可变静态存储控制器GAL: Generic Array Logic 通用阵列逻辑GPIO:General Purpose Input/Output 通用IO端口HSE:High Speed External 高速外部HSI: High Speed Internal 高速内部I2C:Inter-Integrated Circuit 内置集成电路ICE:In-Circuit Emulator 在线仿真器IDE:Integrated Development Environment 集成开发环境IIS:Integrated Interface Of Sound 集成音频接口IRQ:Interrupt Request 中断请求ISR:Interrupt Service Routines 中断服务程序ITM: Instrumentation Trace Macrocell 测量跟踪宏单元IWDG: Independent Watchdog 独立看门狗JTAG:Joint Test Action Group 联合测试行动小组JTAG-DP:JTAG Debug Port JTAG 调试端口LR:Link Register 链接寄存器LSE: Low Speed External 低速外部LSI: Low Speed Internal 低速内部LSU: Load Store Unit 存取单元MIPS: Million Instructions Per Second 每秒能执行的百万级指令的条数MPU: Memory Protection Unit 内存保护单元MSP: Main Stack Pointer 主堆栈指针NMI: Non Maskable Interrupt 不可屏蔽中断NVIC: Nested Vectored Interrupt Controller 嵌套向量中断控制器PAL: Programmable Array Logic 可编程阵列逻辑PC:Program Counter 程序计数器PFU: Pre-Fetch Unit 预取单元PPB:Private Peripheral Bus 专用外设总线PSP:Process Stack Pointer 进程堆栈指针RCC:Reset And Clock Control 复位和时钟控制RISC:Reduced Instruction Set Computer 精简指令集计算机RO: Read Only 只读RTC: Real-Time Clock 实时时钟RTOS:Real Time Operating System 实时操作系统RW: Read Write 读写SDIO: Secure Digital I/O 安全数字输入输出SIMD:Single Instruction Multiple Data单指令多数据流SP:Stack Pointer 堆栈指针SPI:Serial Peripheral Interface 串行外设接口SPSR:Saved Program Status Register 程序状态保存寄存器SW:Software 软件SW-DP: Serial Wire Debug Port 串行线调试端口SWI:Software Interrupt 软中断SWJ-DP: Serial Wire JTAG Debug Port 串行线-JTAG调试端口TAP:Test Access Port 测试访问端口TIM:Timer 定时器TP: Trace Port 跟踪端口TPIU:Trace Port Interface Unit 跟踪端口接口单元USART: Universal Synchr./Asynch. Receiver/Transmitter 通用同步/异步收发器USB: Universal Serial Bus 通用串行总线VFP:Vector Floating Point 矢量浮点运算WWDG:Window Watchdog 窗口看门狗ZI: Zero Initial 零初始化STM32常见英文词汇(按字母排序)Access 访问Arbitration 仲裁Assembler 汇编器Banked 分组Big Endian 大端存储模式Binutils 连接器Bit-Band Alias 位段别名Bit-Band Region 位段区域Bit-Banding 位段(技术)Buffer 缓存Bus Matrix 总线矩阵Bus Splitter 总线分割Ceramic 陶瓷Comments 注释Context Switch 任务切换Decode 译码Directive 伪操作Disassembly 反汇编Execute 执行Fetch 取指Handler 处理者Heap 堆Instructions 指令Late-Arriving 迟到Latency 延时Literal Pool 数据缓冲池Little Endian 小端存储模式Load 加载Loader 装载器Optimization 优化Perform 执行Pre-Emption 抢占Prefetch 预读/预取指Prescaler 预分频器Process 进程/过程Pseudo-Instruction 伪指令Resonator 共振器Stack 栈Store 存储Tail-Chaining 尾链Task Switch 任务切换Thread 线程。
STM32F10x_WWDG
22.1 WWDG寄存器结构 (362)22.2 WWDG22窗口看门狗用来检测是否发生过软件错误。
通常软件错误是由外部干涉或者不可预见的逻辑冲突引起的,这些错误将打断正常的程序流程。
Section 22.1 WWDG寄存器结构描述了固件函数库所使用的数据结构,Section 22.2 固件库函数介绍了函数库里的所有函数。
窗口看门狗时序图计算超时的公式如下:T WWDG = T PCLK1 x 4096 x 2^WDGTB x (T[5:0] + 1); (ms)其中: T WWDG:WWDG超时时间;T PCLK1:APB1以ms为单位的时钟间隔;WDG TB:时基。
在22.1 WWDG寄存器结构WWDG寄存器结构,WWDG_TypeDeff,在文件“sm32f10x_map.h”中定义如下:typedef struct{vu32 CR;vu32 CFR;vu32 SR;}WWDG_TypeDef;:#define PERIPH_BASE ((u32)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00)#ifndef DEBUG...#ifdef _WWDG#define WWDG ((WWDG_TypeDef *) WWDG_BASE)#endif /*_WWDG */...#else /* DEBUG */...#ifdef _WWDGEXT WWDG_TypeDef *WWDG;#endif /*_WWDG */...#endif使用Debug模式时,初始化指针WWDG于文件“stm32f0x_lib.c”:#ifdef _WWDGWWDG = (WWDG_TypeDef *) WWDG_BASE;#endif /*_WWDG */为了访问WWDG寄存器, _WWDG必须在文件“sm32f10x_conf. h”中定义如下:#define _WWDG22.2 WWDG库函数WWDG库函数【见首页】22.1.1 函数WWDG_DeInit/* Deinitialize the WWDG registers */WWDG_DeInit();函数原型如下:void WWDG_DeInit(void){RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE);/* #include “stm32f10x_rcc.h”void RCC_APB1PeriphResetCmd(u32 RCC_APB1Periph, FunctionalState NewState) {/* Check the parameters */assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE) {RCC->APB1RSTR |= RCC_APB1Periph; }else {RCC->APB1RSTR &= ~RCC_APB1Periph; }//}*/RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE);}22.1.2 函数WWDG_SetPrescaler/* Set WWDG prescaler to 8 */WWDG_SetPrescaler(WWDG_Prescaler_8);函数原型如下:void WWDG_SetPrescaler(u32 WWDG_Prescaler){u32 tmpreg = 0;/* Check the parameters */assert_param(IS_WWDG_PRESCALER(WWDG_Prescaler));/* Clear WDGTB[1:0] bits */tmpreg = WWDG->CFR & CFR_WDGTB_Mask; //#define CFR_WDGTB_Mask ((u32)0xFFFFFE7F)/* Set WDGTB[1:0] bits according to WWDG_Prescaler value */tmpreg |= WWDG_Prescaler;/* Store the new value */WWDG->CFR = tmpreg;}22.1.3 函数WWDG_SetWindowValue例:/* Set WWDG window value to 0x50 */WWDG_SetWindowValue(0x50);函数原型如下:void WWDG_SetWindowValue(u8 WindowValue){u32 tmpreg = 0;/* Check the parameters */assert_param(IS_WWDG_WINDOW_VALUE(WindowValue));//#define IS_WWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0x7F)/* Clear W[6:0] bits */tmpreg = WWDG->CFR & CFR_W_Mask;//#define CFR_W_Mask 0x0000 003F/* Set W[6:0] bits according to WindowValue value */tmpreg |= WindowValue & BIT_Mask;//#define BIT_Mask ((u8)0x7F)/* Store the new value */WWDG->CFR = tmpreg;}22.1.4 函数WWDG_EnableIT例:/* Enable WWDG Early Wakeup Interrupt */WWDG_EnableIT();函数原型如下:void WWDG_EnableIT(void){*(vu32 *) CFR_EWI_BB = (u32)ENABLE;//#define PERIPH_BASE ((u32)0x40000000)//#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00)//#define APB1PERIPH_BASE PERIPH_BASE//#define WWDG_OFFSET (WWDG_BASE - PERIPH_BASE) //=0x2C00//#define CFR_OFFSET (WWDG_OFFSET + 0x04) //=0x2C04//#define EWI_BitNumber 0x09//#define CFR_EWI_BB (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4))//=0x4005 80A4}22.1.5 函数WWDG_SetCounter例:/* Set WWDG counter value to 0x70 */WWDG_SetCounter(0x70);函数原型如下:void WWDG_SetCounter(u8 Counter){/* Check the parameters */assert_param(IS_WWDG_COUNTER(Counter));/* Write to T[6:0] bits to configure the counter value, no need to do a read-modify-write; writing a 0 to WDGA bit does nothing */WWDG->CR = Counter & BIT_Mask; //BIT_Mask = 0x7F}22.1.6 函数WWDG_Enable例:/* Enable WWDG and set counter value to 0x7F */WWDG_Enable(0x7F);函数原型如下:void WWDG_Enable(u8 Counter){/* Check the parameters */assert_param(IS_WWDG_COUNTER(Counter));WWDG->CR = CR_WDGA_Set | Counter; //#define CR_WDGA_Set ((u32)0x00000080)}22.1.7 函数WWDG_GetFlagStatus/* Test if the counter has reached the value 0x40 */FlagStatus Status;Status = WWDG_GetFlagStatus();if(Status == RESET) { ... }else { ... }函数原型如下:FlagStatus WWDG_GetFlagStatus(void){return (FlagStatus)(*(vu32 *) SR_EWIF_BB);// BB = Bit-Banding//#define WWDG_OFFSET (WWDG_BASE - PERIPH_BASE) //=0x2C00//#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00)//#define APB1PERIPH_BASE PERIPH_BASE///* Alias word address of EWIF bit *///#define SR_OFFSET (WWDG_OFFSET + 0x08)//=0x2C08//#define EWIF_BitNumber 0x00//#define SR_EWIF_BB (PERIPH_BB_BASE + (SR_OFFSET * 32) + (EWIF_BitNumber * 4))//= 0x4205 8100 //#define PERIPH_BB_BASE ((u32)0x4200 0000)}22.1.8 函数WWDG_ClearFlag例:/* Clear EWI flag */WWDG_ClearFlag();函数原型如下:void WWDG_ClearFlag(void){WWDG->SR = (u32)RESET; //SR只有一个控制位:EWIF }。
STM32常用英文
ARM:Advanced RISC MachineAAPCS:ARM Architecture Process call standardARM 体系结构过程调用标准RISC:Reduced Instruction Set Computer 精简指令集计算机RTOS:Real Time Operating System 实时操作系统DMA:Direct Memory Access 存储器直接访问EXTI: External Interrupts 外部中断FSMC: Flexible static memory controller 可变静态存储控制器FPB:flash patch and breakpoint FLASH 转换及断电单元HSE:Hign speed externalHSI: High speed internalLSE: Low Speed externalLSI: Low Speed InternalLSU: load store unit 存取单元PFU: prefetch unit 预取单元ISR:Interrupt Service Routines 中断服务程序NMI: Nonmaskable Interrupt 不可屏蔽中断NVIC: Nested Vectored Interrupt Controller 嵌套向量中断控制器MPU: Memory Protection Unit 内存保护单元MIPS:million instructions per second 每秒能执行的百万条指令的条数RCC:Reset and clock control 复位和时钟控制RTC: Real-Time Clock 实时时钟IWDG: independent watchdog 独立看门狗WWDG:Window watchdog 窗口看门狗TIM:timer 定时器GAL:generic array logic 通用阵列逻辑PAL:programmable array logic 可编程阵列逻辑ASIC:Application Specific Integrated Circuit 专用集成电路FPGA:Field-Programmable Gate Array 现场可编程门阵列CPLD:Complex Programmable Logic Device 可编程逻辑器件端口AFIO:alternate function IO 复用IO 端口GPIO:general purpose input/output 通用IO 端口IOP(A-G):IO port A - IO port G (例如:IOPA:IO port A)CAN:Controller area network 控制器局域网FLITF:The Flash memory interface 闪存存储器接口I2C:Inter-integrated circuit 微集成电路IIS:integrate interface of sound 集成音频接口JTAG:joint test action group 联合测试行动小组SPI:Serial Peripheral Interface 串行外围设备接口SDIO: SD I/OUART: Universal Synchr./Asynch. Receiver Transmitter 通用异步接收/发送装置USB: Universal Serial Bus 通用串行总线寄存器相关CPSP:Current Program Status Register 当前程序状态寄存器SPSP:saved program status register 程序状态备份寄存器CSR:clock control/status register 时钟控制状态寄存器LR:link register 链接寄存器SP:stack pointer 堆栈指针MSP: main stack pointer 主堆栈指针PSP:process stack pointer在STM32的固件库中定义了三个结构体与这三个寄存器组相对应,这三个结构体与ARM 手册中寄存器的对应关系如下:一、NVIC寄存器组STM32的固件库中有如下定义:typedef struct{vu32 ISER[2];u32 RESERVED0[30];vu32 ICER[2];u32 RSERVED1[30];vu32 ISPR[2];u32 RESERVED2[30];vu32 ICPR[2];u32 RESERVED3[30];vu32 IABR[2];u32 RESERVED4[62];vu32 IPR[11];} NVIC_TypeDef;它们对应ARM手册中的名称为ISER = Interrupt Set-Enable RegistersICER = Interrupt Clear-Enable RegistersISPR = Interrupt Set-Pending RegisterICPR = Interrupt Clear-Pending RegisterIABR = Active Bit RegisterIPR = Interrupt Priority Registers每个寄存器有240位,以Interrupt Set-Enable Registers说明,ISER[0]对应中断源0~31,ISER[1]对应中断源32~63,STM32只有60个中断源,所以没有ISER[2:7]。
STM32L4独立看门狗(IWDG)介绍
Refresh Window
time
WWDG_CR
6-Bit Down Counter
WWDG features (2/2)
• Early Wakeup Interrupt (EWI bit in WWDG_CFR):
12-bit window comp
VDD voltage domain
• Window option
• New register : IWDG_WINR
• Selectable HW/SW start + selectable Low-power freeze in Standby or Stop
• To prevent IWDG reset:
• Write to IWDG_KR register with 0xAAAA key value at regular intervals before the counter reaches 0 and within the window (if window option enabled) • Safe Reload Sequence (key) + window
WWDG Reset WWDG_CFR
T[6:0] CNT down counter
comparator = 1 when T6:0 > W6:0
-
W6 W5 W4 W3 W2 W1 W0
W[6:0] 3Fh
Write WWDG_CR
CM P
WDGA T6 T5 T4 T3 T2 T1 T0
Refresh not allowed T6 bit Reset
STM32L15x —— 独立看门狗IWDG和窗口看门狗WWDG
Same as STM32F-1系统外设独立看门狗(IWDG)IWDG ——概述可通过option byte来选择是否使能硬件IWDG功能更先进的安全功能:IWDG使用独立的低速时钟LSI作为时钟源,并在主时钟无效时仍然保持运行 一旦使能了IWDG,该功能就不能被禁止(LSI也不能被停止)安全的刷新修改序列由于IWDG模块属于VDD供电域,因此即使在停止和待机模式下,仍然保持功能(IWDG的复位信号能将芯片从待机模式下唤醒)防止IWDG复位信号产生:在计数器自减到0之前,向IWDG_KR寄存器写入AAAAhRCC_CSR寄存器的IWDGRSTF位指示是否产生了IWDG复位事件使用32KHz的LSI,IWDG复位的最短和最长时间间隔为125us和32.7s8-bitPRESCALERLSI(38KHz)12-bitreload value12-bitdown counterPrescalerRegisterStatusRegisterReloadRegisterKeyRegisterIWDGReset VDD voltage domainVCORE voltage domainIWDG最适合那些不需要很高精度,但需要独立于主进程之外的独立看门狗的应用Same as STM32F-1系统外设窗口看门狗(WWDG)WWDG ——概述可配置的时间窗口,应用程序需要在一个有限的时间窗口内刷新自减计数器有条件的复位: 当窗口看门狗使能,并且自减计数器小于40h(T6=0)时,产生复位当窗口看门狗使能,并且在自减计数器达到窗口寄存器数值之前更新了自减计数器,产生复位防止窗口看门狗复位信号产生:定期的,在自减计数器数值小于窗口范围(W[6:0])时,写T[6:0](其中T6位写1)早期唤醒中断(EWI):当自减计数器达到40h 时产生中断Î此中断可用于重载自减计数器 RCC_CSR 的WWDGRSTF 位指示是否发生了WWDG 复位事件使用32MHz 的PCLK1时钟时,WWDG 的最短和最长复位时间间隔分别是128us 和65.54msWWDG最适合那些需要精准时间控制的看门狗的应用Refreshnot allowed Refresh WindowT[6:0] CNT down countertimeW[6:0]3FhT6 bitResetCM PW0W1W2W3W4W5W6-T0T1T2T3T4T5T6WDGAWWDG_CR WWDG_CFR PRESCALER (WDGTB)6-Bit Down CounterPCLK1(up to 32MHz)Write WWDG_CRcomparator = 1 whenT6:0 > W6:0WWDG Reset。
STM32单片机的独立看门狗和窗口看门狗的特点及用法解析
STM32单片机的独立看门狗和窗口看门狗的特点及用法解析1.看门狗介绍看门狗这东西虽然简单,但我相信绝大多程序员没有足够重视它。
使用看门狗保证系统正常地运行是非常有必要的。
我们在设计产品时,代码以及硬件设计缺陷或是外界电磁干扰都有可能使系统死机,如果不能正常对其进行复位,系统的可靠性将大打折扣。
看门狗分为软件看门狗和硬件看门狗两类,其原理都是使用一个独立定时器来计时,超出时间就会产生复位信号,主要区别看是否具有独立的硬件结构,如果有,就是硬件看门狗,如果是一个普通定时器实现的那么就是软件看门狗。
STM32F407片内有两个看门狗:独立看门狗IWDG以及窗口看门狗WWDG,下面来讨论各自的特点和用法。
2.IWDG的特点以及使用IWDG是一个独立看门狗,具有独立于系统的时钟,与片外看门狗更为相似,使用片内独立的阻容时钟发生电路计时,记录时间为=(时钟频率(40KHz)/ 分频数)*IWDG_SetReload (t),t《0xFFF.也就是说记录的最大设定的复位时间为(1/40K)*256*0xFFF = 26.2 S。
由于IWDG使用的时钟本身不准确,会因为漂移产生一定变化,喂狗时应该给出一定的裕量。
另外,这个时钟与系统时钟并无关联,所有也不能与系统进行同步产生中断,一旦定时时间到后就会产生复位信号,系统来不及存储当前运行状态就会重启,可以在要求不高的场合使用。
3.WWDG的特点以及使用WWDG具有一个独立的7位定时器,使用系统时钟,可以产生系统中断。
其定时最时间为(1/PCLK1)* 4096)* 分频系数(最大为8)*(0x7F –0x3F)= 58ms.其复位的条件是:(1)当计数器的数值从0x40减到0x3F(2)当刷新看门狗时计数器的数值大于窗口上限值时满足任何一条都可以产生复位信号。
通常情况下设置窗口上限值为0x7F,下限值默认为0x40,计数器向下数到0x40就会产生中断,下个910us后变为0x3F就会复位系统。
STM32IO口函数GPIO使用说明
6.GPIO 锁定机制:当在一个端口位上执行了所定(LOCK)程序,在下一 次复位之前,将不能再更改端口位的配置。
GPIO 基本设置
GPIOMode_TypeDef GPIO mode 定义及偏移地址 GPIO_Mode_AIN = 0x0, //模拟输入 GPIO_Mode_IN_FLOATING = 0x04, //悬空输入 GPIO_Mode_IPD = 0x28, //下拉输入 GPIO_Mode_IPU = 0x48, //上拉输入 GPIO_Mode_Out_OD = 0x14, //开漏输出 GPIO_Mode_Out_PP = 0x10, //推挽输出 GPIO_Mode_AF_OD = 0x1C, //开漏复用 GPIO_Mode_AF_PP = 0x18 //推挽复用 GPIO 输入输出速度选择: typedef enum { GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz } GPIOSpeed_TypeDef; #define IS_GPIO_SPEED(SPEED) ((SPEED == GPIO_Speed_10MHz) ||
1 STM32 的输入输出管脚有下面 8 种可能的配置:(4 输入+2 输出+2 复用输出)
① 浮空输入_IN_FLOATING
② 带上拉输入_IPU
③ 带下拉输入__OD
⑥ 推挽输出_OUT_PP
⑦ 复用功能的推挽输出_AF_PP
⑧ 复用功能的开漏输出_AF_OD
3.3 GPIO 初始化完成
==================================================== =================== 最近刚开始学习 STM32,所以从最基本的 GPIO 开始学起;首先看看 STM32 的 datasheet 上对 GPIO 口的简单介绍:每个 GPI/O 端口有两 个 32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个 32 位数据寄 存器(GPIOx_IDR,GPIOx_ODR),一个 32 位置位/复位寄存器 (GPIOx_BSRR),一个 16 位复位寄存器(GPIOx_BRR)和一个 32 位 锁定寄存器(GPIOx_LCKR)。
STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)
STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)stm32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG。
看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。
看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。
看门狗主要作用是可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
具体的实现步骤:开启看门狗,设置减计数的初始值,当计数值达到超时值时,产生MCU 复位,此时本来运行的程序终止重新启动单片机(发生了故障)。
在使用了看门狗之后,在正常运行的程序中加入喂狗的程序,即采用定时器的方式每隔一段时间进行一次喂狗重置计数装载值,这样,只要程序正常运行,没有出现故障或软件错误,就会不断的定时喂狗,从而不会使计数值达到超时值产生复位。
一、独立看门狗IWDG:1、IWDG主要性能1)自由运行的递减计数器2)时钟由独立的RC振荡器提供(可在停止和待机模式下工作)3)看门狗被激活后,则在计数器计数至0x000时产生复位2、IWDG功能描述在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。
当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。
无论何时,只要键寄存器IWDG_KR中被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。
void IWDG_ConfiguraTIon(void)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32 独立看门狗IWDG 与窗口看门狗WWDG2010年05月03日星期一21:54 独立看门狗Iwdg——有独立时钟(内部低速时钟LSI---40KHz),所以不受系统硬件影响的系统故障探测器。
主要用于监视硬件错误。
窗口看门狗wwdg——时钟与系统相同。
如果系统时钟不走了,这个狗也就失去作用了,主要用于监视软件错误。
一,独立看门狗看门狗定时时限= IWDG_SetReload()的值/ 看门狗时钟频率看门狗时钟频率=LSI(内部低速时钟)的频率(40KHz)/ 分频数1.STM32独立看门狗IWDG的时限定为280微秒。
这个时限可能会随着LSI(内部低速时钟)的频率漂移而产生微小的变化。
/* IWDG timeout equal to 280 ms (the timeout may varies due to LSI frequency dispersion) -------------------------------------------------------------*//* Enable write access to IWDG_PR and IWDG_RLR registers */IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);/* IWDG counter clock: 40KHz(LSI) / 32 = 1.25 KHz */IWDG_SetPrescaler(IWDG_Prescaler_32);/* Set counter reload value to 349 */IWDG_SetReload(349);/*该参数允许取值范围为0 –0x0FFF */* Reload IWDG counter */IWDG_ReloadCounter();/* Enable IWDG (the LSI oscillator will be enabled by hardware) */IWDG_Enable();2.独立看门狗(IWDG)由专用的40kHz 的低速时钟为驱动;因此,即使主时钟发生故障它也仍然有效。
窗口看门狗由从APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的行为。
可通过IWDG_SetPrescaler(IWDG_Prescaler_32); 对其时钟进行分频,4-256,通过以下方式喂狗:/* Reload IWDG counter */IWDG_ReloadCounter();3. 1.25KHz 即每周期为0.8ms共计时350 个周期,即350*0.8ms=280ms看门狗定时时限= IWDG_SetReload()的值/ 看门狗时钟频率看门狗时钟频率=LSI(内部低速时钟)的频率(40KHz)/ 分频数二,窗口看门狗STM32F的窗口看门狗中有一个7位的递减计数器,它会在出现下述2种情况之一时产生看门狗复位:1)当计数器的数值从0x40减到0x3F时2)当刷新看门狗时计数器的数值大于某一设定数值时,此设定数值在WWDG_CFR寄存器定义对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了;如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。
标签:无标签STM32窗口看门狗使用?(WWDG)上午搞定RTC之后,开始弄IWDG和WWDG,IWDG比较容易,配置也很简单,参考ST的代码就能很快搞定.但是WWDG就不行了,搞了很久都不行,按ST的库做,在keil上仿真也不行,主要原因就是WWDG->CR寄存器中的计数值不会减少!其他配置也都正确了,WWDG->CR就是不减少,我不知道是不是PCLK1的时钟没有,但是从keil的仿真可以看到PCLK1的时钟是36M,没道理没有,很是郁闷,不知道哪位朋友用过STM32的WWDG没有?请指教!多谢先.我用的是STM32F103RBT6.主函数:#include "stm32f10x_lib.h"#include "sys.h"#include "led.h"#include "delay.h"#include "wwdg.h"int main(void)//GPIO{//u32 temp;Stm32_Clock_Init();//系统时钟设置led_init();//DBGMCU->CR=0X00000000;delay_init(72);//72M系统时钟//delay_ms(300);wwdg_init(); //配置并使能IWDG//temp=DBGMCU->CR;while (1){LED0_SET(0);//WWDG->CR&=~(1<<6);delay_us(500000);//在这里系统重启}}wwdg.h代码:#ifndef __WWDG_H#define __WWDG_H//看门狗定时器中断配置void NVIC_WWDGConfiguration(void){NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else /* VECT_TAB_FLASH */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endifNVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_Init(&NVIC_InitStructure);}void wwdg_init(void){NVIC_WWDGConfiguration();RCC->APB1ENR|=1<<11; //窗口看门狗时钟使能.WWDG->CFR|=1<<8; //CLKww=PCLK1/4096/8=244Hz WWDG->CFR|=1<<7;WWDG->CFR&=0X380;WWDG->CFR|=65; //窗口值设置为65WWDG->CR=0X7F; //计数值设定为0X7FWWDG->CR|=1<<7; //开启看门狗WWDG->SR&=0XFFFFFFFE;//清除EWIF位WWDG->CFR|=1<<9; //提前唤醒中断}//串口看门狗中断void WWDG_IRQHandler(void){WWDG_SetCounter(0x7F);WWDG_ClearFlag();}#endifsys.h中的代码:#ifndef __SYS_H#define __SYS_H#include "stm32f10x_lib.h"//系统时钟初始化//使用外部8M晶振,PLL到72M频率//正点原子@SCUT//2008/12/04#define uint unsigned int#define uchar unsigned char/*#define CLOCK 72/8 //时钟=72M//us延时函数void delay_us(unsigned int us){u8 n;while(us--)for(n=0;n<CLOCK;n++);}//ms延时函数void delay_ms(unsigned int ms){while(ms--)delay_us(1000);} *///把所有时钟寄存器复位void RCC_RESETInit(void){RCC->APB2RSTR = 0XFFFFFFFF;//外设复位RCC->APB1RSTR = 0XFFFFFFFF;RCC->APB2RSTR = 0X00000000;//复位恢复RCC->APB1RSTR = 0X00000000;RCC->AHBENR = 0x00000014; //flash时钟,闪存时钟使能.DMA时钟关闭RCC->APB2ENR = 0x00000000; //外设时钟关闭.RCC->APB1ENR = 0x00000000;RCC->CR |= 0x00000001; //使能内部高速时钟HSIONRCC->CFGR &= 0xF8FF0000; //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]RCC->CR &= 0xFEF6FFFF; //复位HSEON,CSSON,PLLONRCC->CR &= 0xFFFBFFFF; //复位HSEBYPRCC->CFGR &= 0xFF80FFFF; //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRERCC->CIR = 0x00000000; //关闭所有中断}//外部8M,则得到72M的系统时钟void Stm32_Clock_Init(void){unsigned char temp="0";u8 timeout="0";RCC_RESETInit();RCC->CR|=0x00010000; //外部高速时钟使能HSEONtimeout=0;while(!(RCC->CR>>17)&&timeout<200)timeout++;//等待外部时钟就绪//0-24M 等待0;24-48M 等待1;48-72M等待2;(非常重要!)FLASH->ACR|=0x32;//FLASH 2个延时周期RCC->CFGR|=0X001D2400;//APB1/2=DIV2;AHB=DIV1;PLL=9*CLK;HSE作为PLL时钟源RCC->CR|=0x01000000; //PLLONtimeout=0;while(!(RCC->CR>>25)&&timeout<200)timeout++;//等待PLL锁定RCC->CFGR|=0x00000002;//PLL作为系统时钟while(temp!=0x02&&timeout<200) //等待PLL作为系统时钟设置成功{temp=RCC->CFGR>>2;timeout++;temp&=0x03;}}#endifdelay.h中的代码:#ifndef __DELAY_H#define __DELAY_H//使用SysTick的普通计数模式对延迟进行管理//包括delay_us,delay_ms//正点原子@SCUT//2008/12/13static u8 fac_us=0;//us延时倍乘数static u16 fac_ms=0;//ms延时倍乘数//初始化延迟函数void delay_init(u8 SYSCLK){SysTick->CTRL&=0xfffffffb;//选择内部时钟HCLK/8 fac_us=SYSCLK/8;fac_ms=(u16)fac_us*1000;}//延时Nms//注意Nms的范围//Nms<=0xffffff*8/SYSCLK//对72M条件下,Nms<=1864void delay_ms(u16 nms){SysTick->LOAD=(u32)nms*fac_ms; //时间加载SysTick->CTRL|=0x01; //开始倒数while(!(SysTick->CTRL&(1<<16))); //等待时间到达SysTick->CTRL&=0XFFFFFFFE; //关闭计数器SysTick->VAL=0X00000000; //清空计数器}//延时usvoid delay_us(u32 Nus){SysTick->LOAD=Nus*fac_us; //时间加载SysTick->CTRL|=0x01; //开始倒数while(!(SysTick->CTRL&(1<<16)));//等待时间到达SysTick->CTRL=0X00000000; //关闭计数器SysTick->VAL=0X00000000; //清空计数器}#endifWWDG了解及疑惑void, 时钟本帖最后由冬夜冰城于2011-2-13 21:00 编辑一、主函数:int main(void){#ifdef DEBUGdebug();#endif//配置系统时钟RCC_Configuration();GPIO_Configuration();EXTI_Configuration();NVIC_Configuration();if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET){GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_SET);/*可以清除的复位标志位有:RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST */RCC_ClearFlag();}else{GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_RESET);}WWDG_Configuration();/* Infinite loop */while (1);}二、窗口看门狗初始化函数void WWDG_Configuration(void){/* 开启窗口看门狗时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);// /* Deinitialize the WWDG registers将外设WWDG寄存器重设为缺省值*/// 从其底层函数可以看出,初始化关闭窗口看门狗时钟// WWDG_DeInit();/* Set WWDG prescaler to 8 设置WWDG 预分频值即PCLK1/4096/8=1098.6 */WWDG_SetPrescaler(WWDG_Prescaler_8);/* Set WWDG window value to 0x41指定的窗口值,该参数取值必须在0x40 与0x7F之间。