配置为不喂狗引起中断,在一定时间内没有喂狗将不会引起单片机复位而是进入看门狗中断。
当引起中断后,进入中断函数,然后退出来继续从刚才进入的地方执行。需要特别注意的是,这时候看门狗计数器不再递减,也就是说,即使现在不喂狗,也不会引起看门狗中断了。这时候,程序相当于缺少了看门狗功能,如果程序在接下来的运行过程中再次跑飞,就真的“让程序再飞一会儿”了。说到这里,似乎看门狗中断的功能毫无用处了。不过,Ration想到了一个看门狗中断的妙用,我们可以在中断函数里面做一些非常紧迫的事情(例如,关闭热水器电源),然后再用软件复位功能,把单片机复位,这样,不但可以达到让单片机复位的效果,还能起到多层保护的作用。
下面做一个示例,开启看门狗中断后,让单片机间隔一定时间给串口发送字符‘A’,在看门狗中断函数里面,让单片机给串口发送字符‘B’。这样,打开串口调试助手,就可以看到实验效果了。
新建一个工程,结构如下图所示:
uart.c文件的介绍,请看第四章内容。
wdt.c文件和wdt.h文件和6.3节的一样。
在main.c文件中,输入以下代码:
#include “lpc11xx.h”
#include “wdt.h”
#include “uart.h”
void delay(void)
{
uint16_t i,j;
for(i=0;i<5000;i++)
for(j=0;j<280;j++);
}
/******************************************/
/* 函数功能:看门狗中断服务函数 */
/* 说明:当MOD值设置为0x01时,如果没有及时*/
/* 喂狗,将会进入这个中断函数。 */
/******************************************/
void WDT_IRQHandler(void)
{
LPC_WDT->MOD &= ~(0x1<<2); // 清看门狗超时标志位WDTOF
// 在下面可以写入当看门狗中断发生时你想要做的事情
UART_send_byte(‘B’);
delay();//等待数据发送完成
NVIC_SystemReset();
}
int main()
{
UART_init(9600);
WDT_Enable(0); // 看门狗初始化,1秒钟之内喂狗
NVIC_EnableIRQ(WDT_IRQn);
while(1)
{
delay();
//WDTFeed();
UART_send_byte(‘A’);
}
}
第23行,从主函数开始看起。
第25行,初始化串口波特率为9600。(关于此函数的详细说明,请看第四章内容。)
第26行,开启看门狗。
第27行,开启NVIC看门狗中断。
第28行,进入while死循环,间隔一定时间给串口发送字符‘A’。
第15~22行,定义了串口中断服务函数。
第17行,给WDMOD寄存器bit2写0,清看门狗超时标志位WDTOF。(如果不清此位,进入中断函数后,就出不去了。)
第19行,给串口发送字符‘B’。
第20行,等待字符‘B’发送完毕。(没有此延时,单片机没有成功发送完数据,就执行下一句复位单片机了。)
第21行,引用复位函数复位单片机。
复位函数:NVIC_SystemReset()
#define SCB_AIRCR_VECTKEY_Pos 16
#define SCB_AIRCR_SYSRESETREQ_Pos 2
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos)
__STATIC_INLINE void NVIC_SystemReset(void)
{
__DSB();
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk);
__DSB();
while(1);
}
此函数是软件复位单片机,位于core_cm0.h文件中,我们可以直接拿来用。只要在头文件中包含lpc11xx.h文件即可。
此函数用到了指令DSB指令和AIRCR寄存器。
DSB指令:数据同步隔离指令,用来等待之前的所有指令完成。
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk);
结合寄存器定义,可以看出,该函数第8行是在给bit31:16写0x05FA,然后给bit2位写1。
第10行等待复位。
关键字:lpc1114 看门狗 中断
引用地址:
lpc1114看门狗_中断
推荐阅读最新更新时间:2024-03-16 15:24
51单片机产生串口中断的方式
首先,你要用软件允许中断, 即C语言中EA = 1; 允许总中断ES = 1; //允许串口中断汇编中可用 SETB EA ;允许总中断 SETB ES ;允许串口中断 当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。 当然,单片机发送完一帧数据,TI也会置1,同样会产生中断! 一般我们在发送数据时要关中断,因为一般你不用在发送时不用处理数据;接收数据时要开中断,以便你在中断服务程序中将接收到的数据进行存储并处理。 补充:其实,不管你有没有允许中断,上位机(此时即给单片机发送信息的机器)只要给单片机发送数据,单片机就会自动接收数据,并把它放在
[单片机]
单片机C语言程序设计:外部 INT0 中断控制 LED
/* 名称:外部 INT0 中断控制 LED 说明:每次按键都会触发 INT0 中 断,中断发生时将 LED 状态取反,产 生 LED 状态由按键控制的效果 */ #include reg51.h #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; //主程序 void main() { LED=1; EA=1; EX0=1; IT0=1; while(1); } //INT0 中断函数 void EX_INT0() interrupt 0 { LED=~LED; LED 亮灭 }
[单片机]
STM8S类型单片机UART一直进入接收中断问题解决方案
问题描述: 在一个项目中,下位机使用的是STM8S003F3为主芯片。在使用RS485进行与上位机通信时,会一直进入接收中断,根本未接收到上位机的正确数据。 解决过程: 一开始以为是485芯片R0引脚未上拉的缘故导致这个问题,经过将此引脚通过MCU内部上拉,问题得到缓解。程序工作也稳定了,运行了一周也没问题,所以一直以为问题解决了,结果在实地安装后,没过多久又出现了这个问题,按理说,如果是外部电磁干扰,应该是偶发,也不应该出现了就不会好起来,干扰源不可能一直都在。然后又是一个头疼的事啊。。继续找答案解决。 这时又跑去官网下载了stm8s类芯片的应用手册,重点就是它了。 原来stm8s类型芯片的UART使用时在接
[单片机]
ARM嵌入式系统的中断服务例程跳转
在32位ARM系统中,一般都是在中断向量表中放置一条分支指令或PC寄存器加载指令,实现程序跳转到中断服务例程的功能。 例如: IRQEntry B HandleIRQ ;跳转范围较小 B HandleFIQ 或IRQEntry LDR PC,=HandleIRQ ;跳转的范围是任意32位地址空间 LDR PC,=HandleFIQ LDR伪指令等效生成1条存储读取指令和1条32位常数定义指令。32位常数存储在LDR指令附近的存储单元中,相对偏移小于4KB。该32位数据就是要跳转到的中断服务程序入口地址。 之所以使用LDR伪指令,是因为ARM的RISC指令为单字指令,不能装载32位的立即数(常数),无法直接把一个32位常数数据或
[单片机]
关于STM32利用硬件仿真串口中断处理函数应注意的问题
我们在利用jlink或其他仿真器对串口中断处理函数的数据接收进行仿真时,如果在中断函数中设置了断点,我们向串口发送数据端会采用逐个字节发送而不能采用一次性发送多个字节,当然从广义上来讲,你一次发那么多字节我在断点处程序已经停止了再运行肯定你的数据我会丢失啊,所以需要逐个字节发送这是可以理解的。而我这里讲的是如果你一次发送多个字节将会导致什么后果的问题. 假设1:假如你的断点设置在res = USART_ReceiveData(USART1)之后,以下面发送的这串字符为例,那么实际上当你停到断点处看到接收到fe时由于DR寄存器之前已经清空,实际上01已经存到DR中了,这时你运行会再次运行到这个断点,即受到了fe 和01两
[单片机]
系统分析S3C2410的中断处理
S3C2410 中断 在介绍2410的中断处理之前,我们不得不先看看先把ARM的异常向量表(ExcepTIon Vectors),下面对异常向量表(ExcepTIon Vectors),做一个简单的介绍: ARM的异常向量表一般存放在0x00000000处,ARM920T能处理有7个异常,他们分别是:Reset,Undefined instrucTIon,Software Interrupt,Abort (prefetch),Abort (data),IRQ,FIQ 下面是系统源码片段: _start: b Handle_Reset b HandleUndef b HandleSWI b HandlePrefetchAbort
[单片机]
STM32 中断优先级以及全局允许和禁止
请问例程上为什么要把串口中断优先级设置在NVIC中断分组2 NVIC: M3内核允许8bit做优先级分组设置,而STM32只有4bit可以设置。 AIRCR寄存器的4个位的分组方式如下: 第0组:所有4位用于指定响应优先级 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级 第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级 第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级 第4组:所有4位用于指定抢占式优先级 例:定义为第二组,抢占式优先级2bit,响应式优先级2bit,2bit共可有4种状态,也就是总共能设置4*4=16个中断优先级。 定义为第三组
[单片机]
在ARM处理器上移植uCOS II的中断处理
uCOS II是一个源码公开、可移植、可固化、可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写。总量约200行的汇编语言部分被压缩到最低限度,以便于移植到任何一种其它的CPU上。 uCOS II最多可支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持Semaphore (信号量)、Mailbox (邮箱)、MessageQueue(消息队列)等多种常用的进程间通信机制。与大多商用RTOS不同的是,uCOS II公开所有的源代码.并可以免费获得,只对商业应用收取少量License费用。 uCOS II移植跟OS_CUP_C.C、OS_CPU_A.
[单片机]