ARM:嵌入式系统之WDT中断实验
WDT中断实验
提示:几乎每种处理器都支持特定的异常处理,中断也是异常的一种。
提示:本次实验我们需要做的是一个关于WDT中断实验,由于我缺少相关理论部分,就对理论不展开过多的解释。
文章目录
- 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指针不能回来。那么定时时间到后就会使单片机复位。
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, 预分频器选择,分频器范围在28−1\ 2^8-1 28−1,但实际值要+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灯交替点亮和熄灭。
代码如下(示例):
答案
实验代码:
//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 ==>4028HZwtd_con=wtd_con|(0x3<<3)|(0xff<<8);//wtd_nt[0:15]=wtddat[0:15]=4028wtd_cnt = 4028;wtd_dat = 4028;//wtdcon [0]=0 [2]=1wtd_con = wtd_con&~0x1|(0x1<<2);//startwtd_con = wtd_con|(0x1<<5);
}void vic0_init(void)
{//vic0intselect[27]=0 vic0intenable[27]=1 vic0vectaddr27;vic0_int_select = vic0_int_select & ~(0x1<<27); //IRQvic0_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中断实验相关推荐
- 网络上所谓的《ARM嵌入式系统入门最好的文章》
一 首先说说ARM的发展 可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程师职位. 广义的嵌入式无非几种:传统的什么51.AVR.PIC称做嵌入式微控制器:ARM是嵌入式微处理器 ...
- ARM嵌入式系统malloc的实现(C源码)
在ARM嵌入式系统实现malloc内存分配机制. 在ARM cpu上验证通过. ps:也可在pc ubuntu linux进行验证 #include "include/lib_replace ...
- 8、ARM嵌入式系统:UART初始化
一.UART概述 百度上UART的定义:通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART.它将要传输的资料在串行通信与并行 ...
- 7、ARM嵌入式系统:LCD/数码管/OLED初始化
一.LCD/数码管模块在板子上的位置 LCD和数码管在板子上都分别有一个插槽. 二.LCD/数码管初始化代码 //SMG init void SMG_Init() { /* PORTB and POR ...
- [ARM嵌入式系统开发]第一章之嵌入式系统的软硬件
本章的最后,通过描述ARM为核心的嵌入式系统,来介绍了嵌入式系统的软件和硬件构成和结构.这里根据这部分的介绍以及其他的文章,描述下通用的嵌入式系统的软件和硬件. 首先来说下硬件,书中说,包含有 ...
- 嵌入式:ARM嵌入式系统开发流程概述
文章目录 嵌入式开发的具体过程 开发流程图 嵌入式软件开发环境 交叉开发环境 远程调试结构图 嵌入式应用软件开发的基本流程 软件模拟环境 目标板与评估板 嵌入式软件开发的可移植性和可重用性 嵌入式开发 ...
- 移植tcpdump到ARM嵌入式系统
移植tcpdump到嵌入式系统 tcpdump和libpcap的下载链接:Home | TCPDUMP & LIBPCAP 百度网盘下载链接:https://pan.baidu.com/s/1 ...
- ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础
注:本文资料全部来源于网络或书籍,同时加上个人理解.若有侵权,告知即删.若有错误,留言商讨. 1.寄存器: 总共有37个寄存器,最多可以有17个活动寄存器(16个数据寄存器,2个状态寄存器:CPSR和 ...
- [ARM嵌入式系统开发]第一章之Dhrystone
在书的第一章开头部分,作者提到了"最成功的ARM内核之一ARM7TDMI,具有最高120 Dhrystone MIPS的性能.高的代码密度和低功耗等特性,使它成为移动嵌入式设备的最佳选择&q ...
最新文章
- mysql 选项_mysql常用选项
- OPPO和微软合作,开放“召唤小冰”
- 实验一 linux命令使用,实验一XXXXX常用linux命令的使用(一)
- vue----常用实例方法--$mount(),$destroy(),$watch(),$forceUpdate()
- 文巾解题 189. 旋转数组
- 爬虫工程师是干什么的?你真的知道了吗?
- 关于Direct2D
- Android之context相关类图
- “约见“面试官系列之各系列目录汇总(建议学习收藏)
- 在系统启动时至少有一个服务或驱动程序产生错误_Cassandra Java驱动程序
- 计算机桌面图标有小纸张,电脑桌面图标上都有个小图标,为什么
- fcm脑图像分割matlab,MATLAB程序:用FCM分割脑图像
- 11.python之线程,协程,进程,
- Navicat-数据库管理工具
- Kaggle酒推荐,winemag-data-130k-v2.csv
- 半导体器件物理【7】固体量子 —— 统计力学
- ai怎么渐变颜色_AI渐变工具怎么使用?AI渐变工具使用方法介绍
- UIPATH 调用SAP BAPI
- Docker 安装和部署
- 用swoole实现简单IM聊天室demo
热门文章
- 计算机考试重点题目与答案
- 【算法设计与分析】-- 分治法
- Spark大数据分析与实战:基于Spark MLlib 实现音乐推荐
- GScan:Linux Checklist自动化检测
- java-在IDEA中,如何在代码和注释之间自动添加空格?
- 华为云发布代码检查服务;微软向其美国雇员提供“无限制”休假时间;付费版 ChatGPT|极客头条
- npm安装慢 ,卡在sill idealTree buildDeps不动
- 单片机定时器中断倒计时c语言,我用定时器中断控制倒计时30秒。程序不报错,但是显示一直停在30..请问好友们,帮我看看问题出在哪里?...
- 期末前端web大作业:用DIV+CSS技术设计的动漫网站——火影忍者6页 带报告
- Java入门(四):进阶