嵌入式外部中断实验报告(嵌入式外部中断实验报告心得体会)

http://www.itjxue.com  2023-02-15 10:41  来源:未知  点击次数: 

在嵌入式学习,中断实验LED1,LED2,LED3循环点亮五秒,我用的是mdelay(500

#inlcude reg51.h

sbit LED1 = P1^0; // LED 高电平亮

sbit LED2 = P1^1;

sbit LED3 = P1^2;

sbit KEY1 = P2^0;//按键低电平有效

sbit KEY2 = P2^1;

sbit KEY3 = P2^2;

sbit KEY4 = P2^3;

char KEY1_T,KEY2_T,KEY3_T,KEY4_T;

void main()

{

while(1)

{

if ( (KEY1 == 0)(KEY1_T == 0) ){LED1 = 1;LED2 = 1;LED3 = 1;KEY1_T = 1;} //总控开

else if ( (KEY1 == 0)(KEY1_T == 1) ){LED1 = 0;LED2 = 0;LED3 = 0;KEY1_T = 0;} //总控关

if ( (KEY2 == 0)(KEY2_T == 0) ){LED1 = 1;KEY2_T = 1;} //LED1 开

else if ( (KEY2 == 0)(KEY2_T == 1) ){LED1 = 0;KEY2_T = 0;} //LED1 关

if ( (KEY3 == 0)(KEY3_T == 0) ){LED2 = 1;KEY3_T = 1;} //LED2 开

else if ( (KEY3 == 0)(KEY3_T == 1) ){LED2 = 0;KEY3_T = 0;} //LED2关

if ( (KEY4 == 0)(KEY4_T == 0) ){LED3 = 1;KEY4_T = 1;} //LED3 开

else if ( (KEY4 == 0)(KEY4_T == 1) ){LED3 = 0;KEY4_T = 0;} //LED3关

}

}

自己在弄一下按键!

嵌入式实验报告可以申请论文发表吗

可以申请论文发表的。嵌入式实验报告可以申请论文发表,在发表论文之前,需要做大量的研究工作,确保报告能够满足发表论文的要求,包括收集有关主题的相关素材、参考文献的分析、数据的收集和处理、逻辑性的分析以及确立正确的结论。嵌入式实验报告是指通过对嵌入式系统中的软件和硬件进行测试,研究与分析而撰写的一种报告类型,嵌入式实验报告常常涵盖实验成果的统计数据,以及实验中出现的问题和解决方案。

嵌入式系统中实验部分,关于外部中断实验,能实现哪些功能?

1 SUBSRCPND和SRCPND表明有哪些中断被触发了 INTSUMMSK和INTMSK寄存器用于屏蔽某些中断2 中断触发→SUBSRCPND相应位置1→INTSUBMSK未屏蔽→SRCPND相应位置1→ ↑ 中断触发→若是FIQ中断:INTMOD相应位置1(同一时间,只能有一位置1)→INTMSK未屏蔽→INTPND相应位置1(同一时间,只能有一位置1)3 读取INTPND或INTOFFSET可以确定中断源4 清除中断的顺序:SUBSRCPND(相应位写1)→SRCPND(相应位写1)→INTPND5 自己觉得重要的几步:将相应引脚的功能设置为“外部中断”,设置中断触发条件,开启外设自己的屏蔽寄存器(若有)→INTSUBMSK中相应位设为0→FIQ:INTMOD相应位设为1 →IRQ:PRIORITY设置优先级→IRQ:INTMSK相应位设为0→CPSR中的I和F位设为0,使能IRQ或FIQ6 中断控制寄存器(1)SUBSRCPND中几位若有一位置位,且未被INTSUBMSK屏蔽,则SRCPND中相应有一位置1(多对1的关系)(2)INTMOD中设为1的为快速中断,设为0的为普通中断(3)PRIORITY:中断优先级仲裁器6个输入引脚;PRIORITY中三位控制一个中断优先级仲裁器(总共7个),一位为ARB_MODE(仲裁器工作模式位),两位用于控制输入信号的优先级具体哪位对应哪位:请查看S3C2440官方手册,上面写的很详细(4)INTOFFSET:INTPND寄存器位[x]置1时,INTOFFSET寄存器的值为x,在清除SRCPND、INTPND时,INTOFFSET自动清除7 外部中断实验:(实验用板:mini2440,是S3C2440的处理器,再参照原理图即可作相应调整)完整代码:int.tar.gz(1)head.S@******************************************************************************@ File:head.S@ 功能:初始化,设置中断模式、系统模式的栈,设置好中断处理函数@****************************************************************************** .extern main @引用其它文件中的mian标号.text .global _start _start:@****************************************************************************** @ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用@****************************************************************************** b Reset @ 0x04: 未定义指令中止模式的向量地址HandleUndef: b HandleUndef @ 0x08: 管理模式的向量地址,通过SWI指令进入此模式HandleSWI: b HandleSWI @ 0x0c: 指令预取终止导致的异常的向量地址HandlePrefetchAbort: b HandlePrefetchAbort @ 0x10: 数据访问终止导致的异常的向量地址HandleDataAbort: b HandleDataAbort @ 0x14: 保留HandleNotUsed: b HandleNotUsed @ 0x18: 中断模式的向量地址 b HandleIRQ @ 0x1c: 快中断模式的向量地址HandleFIQ: b HandleFIQ Reset: ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈 bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启 msr cpsr_c, #0xd2 @ 进入中断模式 ldr sp, =3072 @ 设置中断模式栈指针 msr cpsr_c, #0xdf @ 进入系统模式 ldr sp, =4096 @ 设置系统模式栈指针, @ 其实复位之后,CPU就处于系统模式, @ 前面的“ldr sp, =4096”完成同样的功能,此句可省略 bl init_led @ 初始化LED的GPIO管脚 bl init_irq @ 调用中断初始化函数,在init.c中 msr cpsr_c, #0x5f @ 设置I-bit=0,开IRQ中断 ldr lr, =halt_loop @ 设置返回地址 ldr pc, =main @ 调用main函数halt_loop: b halt_loop HandleIRQ: sub lr, lr, #4 @ 计算返回地址 stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器 @ 注意,此时的sp是中断模式的sp @ 初始值是上面设置的3072 ldr lr, =int_return @ 设置调用ISR即EINT_Handle函数后的返回地址 ldr pc, =EINT_Handle @ 调用中断服务函数,在interrupt.c中int_return: ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr (2)init.c/* * init.c: 进行一些初始化 */ #include "s3c24xx.h" /* * LED1-4对应GPB5、GPB6、GPB7、GPB8 */#define GPB5_out (1(5*2)) // LED1#define GPB6_out (1(6*2)) // LED2#define GPB7_out (1(7*2)) // LED3#define GPB8_out (1(8*2)) // LED4 /* * K1-K4对应GPG0、GPG3、GPG5、GPG6 */#define GPG0_eint (20) // K1,EINT8#define GPG3_eint (2(3*2)) // K2,EINT11#define GPG5_eint (2(5*2)) // K3,EINT13#define GPG6_eint (2(6*2)) // K4,EINT14 /* * 关闭WATCHDOG,否则CPU会不断重启 */void disable_watch_dog(void){ WTCON = 0; // 关闭WATCHDOG很简单,往这个寄存器写0即可} void init_led(void){ GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;} /* * 初始化GPIO引脚为外部中断 * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD) */ void init_irq( ){ GPGCON = GPG0_eint | GPG3_eint |GPG5_eint | GPG6_eint; //使能EINT8 EINT11 EINT13 EINT14 EINTMASK=(~(18)) (~(111)) (~(113)) (~(114)); //EINT8 EINT11 EINT13 EINT14中断优先级一样,无需设置 // EINT8、EINT11、EINT13、EINT14使能 INTMSK =(~(15));}(3)interrupt.c#include "s3c24xx.h" void EINT_Handle(){ unsigned long oft = INTOFFSET; unsigned long val; if( oft==5) { GPBDAT |= (0x0f5); // 所有LED熄灭 // 需要进一步判断是K1还是K2,或是K1、K2被同时按下 val = EINTPEND; if (val (18)) GPBDAT = ~(15); // K1被按下,LED1点亮 if (val (111)) GPBDAT = ~(16); // K2被按下,LED2点亮 if (val (113)) GPBDAT = ~(17); // K3被按下,LED3点亮 if (val (114)) GPBDAT = ~(18); // K4被按下,LED4点亮 } //清中断 if( oft == 5 ) EINTPEND = (18) | (111)| (113)| (114); // EINT8_23合用IRQ5 SRCPND = 1oft; INTPND = 1oft;}

嵌入式之单片机(四):单片机外部中断

姓名:郝津锐??? 学号:19020100179??? 学院:电子工程学院

转自:

【嵌牛导读】本文探讨了单片机中的外部中断原理与常见方式

【嵌牛鼻子】单片机外部中断

【嵌牛提问】单片机的外部中断是什么,有什么作用

【嵌牛正文】

单片机在自主运行时一般是在执行一个死循环程序,在没有外界干预(输入信号)时它基本处于一个封闭状态,例如电子时钟会按时、分、秒的规律自主运行并通过输出设备把时间显示出来。在不需要对它进行调校时它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电或时钟需要重新校准.甚至时钟被带到不同时区的时候,就需要重新对时钟进行调校,这时就要求时钟必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统.它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原因。

要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置两个触发寄存器,同时在中断屏蔽寄存器的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置l。在挂起寄存器的对应位写1,将清除该中断请求。如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置两个触发寄存器,同时在事件屏蔽寄存器的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。

STC89C5X系列单片机提供了4个外部中断:外部中断O(INTO)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)。

51单片机的外部中断有两种模式:电平触发模式和跳变沿触发模式

当选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断;当选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。

这两者之间的区别在于电平触发模式时,中断标志寄存器不锁存电平中断请求信号,单片机把每个周期的S5P2采样外部中断口的电平逻辑直接赋值到中断标志寄存器,标志寄存器对于请求信号来说是透明的,这样当中断请求被阻塞而没有得到及时响应时,将被丢失。

换言之,就是要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止。因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样。同样,当CPU在执行不可被中断的指令(如RETI)时,产生的电平触发中断如果时间太短,也得不到执行。

而使用边沿触发方式时,中断标志寄存器锁存了中断请求。中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。

因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。在该中断退出后,将被响应执行。如果你不希望这样,必须在中断退出之前,手工清除外部中断标志。

(责任编辑:IT教学网)

更多

相关PHP教程文章