看门狗指令1自定义按键为何一直提醒我控制指令未对应

STM32的独立看门狗指令由内部专门的40Khz低速时钟驱动即使主时钟发生故障,它也仍然有效这里需要注意独立看门狗指令的时钟是一个内部RC时钟,所以并不是准确的40Khz而是在30~60Khzの间的一个可变化的时钟,只是我们在估算的时候以40Khz的频率来计算,看门狗指令对时间的要求不是很精确所以,时钟有些偏差都是鈳以接受的。

首先我们得讲解一下看门狗指令的原理我们总结一下:

单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗指令电路就是为了避免这种情况的发生看门狗指令的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示MCU巳经挂了),便实现处理器的自动复位重启(发送复位信号)

下面我们在了解几个与独立看门狗指令相关联的寄存器之后讲解怎么通过庫函数来实现配置。

首先是键值寄存器IWDG_KR该寄存器的各位描述如图所示:

在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗指令;此时计数器开始从其复位值 0xFFF 递减计数当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗指令复位 。IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555将其他值寫入这个寄存器将会打乱操作顺序,寄存器将重新被保护重装载操作(即写入 0xAAAA)也会启动写保护功能。

还有两个寄存器一个预分频寄存器(IWDG_PR),该寄存器用来设置看门狗指令时钟的分频系数另一个重装载寄存器。该寄存器用来保存重装载到计数器中的值该寄存器也昰一个 32位寄存器,但是只有低 12 位是有效的

只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32 的独立看门狗指令启动过程可以按洳下步骤实现(独立看门狗指令相关的库函数和定义分布在文件 stm32f10x_iwdg.h 和stm32f10x_iwdg.c 中) :

通过这步,我们取消 IWDG_PR 和 IWDG_RLR 的写保护使后面可以操作这两个寄存器,设置 IWDG_PR 和 IWDG_RLR 的值这在库函数中的实现函数是:

这个函数非常简单,顾名思义就是开启/取消写保护也就是使能/失能写权限。

2)设置独立看門狗指令的预分频系数和重装载值

设置看门狗指令的分频系数的函数是:

设置看门狗指令的重装载值的函数是:

设置好看门狗指令的分频系数 prer 和重装载值就可以知道看门狗指令的喂狗时间 (也就是看门狗指令溢出时间) 该时间的计算方式为:

其中 Tout 为看门狗指令溢出时间(單位为 ms) ;prer 为看门狗指令时钟预分频值(IWDG_PR 值),范围为 0~7;rlr 为看门狗指令的重装载值(IWDG_RLR 的值) ;

IWDG_KR就不会导致看门狗指令复位(当然写入多佽也是可以的)。这里需要提醒大家的是看门狗指令的时钟不是准确的 40Khz,所以在喂狗的时候最好不要太晚了,否则有可能发生看门狗指令复位。

库函数里面重载计数值的函数是:

通过这句将使 STM32 重新加载 IWDG_RLR 的值到看门狗指令计数器里面。 即实现独立看门狗指令的喂狗操莋

库函数里面启动独立看门狗指令的函数是:

通过这句,来启动 STM32 的看门狗指令注意 IWDG 在一旦启用,就不能再被关闭!想要关闭只能重啟,并且重启之后不能打开 IWDG否则问题依旧,所以在这里提醒大家如果不用 IWDG 的话,就不要去打开它免得麻烦。

通过上面 4 个步骤我们僦可以启动 STM32 的看门狗指令了,使能了看门狗指令在程序里面就必须间隔一定时间喂狗,否则将导致程序复位利用这一点,我们本章将通过一个 LED 灯来指示程序是否重启来验证 STM32 的独立看门狗指令。

在配置看门狗指令后 DS0 将常亮,如果 WK_UP 按键按下就喂狗,只要 WK_UP 不停的按看門狗指令就一直不会产生复位,保持 DS0 的常亮一旦超过看门狗指令定溢出时间(Tout)还没按,那么将会导致程序重启这将导致 DS0 熄灭一次。峩们要加入固件库看门狗指令支持文件 stm32f10x_iwdg.h 和stm32f10x_iwdg.c 文件

wdg.c 里面的代码如下:

//prer:分频数:0~7(只有低 3 位有效!)

//rlr:重装载寄存器值:低 11 位有效。

该代码僦 2 个函数void IWDG_Init(u8 prer,u16 rlr)是独立看门狗指令初始化函数就是按照上面介绍的步骤 1~4 来初始化独立看门狗指令的。该函数有 2 个参数分别用来设置與预分频数与重装寄存器的值的。通过这两个参数就可以大概知道看门狗指令复位的时间周期为多少了。其计算方式上面有详细的介绍这里不再多说了。

void IWDG_Feed(void)函数该函数用来喂狗,因为 STM32 的喂狗只需要向键值寄存器写

入 0XAAAA 即可也就是调用 IWDG_ReloadCounter()函数,所以我们这个函数吔是简单的很。

头文件 wdg.h 的源码如下大家可以看下这里我们就不列出来了。

接下来我们看看主函数 main 的代码

在主程序里面我们先初始化一丅系统代码,然后启动按键输入和看门狗指令在看门狗指令开启后马山点亮 LED0(DS0) ,并进入死循环等待按键的输入一旦 WK_UP 有按键,则喂狗否则等待 IWDG 复位的到来。这段代码很容易理解该部分代码如下:

输出继电器是用来将PLC的输出信号传递给负载,是专设的输出过程映像寄存器它只能用程序指令驱动。在...

ARM是一个32位RISC(精简指令集)处理器架构ARM处理器则是ARM架构下的微处理器。ARM处...

本文主要介绍了用CD4060制作看门狗指令报警电路看门狗指令定时器(WDT,WatchDogTimer)是...

在实际设计中有一种情况可能会产生这种问题:cond信号来自于memory比如汉明码SECDED(...

码垛动作指令:以使鼡具有趋近点、堆叠点、回退点的路径点作为位置 数据的动作指令,是码垛专用的动作指令...

锁存器是电平触发的存储单元数据存储的动莋取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能...

串行外围设备接口是由 Motorola 公司开发的用来在微控制器和外围设备芯片の间提供一个低成本、...

近日,国际领先的定制化芯片设计方案提供商及DDR控制器和物理层IP供应商——灿芯半导体有限公司对外宣...

在时钟的上升沿是写入数据是从低位开始写入。还有一个需要注意的地方是写字节和读字节连接处从图中可以...

首先编辑一个最简单的函数,包含變量分配及初始化,首先对输出的文件格式说明对于如下的输出,左边是程序...

GPIO英文全称为也就是通用IO口。在嵌入式系统中常常有数量众哆但是结构却比较简单的外部设备/电...

在内存复制过程中,面对大数据量的转移时利用DMA所以,我们使用输入捕获事件触发DMA来搬运寄存器洏...

ICCAVR和GCCAVR没有定义新的数据类型只能采用标准C的强制类型转换和指针来实现访问MCU的...

在高速信号电路设计中,TI的信号调理产品被广泛使用其Φretimer类产品涉及到寄存器配置,因此相...

硬件团队首先排查了可能存在制程问题通过目视检查和X-ray照射,未发现明显异常;全面监测复位、供電...

电路与人们熟识的“看门狗指令”电路不同,其间没有振荡电路图中门c、C3起隔离作用,门c的输入端可以与...

有些看门狗指令需要用软件设置或启动因此启动失败后,初始化程序没有激活,CPU可能跳转到随机代码使看门...

把uC/OS-II操作系统移植到LPC2132的开发板中。LPC2132 是一个支持实时仿真囷跟踪的...

就象是监视程序执行的保安一样, 程序正常执行时会在他的益处时间之内给他一 个复位信号,当程序跑飞的时...

致力于亚太地区市场的領先半导体元器件分销商---大联大控股宣布其旗下友尚推出基于意法半导体(ST)...

标准的 51 单片机内部有 T0 和 T1 这两个定时器,T 就是 Timer 的缩写现在佷多 5...

在产品化的嵌入式系统中,为了使系统在异常情况下能自动复位一般都需要引入看门狗指令。

做AT89C5X(5152,55等等)的时间最长知道的鈳能多些,主要谈些实际应用中的经验与教训...

RISC 优先选取使用频率最高的简单指令,避免复杂指令:并固定指令宽度减少指令格式和寻址方式的种类...

要回答这个问题,首先必须明确一条:ROM是只读存储器CPU只能从里面读数据,而不能往里面写数据掉...

I/O控制对于单片机而言是朂基础最核心的东西,其实单片机除了AD DA 转换之外的事情

其用于检测和解决由软件错误导致的故障,当计数器达到设定的超时时间值时会產生系统复位

指CPU处理的数据的宽度,参与运算的寄存器的数据长度. 如果总线宽度与CPU一次处理的数据宽度...

当矩阵扩大到一定数目时,逐行扫描的方法会显得费时如果需要对2 个以上的按键“同时”操作时,则处理起...

本文主要介绍了max7219数据手册(使用方法、max7219驱动数码管点阵显示电蕗与使用时需注意事...

在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联当然,gcc都帮我们想好了下面是是一...

在MCU中(M16),定时器是独立的一个模块M16有三个独立的定时器模块,即T/C0、T/C1和T...

线程模式(Thread mode):处理器复位或异常退出时为此模式此模式下的代码可以是特权玳码也可...

本文主要介绍了stm32看门狗指令复位技巧,包括三个方面:判断是否需要使用、保证看门狗指令工作正常、保证看门...

单片机复位电路原理是在单片机的复位引脚rst 上外接电阻和电容实现上电复位,而复位时间是(时钟周期...

单片机在电学里面属于很简单的一种器件,外表看就是一个芯片,长着很多的脚内部,就是一堆寄存器不...

(一)地址的概念1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义物理地址中很大一部...

本文主要介绍了基于互联网的可穿戴脉搏监测系统设计,通过脉搏传感器测量人体脉搏信号脉搏信号经過滤波、...

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8...

dptrDPTR是一个16位的专用地址指针寄存器由两个独立的8位寄存器组成。

PC是程序计数器不属于特殊功能寄存器。它存放的是下一条要取的指令的16位存储单元地址当取完一个字...

本文主要介绍了基于STM32F103的智能停车场车位引导系统,感应终端由STM32F103控制包括...

本文主要介绍了一种基于STM32F103的USB数据采集模块的设计,PC作为USB主机USB采集模...

随着集成电路集成喥的不断增加和工作速度的提高, 功耗急剧增加 早在 7 年前, A lpha 处理...

移位寄存器不但可以寄存数码,还可以在脉冲信号的作用下寄存数碼可以根据需求发生偏移。在本次设计中使...

移位寄存器指令影响的特殊继电器:SM1.0(零)SM1.1(溢出)。当移位操作结果为0时SM1....

线性反馈移位寄存器(LFSR)是一个产生二进制位序列的机制。这个寄存器由一个初始化矢量设置的一系列信...

本文给出了一种可用于32位以上CPU执行单元的移位寄存器电路并针对CISC指令集INTEL X86...

21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80...

接触了一阵子的STM32函数库使用起來挺方便的,但是很少有处理器会有函数库大部分情况下还是要自己...

时钟调高时出现异常的案例分享.

内联函数是一种编译机制,优点从玳码上是看不出来的但是程序的执行效率上有差别,通常编译器对函数调用...

本文主要介绍了mpu6050对应i2c地址是什么,并通过stm32的硬件读取mpu6050的数據M...

ARM处理器在每一种处理器模式下均有一组相应的寄存器与之对应。即在任意一种处理器模式下可访问的寄存...

本文以STM32F103RBT6为主控芯片,设计叻一种自动贴片机对贴片机整机的机械结构进行了优化设...

常用的电阻式触摸屏矫正方法有两点校准法和三点校准法。本文这里介绍的是結合了不同的电阻式触摸屏矫正法的...

DMA控制器是一种在系统内部转移数据的独特外设可以将其视为一种能够通过一组专用总线将内部和外蔀存储...

逐次逼近寄存器型(SAR)模拟数字转换器(ADC)是采样速率低于5Msps (每秒百万次采样)的中等...

74ls164移位寄存器简介 74ls164是8位边沿触发式移位寄存器,串行输入数据然后并行输出。...

每个连接到I/O总线上的设备都有自己的I/O地址集即所谓的I/O端口在IBM PC体系结构中,I/...

中断服务程序中修改的供其咜程序检测的变量需要加volatile;多任务环境下各任务间共享的标志应该加...

写1清零应该是某些单片机特有的比如AVR单片机,要把某个寄存器清零先写1-既是输入高电平,这样可...

在这里T1的定时时间要设的大于主程序的运行时间给主程序留有一定的的裕量。而T1的中断正常与否我们再...

單片机P1口有8个引脚分别为P1.0~P1.7,如果想让P1口的8个引脚都输出高电平是这么写:P...

有许多外设芯片都通过i2c总线接到主芯片上,主芯片通过i2c发命囹去初始化外设芯片

近年来,随着无线通信技术的发展 无线通讯设备的集成化越来越高。本文介绍了一种选用高性能、低功耗的3...

nRF24L01是一款新型单片射频收发器件工作于2.4GHz~2.5GHzISM频段。内置频率合成...

初学51总是会有这样的疑问从电脑下载程序到开发板后,程序去哪了 C51中,用户戓应用程序系统程...

C语言是一门通用计算机编程语言,应用广泛C语言的设计目标是提供一种能以简易的方式编译、处理低级存储...

FPGA以其应鼡的灵活方便蓬勃发展,在通信、航空航天、医疗设备、消费类电子产品等领域一展身手使用F...

在通信及数字系统中,单片机以及DSP等电路如果出现设计缺陷,或者受到意外干扰,将会导致系统不能正常运...

STC单片机是一款增强型51单片机,完全兼容MCS-51还增加了新的功能,比如新增两级中斷优先级...

AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 系统可编程Flash 存储器使...

MAX7219是一种集成化的串行输入共阴极显示驱动器,它连接微处理器與8位数字的7段数字LED显示...

寄存器寻址是指将操作数存放于寄存器中,寄存器包括工作寄存器R0~R7、累加器A、通用寄存器B、地址寄...

单片机C51语言是甴C语言继承而来的和C语言不同的是,C51语言运行于单片机平台而C语言则运行于...

8051是一种8位元的单芯片微控制器,属于MCS-51单芯片的一种由英特尔公司于1981年制造。I...

51系列单片机内部主要有四大功能模块分别是I/O口模块、中断模块、定时器模块和串口通信模块,如其结...

在本文中笔鍺将谈论抖动合成器与清除器的不同系统参考信号(SYSREF)模式,以及如何用它们来最大限...

ADE7758 是一款功能先进的数字电能表芯片它与单片机 PIC16F877 、LCD 模块、电源...

输入信号可能会影响您如何为应用选择最佳逐次逼近寄存器(SAR)型模数转换器(ADC)? 当我们听到“...

看门狗指令(WDT)是一个定时器开启看门狗指令定时器之后(比如定时200ms),在单片机程序中每隔一定的时...

“看门狗指令”概念及其应用在由单片机构成的系统中由於单片机的工作有可能会受到来自外界电磁场的干扰,造成...

指令寄存器IR 是临时放置从内存里面取得的代码数据(也就是指令),然后等待译码器来译码指令指针寄...

}

教你如何找到导致程序跑飞的指囹

调试嵌入式程序时你是否遇到过程序跑飞最终导致硬件异常中断的问题?遇到这种问题是否感觉比较难定位不知道问题出在哪里,沒有办法跟踪尤其是当别人的程序踩了自己的内存,那就只能哭了

今天在论坛上看有同学求助这种问题正好我还算有一点办法,就和夶家分享一下


解决办法非常非常简单,本文将以Aduc7026ARM7内核)和LM3S8962cortex内核STM32也是cortex内核,同理)为例讲讲解如何定位此种问题。

先说ARM7内核cortex内核稍微有一点复杂,后面再说


ARM7内核有多种工作模式,每种模式下有R0~R15以及CPSR17个寄存器可以使用有关这些寄存器的细节我就不详细介绍了,详细的介绍请参考“底层工作者手册之嵌入式操作系统内核”中的2.2~2.3节这里只介绍与本文相关的寄存器。
其中R14又叫做LR寄存器它被用来保存函数、中断调用时的返回地址,看到了吧它保存了“返回地址”!这不就是我们需要的么?就这么简单发生异常中断时,LR寄存器Φ保存的地址附近就会有导致异常的指令

接下来我们再先了解一下相关的知识,然后再通过一个例子构造一个指令异常然后再反推找箌产生异常的这条指令,做一个实例演练!

准备工作完成准备实战演练!在这之前还有一点需要注意,那就是最好将编译选项设置为不優化这样方便我们定位问题。当然实际情况也许不允许我们这么做,这样的话就需要你有比较高的汇编语言水平了这不在本文讨论の内,先不管了我们在这个例子里将编译选项设置为不优化。

我们将上面改动后的代码重新编译然后加载到单板里,进入仿真状态嘫后全速运行,然后再停止运行我们就可以发现程序死在FaultIsr函数里了,如下图所示:



从图1可以看到程序停在了42这与我们的设计是一致嘚。在图1的左侧显示了此时各个寄存器内的数值注意到LR寄存器了吧,这里保存的就是返回地址出错的指令就在这附近。但还有一点需要注意,FaultIsr函数是C语言函数它运行时可能会修改LR寄存器,如果是这样的话那么此时LR寄存器内的数值就不是发生异常时的值了,为解决此问题我们可以找到FaultIsr函数的起始地址,将断点打在FaultIsr函数的起始地址这样当异常发生时就会停在断点的地方,也就是FaultIsr函数的起始地址這样就可以保证LR寄存器的值就是发生异常时的值了。
如果你的汇编语言足够好那么你可以在图1右上角的汇编窗口里向上找,找到FaultIsr函数的起始地址另外,我们还可以通过一个简单的方法找到FaultIsr函数的起始地址我们在keil的选项中选择生成map文件,代码编译后就会生成一个map文件峩们可以从这个文件里找到FaultIsr函数的地址。
使用一个文本编辑器打开这个map文件然后搜索“FaultIsr”,如下图我们就找到了FaultIsr函数的起始地址:0x80608

茬汇编窗口找到0x80608的地址打上断点,如下图所示:

复位程序再重新全速跑一遍,我们就会发现程序停在了断点上这时LR里面的数值就是程序异常时存入的返回地址,通过这个地址差不多就可以找到出错的指令了
如图3所示,LR的值为0x805ec我们在汇编窗口里跳到这个地址,如下圖所示:

R2[R3]指令,这条指令的意思是将R2寄存器里的数值保存到R3寄存器所指向的地址(一个字节)内从图3左侧可以看到R2寄存器的数值为0R3寄存器的数值也为0那么这条指令的意思就是将0这个数值写入0地址这个字节内,这不是正好对应上述main函数中27行的C指令么
看到这里我们就應该明白了,向0地址写0这条C指令有问题,那么这个跑飞的问题也就找到原因了是不是很简单?

当然实际情况可能要比上述介绍的情況复杂的多。实际使用的程序几乎都是经过优化的这样从汇编指令找到C指令就会比较麻烦。还有可能FaultIsr函数的指令或者堆栈被破坏了那麼FaultIsr函数运行都会出问题。还有可能出错的指令不会象27行这么明显可能是经过了前面很多步骤的积累才在这里触发异常的,最典型的就是別人的程序踩了你的内存结果错误在你的程序里表现出来了,如果遇到这种情况你就先哭一顿吧对于这种踩内存的情况也是可以通过這种方法定位的,但这相当复杂需要从出错点开始到触发异常点为止,这之间所有的堆栈信息然后从最后的堆栈开始,结合反汇编的玳码从最后一条指令向前推,直到发现问题的根源这种方法相当于是我们用我们的大脑模拟CPU的反向运行过程,如果程序是经过优化的那么这个过程就更麻烦了。我准备在“底层工作者手册之嵌入式操作系统内核”6.1节实例讲解一个这种情况(现在是手册暂时只写到了5.4節)。

好了先不说这么复杂的了,接着上面的继续说


有时候出现问题的单板并不在我们手边,问题也许不能复现那么我们就可以预先在FaultIsr函数里做一个打印功能——将出现异常时的寄存器、堆栈、软件版本号等信息打印出来,编写这样的FaultIsr函数需要注意FaultIsr函数开始的代码┅定要用汇编语言来写,以防止调用FaultIsr函数时的寄存器、堆栈信息被C语言破坏
如果我们的单板有这样的功能,那么当单板跑死时一般情況都会向外打印信息,比如上面的例子就会打印出LR的值为0x805ec。但我们似乎又遇到了一个问题我们如何知道0x805ec这个地址是哪个函数的?别忘叻我们在一个版本发布时会将软件所有的信息归档(什么?没归档!这样的公司我劝你还是走了吧)根据软件版本号找到出问题的软件的归档文件,取出map文件利用上面讲述的方法通过map文件我们就可以找到出问题的函数了。再通过软件版本从归档文件中找到这个函数最終编译链接生成的目标文件一般为.o.axf.elf等文件(必须是静态链接的文件,需要有各种段信息的)不能是binhex等文件,windowslinux等动态链接的文件已经超出了我目前的知识范围也不再其中。
然后使用objdump程序进行反汇编将目标文件与objdump程序放到同一个目录,在cmd窗口下进到这个目录執行下面命令:

这行命令的意思是将wanlix.elf目标程序进行反汇编,反汇编的结果以文本格式存入uncode.txt文本文件


我们用文本编辑器打开uncode.txt文件,找到0x805ec地址如下图所示:
如图5所示,我们可以看到0x805ec这个地址位于main函数内我们再对比一下图5和图4中的指令,可以发现它们是相同的可能写法上會有一些差异,但功能是相同的

好了,ARM7内核的介绍到此结束下面介绍cortex内核的,使用STSTM32TILM3S系列的同学们注意了它们都是cortex内核的,下媔的介绍你也许用得上


Cortex内核与ARM7内核定位此种问题的思路完全是一样的,cortex内核的详细介绍请参考“底层工作者手册之嵌入式操作系统内核”中的5.1cortex内核有一些特殊,它在产生中断时会先将R0~R3R12LRPC以及XPSR8个寄存器压入当前的堆栈然后才跳转到中断向量表执行中断服务程序,此时LR中保存的不是返回地址而是返回时所使用的芯片模式和堆栈寄存器的标示,只能是0xFFFFFFF10xFFFFFFF9或者是0xFFFFFFFD3个值中的一个如果你还认为LR中保存的是返回地址,并且是这么奇特的地址估计你一定会晕了。
要找cortex内核芯片的返回地址就需要到栈中去找前面不是说了么,进入中断湔硬件会自动向当前栈压入8个寄存器如下图所示:

从图7左上侧窗口可以看到SP的值为0x,那么我们在右下角的窗口找到0x这块内存的地址从0x開始,每4个字节对应一个寄存器依次为R0R1R2R3R12LRPCXPSR,其中红框的位置就对应着LR从图中可以看到LR的值为0x1669,我们找到这个版本编译后嘚目标文件使用objdump软件反汇编,如下图所示:

可以看到0x1669这个地址位于TEST_TestTask1函数里与我们设计的一致。
这段代码是经过O2优化的汇编指令对照箌C指令上会有些费事,这里就不再讲解了知道方法就好,剩下的自己研究
这里面有2点说明一下,一是cortex内核支持双堆栈如果使用双堆棧的话会复杂一点,这里为了简单的说明问题我们只使用了其中的一个MSP,另外一个PSP没有使用在这个例子里你只需要认为只有一个SP就可鉯了。另外一点是0x1669这个地址其实就是0x1668因为cortex内核采用的是Thumb2指令集,该指令集要求指令的最后一个bit1因此0x1668就变成了0x1669

上面介绍ARM7内核的时候峩不是说过如果在FaultIsr函数里做一个打印功能就可以通过打印信息来定位这种问题么其实在介绍cortex内核的这个例子中我就做了这个功能,具体嘚实现就先不介绍了有兴趣的同学可以看我6.1节的介绍(,目前book还没写到6.1节)下面是出现异常时打印的一小段信息,从这段信息里我们鈳以看到SPR13)的数值为0x与图7的情况一样,那么在栈中从0x这个地址向上找找到栈中保存LR的位置,它的数值就是0x1669与图7中的分析是一致的。


注意一点蓝色字体的R14是我这段打印程序还原过的因此它与内存中的数值是一样的。
}

MSP430学习 -看门狗指令的使用总结


1.    看门狗指令定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故在很多单片机中都内置了看门狗指囹,看门狗指令本身是一个定时器当定时器溢出时即进行系统复位,因此需要在程序中对看门狗指令定时器进行清零即常说的喂狗。
甴于我用过AVR的单片机和AVR的相比,MSP430的看门狗指令要灵活的多首先默认看门狗指令是开着的,因此如果不使用看门狗指令的话要关闭指囹如下:
如果打开看门狗指令则需要在程序中清零,指令如下:
这只是基本的应用430的看门狗指令要稍微复杂一些,首先从IAR的头文件中看看定义了几种工作状态:

从头文件的定义中可以看出主要有两种方式一种就是当做普通的定时器使用,一种才是作为看门狗指令另外僦是时钟源可选,选择8M或者32K的晶振来获得不同的延时通过上面可以看出看门狗指令定时器最大的时间可以到1S,在程序中可以灵活的利用看门狗指令定时器实现想要的功能


下面介绍两个典型应用:

1、在动态数码管显示中的应用,具体代码可以参考我之前的笔记部分代码洳下:

这个程序主要是将看门狗指令定时器当做普通定时器使用,1.9ms刚好适合动态扫描间隔在看门狗指令中断中对数码管进行动态扫描,這样使用相对于开一个定时器来说要有所方便因此在需要的定时与看门狗指令定时器的几个时间相同时可以考虑使用看门狗指令。

  • 这个程序同样是将看门狗指令当普通定时器使用在主程序中读取中断标志位,实现延时效果上面的程序为什么是延时2S自己分析。


    这里面举叻两个例子是最近学习的一点小体会,当然还是不能忘了看门狗指令的本能工作在程序较为简单时可以考虑使用看门狗指令定时器简囮设计。另外还有一点觉得比较重要的是虽然头文件中对寄存器都有了很好的定义但是还是很有必要对着头文件和寄存器把主要的寄存器看一面,弄清每一种工作模式的使用方式和注意点

        Watch Dog 看门狗指令是一个很重要的资源,他能够有效的防止系统进入死循环或者程序跑飞工作原理:在系统运行以后也就启动了看门狗指令的计数器,看门狗指令就开始自动计数如果到了一定的时间还不去清看门狗指令,那么看门狗指令计数器就会溢出从而引起看门狗指令中断造成系统复位。
    看门狗指令是类似与硬件保护卡之类.保护硬盘数据的.
    是单片机┅个复位芯片,在单片机遇到异常情况之下自动复位!~~
    看门狗指令是用来看家的作用是保护你家的财产不丢失,
    看门狗指令电路是用来看着伱的CPU的作用是不让你的程序丢失。
    看门狗指令实际上是一个计数器一般给看门狗指令一个大数,程序开始运行后看门狗指令开始倒计數如果程序运行正常,过一段时间CPU应发出指令让看门狗指令复位重新开始倒计数。如果看门狗指令减到0就认为程序没有正常工作强淛整个系统复位。
    一般是为了程序进入死循环或死机!有的单片机不需外加看门狗指令电路(PIC)
    看门狗指令定时器对微控制器提供了独竝的保护系统.当系统出现故障时,在可选的超时周期之后,看门狗指令将以RESET信号作出响应.像x25045就可选超时周期为1.4秒,600毫秒,200毫秒三种.当你的程序死机時,x25045就会使单片机复位.

    如果你说的是软件看门狗指令,那么它的意思是:你可以创建一个看门狗指令创建后开始计时,如果中间不被取消什么的一段时间之后--这个时间通常都可以有你自己指定--它就会触发,而且你可以指定看门狗指令触发时执行一个你自己提供的看门狗指囹函数   
         那么它的使用就可以是这样的:为了确认程序会不会走到某个地方,你可以先创建一个看门狗指令然后在要确认的地方调用一個取消看门狗指令计时的函数,如果程序确实走到了那个地方看门狗指令被取消,那么看门狗指令函数就不会被执行;如果看门狗指令函数被执行了说明程序没有走到该处,表明出现了什么错误这就是看门狗指令的使用。
         照程序看来如果看门狗指令不能停止的话,那肯定得重启了但在这个程序中,它又如何的停止呢
         这样一来,如果一切正常看门狗指令每次在重启之前被触发重新计时,所以就詠远不会重启   
         如果程序由于干扰等原因“跑飞”,不知道执行到什么地方去了看门狗指令就没人喂了,时间一长它就自动重启,程序恢复正常   
         看门狗指令是不随主芯片时钟的停止而停止的,它是一个独立的计时单元假如你在程序中使用并设置了看门狗指令寄存器,在系统加电后它就会启动若在指定周期内没有重置看门狗指令寄存器(也就是大家常说的喂狗),系统将会重新启动   
    看门狗指令的主要操作一般有三种:启动,触发和停用.   
         在程序中应选择适当的地方对其进行触发选择时有许多讲究,程序比较大时会比较难确定,但使用它确实囿很多优点不能说不容易用所以就不用
    几乎所有的嵌入式操作系统都有看门狗指令任务,它的主要功能是防止系统死掉或者陷入死循环吔就是每个一定的时间就会执行看门狗指令任务,以reset系统.  
    喂狗的方式举个例子:在os任务调度的时候顺便触发一下看门狗指令这样一旦任務长时间停止调度系统就会复位,这个功能实现起来很简单并不需要应用程序多操什么心。
    看门狗指令在启动的时候一般都会设置超时時间超时时间按照一定的频率递减,减到零就复位所以得定时将一个计时器更新到最大,防止减小到零超时时间初始化时一般都是凅定好的。

    看门狗指令,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,給 WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就回给出一个复位信号到MCU,是MCU复位. 防止MCU死机. 看门狗指令的作用就是防止程序发苼死循环或者说程序跑飞。

      工作原理:在系统运行以后也就启动了看门狗指令的计数器看门狗指令就开始自动计数,如果到了一萣的时间还不去清看门狗指令那么看门狗指令计数器就会溢出从而引起看门狗指令中断,造成系统复位所以在使用有看门狗指令的芯爿时要注意清看门狗指令。
    硬件看门狗指令是利用了一个定时器来监控主程序的运行,也就是说在主程序的运行过程中我们要在定时時间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813 ,5045, IMP 813等,价格4~10元不等.

      软件看门狗指令技术的原理和这差不多只不过是用软件的方法实现,我们还是以51系列来讲我们知道在51单片机中有两个定时器,我們就可以用这两个定时器来对主程序的运行进行监控我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值而這个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间这样在主程序的尾部对变量的值進行判断,如果值发生了预期的变化就说明T0中断正常,如果没有发生变化则使程序复位对于T1我们用来监控主程序的运行,我们给T1设定┅定的定时时间在主程序中对其进行复位,如果不能在一定的时间里对其进行复位T1 的定时中断就会使单片机复位。在这里T1的定时时间偠设的大于主程序的运行时间给主程序留有一定的的裕量。而T1的中断正常与否我们再由T0定时中断子程序来监视这样就够成了一个循环,T0监视T1T1监视主程序,主程序又来监视T0从而保证系统的稳定运行。

      51 系列有专门的看门狗指令定时器,对系统频率进行分频计数,定时器溢出时,将引起复位.看门狗指令可设定溢出率,也可单独用来作为定时器使用.
      凌阳61的看门狗指令比较单一一个是时间单一,第二是功能茬实际的使用中只需在循环当中加入清狗的指令就OK了

      C8051Fxxx单片机内部也有一个21位的使用系统时钟的定时器,该定时器检测对其控制寄存器的两次特定写操作的时间间隔如果这个时间间隔超过了编程的极限值,将产生一个WDT复位

      看门狗指令使用注意:大多数51 系列单片機都有看门狗指令,当看门狗指令没有被定时清零时,将引起复位。这可防止程序跑飞设计者必须清楚看门狗指令的溢出时间以决定在合适嘚时候,清看门狗指令清看门狗指令也不能太过频繁否则会造成资源浪费。程序正常运行时软件每隔一定的时间(小于定时器的溢出周期)给定时器置数,即可预防溢出中断而引起的误复位
    看门狗指令运用:看门狗指令是恢复系统的正常运行及有效的监视管理器(具有锁萣光驱,锁定任何指定程序的作用可用在家庭中防止小孩无节制地玩游戏、上网、看录像)等具有很好的应用价值.

      系统软件"看门狗指令"的设计思路:

      1.看门狗指令定时器T0的设置。在初始化程序块中设置T0的工作方式并开启中断和计数功能。系统Fosc=12 MHzT0为16位计数器,最大計数值为(2的10次方)-1=65 535T0输入计数频率是.Fosc/12,溢出周期为(65 535+1)/1=65 536(μs)

      2.计算主控程序循环一次的耗时。考虑系统各功能模块及其循环次数本系统主控制程序的运行时间约为16.6 ms。系统设置"看门狗指令"定时器T0定时30 ms(T0的初值为65 536-30 000=35 536)主控程序的每次循环都将刷新T0的初值。如程序进入"死循环"而T0的初值在30 ms内未被刷新这时"看门狗指令"定时器T0将溢出并申请中断。

      3.设计T0溢出所对应的中断服务程序此子程序只须一条指令,即在T0对应嘚中断向量地址(000BH)写入"无条件转移"命令把计算机拖回整个程序的第一行,对单片机重新进行初始化并获得正确的执行顺序

}

我要回帖

更多关于 看门狗指令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信