当前位置:
文档之家› 第十二章 STM32单片机看门狗编程及其应用
第十二章 STM32单片机看门狗编程及其应用
• 在WWDG中断服务程序中,不应该重装递减计数器,而是让应 用程序在发生复位前,安排一些紧急处理的任务:保存一些 重要数据和状态参数、或做系统刹车等操作。
工程素质和技能归纳
• 复习C语言中的函数指针内容,掌握其在嵌入式系统中的应 用。 • 理解看门狗的作用,掌握STM32单片机独立看门狗的工作机 制、配置流程和方法。 • 掌握STM32单片机窗口看门狗的工作机制、配置流程和方 法,以及注意事项。
STM32单片机窗口看门狗编程
• 窗口看门狗( Window Watchdog,WWDG),通常用来检 测由外部干扰或不可预见的逻辑条件造成的应用程序背离正 常运行序列而产生的软件故障。WWDG从APB1时钟分频后 得到的时钟驱动,通过可配置的时间窗口来检测应用程序非 正常的过迟或过早的操作。
独立看门狗与窗口看门狗的区别
机器人辅助32位单片机课程
第十二章 STM32单片机看门狗编程及其应用
华中科技大学控制科学与工程系 深圳市中科鸥鹏智能科技有限公司 彭刚
摘要
• 看门狗介绍 • STM32单片机独立看门狗编程
任务一 任务二 独立看门狗编程 认识系统节编程
任务三 窗口看门狗编程
任务一 独立看门狗编程
• 利用IWDG进行检测和解决由系统错误引起的故障。 • 例程参考P284:IWDG.c • 当程序正常运行时,每隔30ms会重新装载IWDG计数器。当程 序进入死循环时,计数器递减到0,系统发生复位。当系统检 测到复位后电量LED。
任务一 独立看门狗编程
• 需要注意: • (1)因为独立看门狗使用的是LSI,所以复位与时钟初始化 函数RCC_Configuration中加入:
WWDG“过早”复位
WWDG“过迟”复位和“过早”复位
任务二 窗口看门狗编程
• 如果主程序不再进行SysTick初始化,即每隔30ms不再重新装 载WWDG计数器,且While(1)中的循环代码不再做修改,而 在WWDG中断服务函数中添加复位WWDG看门狗代码。这样修改 后程序运行期间没有间隔一定时间就去重新装载WWDG计数 器,因此当这个计数器递减到0x40时,会进入 WWDG_IRQHandler中断服务函数,重新装载WWDG递减计数器, 防止WWDG产生系统复位。
•
STM32单片机窗口看门狗编程
• WWDG有一个7位的递减计数器,被当成看门狗用于发生问 题是复位整个系统。 • STM32单片机窗口看门狗线管的寄存器有:
WWDG控制寄存器:WWDG_CR,递减计数器被包含在这个寄存器中, 初值为0x7F. • WWDG配置寄存器: WWDG_CFR ,初值为0x7F. • WWDG状态寄存器: WWDG_SR •
任务二 认识系统节拍定时器
• ARM Cortex-M3内核集成了一个系统节拍定时器SysTick, 它是一个24位递减计数器,SysTick设定初值并使能后,每 经过一个系统时钟周期,计数值就减1,减到0时,计数器自 动重装初值并继续计数,同时内部的COUNTFLAG标志会置 位,触发中断。 • 尝试一下用SysTick编写LED闪烁程序。
• 工程素质和技能归纳
看门狗介绍
• 单片机系统会由于受到外界的干扰,而造成程序执行紊乱, 系统无法正常运行。为了防止这种情况的发生,产生了一种 用于检测程序运行状态的电路或芯片,俗称看门狗 (Watchdog)。
• 看门狗可以分为独立与单片机外部的看门狗芯片和单片机内 集成的看门狗外设模块两种。 • 看门狗有一个输入信号,也称“喂狗”;有一个输出信号给 MCU的复位端。系统运行后启动看门狗计数器,看门狗开始 计数,当计数满后(一定时间)未收到清零信号(喂狗), 看门狗计数器会溢出,引起看门狗中断,造成系统复位。 • STM32F10x内置两个看门狗:独立看门狗和窗口看门狗。
STM32单片机独立看门狗编程
• STM32单片机IWDG结构如图
• 工作原理:在键寄存器中写入0xCCC,开启独立看门狗,此时 计数器开始从复位值0xFFF递减计数。当计数到0时产生一个 复位信号。无论何时向键寄存器中写入0xAAAA,重载寄存 器中的值就会被重新加载到计数器,从而避免看门狗复位。
• 独立看门狗IWDG有独立的时钟,它不受系统硬件影响,可以作为系统故 障探测程序用,主要用于监视硬件的错误。而窗口看门狗WWDG的时钟 与系统相同,可以认为是系统内部的故障探测器。如果系统时钟不走了 ,这个窗口看门狗也就失去作用了,主要用于监视软件错误。WWDG计 数器达到给定的超时值时,会触发中断,这是给应用程序最后一次喂狗 的机会。 通常这个中断不是让应用程序执行喂狗操作,因为既然进入到这个中断 ,就表示应用程序在其他地方的喂狗操作不能奏效,所以发生这种现象 时,肯定是系统有问题了,或者是程序有Bug,或者是碰到了干扰。因此 在这种情况下,WWDG中断是为了让应用程序在发生复位前,安排一些 紧急处理的任务:保存重要的数据和状态参数,或做系统刹车(如电梯 控制)等操作。由此看出,简单地在WWDG中断服务程序中“喂狗”,既 没有发挥WWDG相对于IWDG的优势,又因为在WWDG中断中喂狗而为 系统留下了隐患,发生不可预料甚至灾难性的后果,达不到看门狗的作 用。
STM32单片机独立看门狗编程
• 独立看门狗(Independent watchdog,IWDG)的时钟系统是 由一个12位递减计数器和一个8位的预分频器构成的使用独立 40KHZ内部低速LSI RC振荡器提供。
• STM32单片机的IWDG相关的寄存器有:
– – – – IWDG键寄存器: IWDG_KR IWDG重装载寄存器: IWDG_RLR IWDG预分频寄存器: IWDG_PR IWDG状态寄存器: IWDG_SR
STM32单片机窗口看门狗编程
• STM32单片机窗口看门狗模块结构图如下所示:
STM32单片机窗口看门狗编程
• • 窗口看门狗会在以下两种情况下产生复位: (1)如果7位递减计数器值在T6位便0之前没有被刷新,即未被重置, 那么看门狗电路在达到预置时间周期时,会产生一个MCU复位。可以理 解为“过迟”复位。 (2)在递减计数器达到窗口寄存器数值之前,即大于这个设定数值时, 如果递减计数器数值被刷新,那么也将产生一个MCU复位。可以理解为 “过早”复位。
• 窗口看门狗,每隔30ms重新装载计数器,此时WWDG计数器的 值为0x5F,满足WWDG递减计数器必须在其值小于窗口寄存器的 数值0x70并大于0x3F时才能被重新装载的条件,不会产生 WWDG复位。
任务二 窗口看门狗编程
• 如果程序进入某个代码片段,如在按键中断服务程序中发生 了死循环,不能退出来,那么喂狗程序无法执行,当计数器 从0x40递减到0x3F时,发生系统复位。这是过迟复位。复位 后程序检测到复位与时钟配置寄存器中的控制/状态寄存器标 志位“WWDGRSTF”为1,表明窗口看门狗复位,点亮LED。
任务一 独立看门狗编程
• (4)独立看门狗在使用SysTick中断来重新装载计数器。为 了不影响SysTick其他的应用,在“stm32f10x_it.c”文件中加入 以下代码:
• int Tic_IWDG;//喂狗循环程序的频率判断变量 • void SysTickHandler(void) • { • Tic_IWDG++;//变量递增 • if(TIC_IWDG>=10)//每10个SysTick周期,喂狗一次 • { • IWDG_ReloadCounter();//喂狗 • Tic_IWDG=0;//清零 • } • }
•
任务二 窗口看门狗编程
• 程序正常时,每隔一定的时间重新装载WWDG计数器,即“喂 狗”一次,假设程序进入某个代码片段,比如按键中断,发 生了死循环,不能退出来,那么“喂狗”程序无法执行,当 WWDG计数器递减到0x3F时,达到设定的超时值,系统复位。 例程参考P293:WWDG-1.c
任务二 窗口看门狗编程
• • RCC_LSICmd(ENABLE);//打开LSI While(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==REST);//等待直到 LSI稳定
• (2)喂狗周期要小于独立看门狗计数超时值;同时超时值要 大于程序正常执行循环一次的周期。 • (3)IWDG初始化程序要在SysTick的初试化之后。