热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

WDT中断实验提示:几乎每种处理器都支持特定的异常处理,中断也是异常的一种。提示:本次实验我们需要做的是一个关于WDT中断实验,由于我缺少相关理论部分,就对理论不展开过多的解释。文
WDT中断实验

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

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

文章目录

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

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

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

一、中断

1、什么是 中断?

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

2、什么是 中断源?

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

3、中断的种类?

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

异常类型处理器模式运行低地址执行高地址
复位异常特权模式0x000000000xffff0000
未定义指令异常未定义指令中止模式0x000000040xffff0004
软中断异常特权模式0x000000080xffff0008
预取异常指令访问中止模式0x0000000c0xffff000c
数据异常数据访问中止模式0x000000100xffff0010
外部中断异常外部中断请求模式0x000000180xffff0018
快速中断异常快速中断请求模式0x0000001c0xffff001c

4、中断和异常的区别?

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

二、WDT中断实验

1.WDT是什么

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

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

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

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

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

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]分频比例
0016
0132
1064
11128

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中断实验》
《ARM:嵌入式系统之WDT中断实验》
《ARM:嵌入式系统之WDT中断实验》
《ARM:嵌入式系统之WDT中断实验》
《ARM:嵌入式系统之WDT中断实验》
《ARM:嵌入式系统之WDT中断实验》
《ARM:嵌入式系统之WDT中断实验》
《ARM:嵌入式系统之WDT中断实验》
《ARM:嵌入式系统之WDT中断实验》
《ARM:嵌入式系统之WDT中断实验》
实验代码:

//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中断实验》


推荐阅读
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 离线安装Grafana Cloudera Manager插件并监控CDH集群
    本文详细介绍如何离线安装Cloudera Manager (CM) 插件,并通过Grafana监控CDH集群的健康状况和资源使用情况。该插件利用CM提供的API接口进行数据获取和展示。 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 对于许多初学者而言,遇到总线错误(bus error)或段错误(segmentation fault/core dump)是极其令人困扰的。本文详细探讨了这两种错误的成因、表现形式及解决方法,并提供了实用的调试技巧。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文详细对比了Windows 7家庭高级版与旗舰版之间的主要区别,包括技术支持期限、硬件兼容性及特色功能等方面。 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 本文详细介绍如何使用 Apache Spark 执行基本任务,包括启动 Spark Shell、运行示例程序以及编写简单的 WordCount 程序。同时提供了参数配置的注意事项和优化建议。 ... [详细]
author-avatar
龙马精神202502912663
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有