ARM:嵌入式系统之WDT中断实验

WDT中断实验

提示:几乎每种处理器都支持特定的异常处理,中断也是异常的一种。


提示:本次实验我们需要做的是一个关于WDT中断实验,由于我缺少相关理论部分,就对理论不展开过多的解释。
ARM:嵌入式系统之WDT中断实验_第1张图片

文章目录

  • WDT中断实验
  • 前言
  • 一、中断
  • 二、WDT中断实验
    • 1.WDT是什么
    • 2、对上图的理解
  • 三、实验代码
  • 总结


前言

本次是实验是关于WDT的中断实验。


提示:以下是本篇文章正文内容,仅供参考。

一、中断

1、什么是 中断?

在处理器中,中断是一个过程,即CPU在正常执行程序的过程中,遇到 外部 / 内部 的紧急事件需要处理,暂时中断(中止)当前程序的执行,而转去为事件服务,待服务完毕,再返回暂停处(断点)执行原来的程序

2、什么是 中断源?

在处理器中,可以引起中断的信号叫做中断源。

3、中断的种类?

ARM处理器中有7种类型的异常,按照优先级的顺序,从高到低的顺序依次是:
复位异常(Reset)
数据异常(Data Abort)
快速中断异常(FIQ)
外部中断异常(IRQ)
预取异常(Prefetch Abort)
软件中断(SWI)
未定义指令异常(Undefined Instruction)

异常类型 处理器模式 运行低地址 执行高地址
复位异常 特权模式 0x00000000 0xffff0000
未定义指令异常 未定义指令中止模式 0x00000004 0xffff0004
软中断异常 特权模式 0x00000008 0xffff0008
预取异常 指令访问中止模式 0x0000000c 0xffff000c
数据异常 数据访问中止模式 0x00000010 0xffff0010
外部中断异常 外部中断请求模式 0x00000018 0xffff0018
快速中断异常 快速中断请求模式 0x0000001c 0xffff001c

4、中断和异常的区别?

异常是从处理器被动接受异常的角度出发。
而中断具有主动向处理器申请的色彩。

二、WDT中断实验

1.WDT是什么

看门狗,又叫 WatchDog Timer(缩写WDT),是一个定时器电路,一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就回给出一个复位信号到MCU,是MCU复位防止MCU死机。

看门狗的作用就是防止程序发生死循环,或者说程序跑飞

工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。

硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。

ARM:嵌入式系统之WDT中断实验_第2张图片

2、对上图的理解

1、WTCON[0]
Reset enable / disable,复位信号使能端,1可以复位,0不可以复位。

2、WTCON[2]
Interrupt Generation,中断信息使能端,0禁止中断,1可以中断。

3、WTCON[4:3]
Clock Select,分频器。控制时钟频率,两位来控制分频比例。

WTCON[4:3] 分频比例
00 16
01 32
10 64
11 128

4、WTCON[15:8]
Prescaler value, 预分频器选择,分频器范围在   2 8 − 1 \ 2^8-1  281但实际值要+1,因为是从0开始的。

5、PCLK
默认66 mHZ。

6、WTDAT
WTDAT寄存器存储了一个固定值,每次执行完中断,重新赋值给WTCNT。

7、WTCNT
WTCNT的中断时间,每个时钟周期-1,直到减到0,又会重新从WTDAT中获取值。

三、实验代码

题目:

1、查看用户手册,编写c程序1c.c,用c编写子程序vic0_init, 完成vic0第27号中断的初始化,子程序 wdt_init,完成wdt初始化,使得wdt每隔1秒发生中断一次,子程序clear_int清除wdt和vic中断,子程序led_init完成初始化led,led_on( char on)完成根据参数on的值控制led灯的亮灭(相应位为1点亮,0熄灭)。在汇编文件1s.S中编写子程序cpu_int_on,使能cpu中断(或直接在C中使用内联汇编)。中断处理子程序isr(c或汇编),调用led_on函数使4个led灯交替点亮和熄灭。在1c.c中编写主程序_start,分别调用上述子程序,使得wdt每秒发生一次中断,用来控制led灯交替点亮和熄灭。
代码如下(示例):

答案

ARM:嵌入式系统之WDT中断实验_第3张图片
ARM:嵌入式系统之WDT中断实验_第4张图片
ARM:嵌入式系统之WDT中断实验_第5张图片
ARM:嵌入式系统之WDT中断实验_第6张图片
ARM:嵌入式系统之WDT中断实验_第7张图片
ARM:嵌入式系统之WDT中断实验_第8张图片
ARM:嵌入式系统之WDT中断实验_第9张图片
ARM:嵌入式系统之WDT中断实验_第10张图片
在这里插入图片描述
在这里插入图片描述
实验代码:

//led
#define gpj2con	*((volatile unsigned*)0xe0200280)
#define gpj2dat *((volatile unsigned*)0xe0200284)

// wtchdog
#define  wtd_con 	*(unsigned*)0xe2700000
#define  wtd_dat 	*(unsigned*)0xe2700004
#define  wtd_cnt 	*(unsigned*)0xe2700008
#define  wtd_int_clr 	*(unsigned*)0xe270000c

//vic0int
#define vic0_int_select	*(unsigned*)0xf200000c	
#define vic0_int_enable	*(unsigned*)0xf2000010	
#define vic0_addr27	*(unsigned*)0xf200016c	//0xf2000100+27*4=0xf200016c
#define vic0_vectaddress	*(unsigned*)0xf2000f00
#define vic1_vectaddress	*(unsigned*)0xf2100f00
#define vic2_vectaddress	*(unsigned*)0xf2200f00
#define vic3_vectaddress	*(unsigned*)0xf2300f00
void wtd_init(void );
void vic0_init( void );
void cpu_int_on( void );

void led_init( void);
void led( char );
void clear_int(void);
void __attribute__((interrupt)) isr(void);
char on=0xf;
void _start(void )
{
	led_init();
	vic0_init();
	wtd_init();
	cpu_int_on();
}

void wtd_init( void )
{
	//clock wtdcon:[3:4]=0x3  [8:15]=0xff    ==>4028HZ
	
	wtd_con=wtd_con|(0x3<<3)|(0xff<<8);
	//wtd_nt[0:15]=wtddat[0:15]=4028
	wtd_cnt	=	4028;
	wtd_dat	=	4028;



	//wtdcon [0]=0 [2]=1
	wtd_con	=	wtd_con&~0x1|(0x1<<2);

	//start
	wtd_con	=	wtd_con|(0x1<<5);
}

void vic0_init(void)
{
	//vic0intselect[27]=0  vic0intenable[27]=1 vic0vectaddr27;
	vic0_int_select	=	vic0_int_select & ~(0x1<<27);  //IRQ
	vic0_int_enable	=	vic0_int_enable | (0x1<<27);
	vic0_addr27	=	isr;
}



void led_init( void )
{
	gpj2con		=	gpj2con & ~0xffff | 0x1111;
	led(0x0);
}
void led( char on)
{
	gpj2dat		=	gpj2dat & ~0xf | ~on;
	
}

void __attribute__((interrupt)) isr(void)
{
	led(on);
	on	=	on^0xf;
	clear_int();
}

void cpu_int_on(void)
{
	__asm__ __volatile__(
	"mrs r0,cpsr\n"
	"bic r0,r0,#0x80\n"
	"msr cpsr,r0\n"
	:
	:
	);

}

void clear_int(void)
{
	vic0_vectaddress	=	0x0;
	vic1_vectaddress	=	0x0;
	vic2_vectaddress	=	0x0;
	vic3_vectaddress	=	0x0;
	wtd_int_clr		=	0x0;	
}

以上就是本次WDT中断实验的过程!


总结

WDT中断实验很有意思,永远滴神!
ARM:嵌入式系统之WDT中断实验_第11张图片

你可能感兴趣的:(嵌入式系统,嵌入式)