看门狗定时器(WDT,Watch Dog Timer)是单片机的一个主要组成部分,在单片机程序的调试和运行中都有主要的意义。它的紧张功能是在发生软件故障时,将单片机复位重启。
9.1 看门狗运用背景在单片机的实际开拓和运用处所当中,每每并不是完备空想完美的情形,因此要应对各种突发事宜。

1、实际开拓编写程序的时候,有一些极其分外的情形在逻辑上并未考虑全面,在实际运行时溘然发生了,这个时候程序可能进入去世循环等各种非常情形而无法正常运行功能,此时在不能完善功能的情形下,最好的办法便是重启全体系统。
2、产品在实际运行时,有时会涌现突发性的恶劣运行环境,比如高强度雷电,机器打仗产生的静电等。恶劣的运行环境有可能导致单片机涌现突发性非常情形,办理这种问题最好的办法便是重启全体系统。
看门狗实质是一个定时器,通过设定定时韶光确认程序运行是否正常。例如某一个功能程序,按照正常时序流程,程序从打开看门狗定时器开始,运行到程序的第50行,综合考虑所有的成分,韶光不可能超过10ms,那么就可以打开看门狗定时器,设定定时韶光10ms,在第51行处复位定时韶光(俗称喂狗)。当程序正常运行时,运行到第51行程序喂狗,定时器不会溢出;当程序涌现非常时,运行了10ms都没有运行到第51行,程序不会按时喂狗,此时看门狗定时器产生溢出,自动复位单片机。
STM32F103内置独立看门狗和窗口看门狗两类看门狗,供应了更高的安全性、韶光的精确性和利用的灵巧性。
9.1.1 独立看门狗
独立看门狗(IWDG)顾名思义它是独立运行的,由专用的低速时钟LSI驱动。优点是当系统主时钟发生故障或停滞运行时它仍旧有效,不受程序运行及中断的影响,缺陷是LSI精度受环境影响较大,精度不高,因此IWDG适用于对韶光精度哀求不高的场合。
IWDG是一个12位的递减计数器,首先根据所须要设定的韶光打算出初值,然后将初值写入到重装载寄存器中,启动IWDG后开始倒计时,当计数器计到0时会产生一个复位旗子暗记,引起系统复位。因此按照正常逻辑时序运行程序的话,必须在计数器计到0之前喂狗,IWDG构造如图9-1所示。
图9-1 IWDG构造图
1、LSI时钟
LSI的时钟主频为40KHz,由于LSI时钟本身不准确,受环境影响会发声一定的漂移征象,其频率会在30KHz到60KHz之间变革,因此喂狗时该当给出一定的余量。
2、键寄存器(IWDG_KR)
键寄存器是一个只写的掌握寄存器,向其写入命令字可以实现相应的配置功能。由于IWDG能够导致系统复位,为了防止意外复位,IWDG的预分频寄存器和重装载寄存用具有写保护功能,防止寄存器数据被随意修改。要修正这两个寄存器的值,必须先向键寄存器中写入0x5555,取消写保护功能,除此之外间键寄存器掌握IWDG的重装载使能和启动IWDG功能,键寄存器掌握字命令如表9-1所示。
3、预分频寄存器(IWDG_PR)
定时器的预分频系数可以设置为0~2N(N为预分频寄存器的位数)中的任意一个数,而IWDG的预分频寄存器稍有不同,IWDG_PR寄存器的有效位只有3位,设置参数对应的分频系数如表9-2所示。写入到IWDG_PR寄存器的参数会自动转化为相应的预分频系数通报到IWDG的8位预分频器中。
4、重装载寄存器(IWDG_RLR)
重装载寄存器是一个12位的寄存器,用于存储用户设定的计数值,其设置范围
为0~4095。IWDG的计时时间为:(预分频值/时钟频率)重装载值,其所能设定的最大复位韶光为 :(1/40KHz)×256×4096= 26.2s旁边。
5、状态寄存器(IWDG_SR)
状态寄存器只有最低两位RVU和PVU位有效,分别表示重装载值和预分频值更新
状态,当相应寄存器正在进行数据更新时,对应的状态位由硬件置“1”,更新完毕后由硬件清“0”,只有当RVU和PVU为0时,表示重装载值和预分频值已经更新完毕。
9.1.2 IWDG配置流程
常日运用独立看门狗时,首先估算程序实行一个整周期循环的韶光,比如20ms,程序实行完毕后实行“喂狗”操作,由于LSI精度不高,因此要留有一定余量。假设设定IWDG溢出韶光是25ms,如果经由25ms后还未喂狗,解释程序涌现故障,IWDG会触发系统复位,程序重新实行。
已知定时韶光为25ms,LSI时钟频率为40KHz,根据公式:定时韶光(s)=(预分频数/时钟频率)重装载值,可以得出 重装载值预分频值=1000,如果设置4分频,则重装载值为250,实际写入到重装载寄存器的值要减1即为249。
IWDG配置流程如下:
1、取消IWDG寄存器写保护
2、设置IWDG预分频系数
3、设置IWDG重装载值
4、重载计数器的初值
5、启动看门狗
IWDG配置函数如下所示:
9.1.3 独立看门狗实验
本节根据独立看门狗的特点设计独立看门狗大约每隔1s旁边计数器溢出,一旦溢出,将触发复位。在主循环中通过延时函数仿照程序实行韶光,当延时小于1s时,在IWDG计数器溢出前喂狗,不触发系统复位;当延时大于1s时,IWDG计数器将溢出,导致系统复位。当正常喂狗时,LED1闪烁一次后保持熄灭,否则LED1持续闪烁。(由于延时函数并禁绝确,加之IWDG时钟有偏差,以是定时韶光并非准确的1000ms)
详细代码如下:
9.2 窗口看门狗
窗口看门狗(WWDG)与独立看门狗(IWDG)一样也是用来监测由外部滋扰或不可预见的逻辑条件造成的运用程序跑飞而进入去世循环。但是窗口看门狗比独立看门狗要灵敏。如果将独立看门狗比做中华田园犬的话,窗口看门狗便是警犬。窗口看门狗与独立看门狗比拟如下:
1、IWDG的计数器是12位的;WWDG的计数器是7位的。 2、IWDG的计数器从设定值递减到0时产生复位旗子暗记;WWDG是小于0x40产生复位。
3、IWDG喂狗只有下限;WWDG既有上限,又有下限。
4、IWDG没有中断;WWDG有中断。
5、IWDG由LSI供应时钟,时钟精度低;WWDG由APB1总线时钟供应,时钟精度高。
6、当系统时钟发生故障时,IWDG可以正常运行,WWDG停滞运行。
WWDG相对付IWDG可以设置一个窗口值(即计数上限),当7位递减计数器的值处于窗口值与0x40之间时(称之为窗口期),可以进行“喂狗”——即重新装载计数器,过早或过晚“喂狗”都会导致系统复位。试想一下:IWDG只要在计数器递减到0之前喂狗都有效,这就存在隐患,如果程序跑飞后又回到原程序或者由于不可知的缘故原由跳过了一段程序后实行了喂狗操作,IWDG是无法检测到程序非常情形。如果利用WWDG,可以根据程序正常实行的韶光设置一个窗口值(上限),当发生以下两种情形时都可以达到复位的效果:
1、当窗口看门狗计数器的值小于0x40;
2、当窗口看门狗计数器在窗口外被重新装载。
因此如果程序过早或过晚实行喂狗操作,都会被认定为非常,从而引起系统复位。
同时WWDG相对付IWDG还具有一个中断,当窗口计数器计数到0x40时中断,该中断不是用于日常“喂狗”,“喂狗”该当放在中断之前。如果进入WWDG中断,表示之前的“喂狗”操作没有被实行,那么系统肯定涌现了非常。此时如果不采纳方法,下一个看门狗时钟周期(计数到0x3F时)将会发生复位,因此该中断可以让程序在复位前有一个紧急处理的机会,比如保存主要数据,或者供应末了一次喂狗的机会,因此该中断中的操作也被称之为CPU“去世前遗嘱”,窗口看门狗构造如图9-2所示。
图9-2 窗口看门狗内部构造示意图
1、时钟源
PCLK1为APB1总线时钟,时钟频率最大为36MHz,通过设置APB1总线时钟预分频系数,可以改变PCLK1的时钟频率,一样平常默利用36MHz。
2、窗口看门狗掌握寄存器(WWDG_CR)
窗口看门狗掌握寄存器紧张包含两部分:窗口看门狗使能位(WDGA)和7位计数器(T[6:0])。窗口看门狗使能位用来启动窗口看门狗;计数器用来进行倒计数,每经由(4096x2WDGTB)个PCLK1周期减1。当计数器值从0x40变为0x3F时(即T6位由1变成0),产生看门狗复位。
3、窗口看门狗配置寄存器(WWDG_CFR)
窗口看门狗配置寄存器由三部分组成:提前唤醒中断使能位(EWI)、预分频器(WDGTB)和7位窗口值。如果设置“提前唤醒中断使能位”为1时,计数器计到0x40时便会产生中断,该位无法软件清零,即软件只能使能中断,但是无法失落能中断,只有产生复位后会自动清零该位,常日程序初始化会再次使能。
预分频器紧张设置预分频系数WDGTB,使得计数器每经由(4096x2WDGTB)个PCLK1周期减1,预分频器有2个数据位,分别位于WWDG_CFR寄存器的第7和第8位,可以设置4种分频办法,其参数如表9-3所示。
窗口值用于设定计数上限,防止程序非常后过早“喂狗”,窗口值最大可以设置为27-1=127,最小必须大于0x40。
4、状态寄存器(WWDG_SR)
该寄存器紧张包含一个“提前唤醒中断标志位”,当计数器值达到0x40时,此位会被硬件置’1’,如果使能“提前唤醒中断使能位”,当标志位置1时程序将会进入WWDG中断,该位须要由软件清“0”。
9.2.1 配置WWDG
WWDG配置流程与IWDG比较,要设置窗口上限和配置中断,个上钩数器递减至窗口上限的值的韶光要大于即是被检测程序所实行的韶光,窗口下限值默认为0x40,担保上限值一定要大于0x40,否则窗口期将不存在。窗口看门狗时序图如图9-3所示,个中W[6:0]为设置的窗口上限值。
图9-3 窗口看门狗时序图
窗口看门狗超时时间打算公式如下:
Twwdg = (4096×2WDGTB×(T[5:0]+1)) /Fpclk1;
个中:
Twwdg: WWDG 超时时间
Fpclk1: APB1 的时钟频率
WDGTB:WWDG 的预分频系数
当PCLK1=最大36Mhz时,窗口看门狗超时周期入表9-4所示
比如:设置预分频系数WDGTB=0时,即WWDG时钟频率为36Mhz / 4096,当计数初值为0x41时,此时超市价最小,即即是1个计时周期,约为113us,当计数初值为0x7F时,此市价最大,即即是64个计时周期,约为7.28ms。实际开拓中,通过改变预分频系数和计数值,选择得当的超时周期。
WWDG配置流程如下:
1、使能WWDG时钟
2、设值WWDG预分频系数
3、设置WWDG窗口值(计数上限)
4、使能WWDG(使能的同时也将计数初值写入到计数器)
5、设置WWDG中断优先级
6、打消WWDG提前唤醒中断标志位
7、使能WWDG提前唤醒中断
8、编写WWDG中断做事函数(根据实际需求选择末了一次喂狗或者保存主要数据)
把稳:由于窗口看门狗中断触发后,将会在1个计时周期后触发单片机复位,因此该中断的实行的韶光该当小于一个计时周期,即最小为113us,最大为910us。如果保存数据至外部存储器,比如EEPROM或Flash,韶光每每是不足的,此时可以选择保存数据至STM32的备份区域。
9.2.2 窗口看门狗实验
窗口看门狗实验与独立看门狗类似,通过延时函数仿照程序运行韶光,只不过由于窗口看门狗详细喂狗窗口期,须要严格打算程序的实行韶光,否则造成提前喂狗。同时由于窗口看门狗具有中断,该中断可以用于喂狗,也可以保存数据,例程中选择在提前唤醒中断中进行末了一次喂狗,防止系统复位。此时须要把稳一种情形:即在中断和主循环中都有喂狗程序时,防止中断喂狗后,又返回主程序实行喂狗,导致提前喂狗,使得系统复位。
9.3 密码锁实验
9.3.1 设计哀求
日常生活中越来越多的场所逐渐利用智能锁来替代传统机器式,比较于传统机器锁,智能锁具有安全性高,不须要随身携带钥匙,都雅,可靠等优点。按照识别办法智能锁分为指纹识别锁、IC识别锁以及电子密码锁等,无论哪种办法,智能锁常日都是将数据存放在EEPROM或者FLASH中。本节结合利用触摸屏以及EEPROM设计一款虚拟按键界面的电子密码锁。
密码锁基本功能如下:
1、可以变动密码;
2、具有加密功能;
3、具有缺点报警功能,超过输入缺点次数,输入锁定;
4、采取触摸屏布局虚拟按键界面;
5、输入密码精确后RGB显示绿光,表示开锁成功;
9.3.2 设计思路
该实验中采取虚拟按键,即通过TFT-LCD布局数字按键0~9以及功能按键Enter和Ese,通过触摸数字所在的区域获取该区域对应的数据,从而代替传统物理按键。密码锁紧张分为两种状态,分别是锁定状态和开启状态,平时为锁定状态,只有输入密码成功后才切换为开启状态,开锁成功RGB将显示绿光。密码存储在EEPROM中,系统第一次启动时须要设置密码,之后在开锁成功后按Enter键可以变动密码。输入密码时,如果想重新输入可以按Ese键清空密码输入区,连续四次输入缺点时,系统将锁定按键60s。
如果忘却密码,变动EEPROM中密码的存储地址或者密码的长度,重启后可重新设置密码。
详细代码如下:
9.4 事宜记录器实验9.4.1 项目需求
在实际产品运用中,常常会有记录某一段韶光内的数据的需求。比如监控某一个区域内近1个月的温湿度情形,每分钟记录一次;记录某一个水域最近几年每天上午8点的水位;记录电动汽车最近三个月电压变革曲线,每1分钟记录一次;记录某一个路口最近一周的车流量,每1秒记录一次……
用来保存所记录数据的设备有很多种,Flash便是一种常用的器件。本小节定制一个任务,记录过去7天内的温湿度信息,每1分钟记录一次韶光以及温湿度信息,并且通过指令可以任意查询。
9.4.2 设计思路
首先确定数据格式,数据须要占用“年+月+日+小时+分钟+温度+湿度”共8个字节。统共须要存储60247=10080条数据,每个扇区最大可以存储4096÷8=512条数据,存储这7天的数据统共须要20个扇区。由于Flash擦除是整扇区擦除,以是写满末了一个扇区再转头写第1个扇区时会擦掉第1扇区的所有数据,以是这里多利用1个扇区共21个扇区作为数据记录区。为了担保程序断电或者复位导致重启后能够从断点连续记录,在记录区后利用一个扇区存储校验码,验证程序时第一次启动还是重启,重启时遍历记录区查找断点。
通过串口发送“R-read 年-月-日 时:分:秒 读取次数”即可读取从发送韶光开始后的n次数据,把稳由于间隔1分钟记录一次数据,默认秒为00,同时读取次数至少为1。比如发送“R-read 2018-7-11 10::46:00 10”,即读取2018年7月11日11时12分00秒之后的10条数据记录,如图9-4所示。
图9-4 串口发送指令读取记录器数据
如果指令缺点,将返回发送的内容;如果发送的韶光超出记录器记录的韶光范围,将返回“Record Error.”;如果未输入读取次数,或读取次数小于1,将返回“bad parameter.”
从发送韶光开始输出数据,如果未查询到相应数据,返回“No data found.”
当输出数据量较大时,应设置得当的串口输出数据缓冲区大小,否则会涌现输出错误。例程设置输出缓冲区为4096字节,最多可以输出90多条数据,再多就须要增加串口输出缓冲区的大小。
9.4.3 程序设计
记录器构造紧张分为两部分,一是记录数据,二是读取数据。为了方便理解将程序拆分为两部分先容,实际以参考例程为准,个中记录数据流程如图9-5所示。
图9-5 记录器记录数据流程图
记录器读取数据流程与之前第六章发送指令读取Flash数据的事理一样,仅仅是解析指令与实行的动作不同,因此不再先容串口监测及收发的干系流程,记录器发送指令读取数据流程如图9-6所示。
图9-6 记录器读取数据流程图
详细代码如下:










