单片机响应中断请求时,通常会通过中断向量表(Interrupt Vector Table)来找到相应的中断服务程序。中断向量表是一个存储中断服务程序入口地址的表格,每个中断请求都会分配一个唯一的中断向量号,当中断请求到达时,单片机会查找中断向量表,根据中断向量号找到对应的中断服务程序入口地址,并跳转到该地址开始执行中断服务程序。
定义中断需要考虑以下几个方面:
中断源:需要定义哪些事件可以触发中断请求,例如外部硬件信号、定时器、串口接收等。
中断优先级:如果多个中断请求同时到达,需要确定哪个中断请求具有更高的优先级。
中断服务程序:中断服务程序是具体执行中断处理 *** 作的程序,需要编写相应的中断服务程序。
中断控制寄存器:单片机中通常有一个或多个中断控制寄存器,用于控制中断的使能和禁止,以及中断请求的标志位清除等 *** 作。
在定义中断时,需要根据具体的单片机型号和开发环境,参考相应的单片机手册和编程手册进行定义。
61是神马?51单片机?
格式:void 函数名()interrupt 中断号 using 工作组
{
中断服务程序内容
}
注意:中断不能返回任何值,所以前面是 void 后面是函数名,名字可以自己起,但不要与c语言的关键字相同;中断函数不带任何参数,所以 函数名后面的 () 内是 空的,中断号是指单片机的几个中断源的序号。这个序号是单片机识别不同中断的唯一标志。所以一定要写正确。
后面的using 工作组 是指这个这个中断使用单片机内存中 4 个工作寄存器的哪一组, c51 编译后会自动分配工作组,因此最后这句话我们通常省略不写。 c51 中断写法实例void T1-time() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
上面的意思是定时器 1 的中断服务程序,定时器 1 的中断服务序号是 3 ,因此我们要写成 interrupt 3 ,服务程序的内容是给 两个初值寄存器装入新值。。
写中断前的准备 1 TMOD 赋值 确定工作方式。T0 还是T1 的工作方式。
2 计算初值 装入 TH0 TL0 或者 TH1 TL1
3 中断方式时 ,对 IE 赋值,开放中断。
4 使 TR0 和 TR1 置位,启动定时器/计数器 定时/计数。
格式是固定的
void
中断名(void)
interrupt
n
这个中断名你可以随意取只要不是保留字就可以
n=0对应外部中断0
n=1对应定时器0
n=2对应外部中断1
n=3对应定时器1
n=4对应串口
比如定时器0中断服务程序
void
isr_timer0()
interrupt
1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P0=~P0;
}
1)该程序每隔多少时间执行一次检测程序?是怎样安排达到的?
(2)定/计 0 及定/计 1 各在什么情况下溢出?列出您的计算。
(3)为程序作出注释。
0000H LJMP 0030H
;主程序
ORG 0030H
START: CLP T1
MOV TMOD,#51H
MOV IE,#8AH
MOV TH0,#0D8H
MOV TL0,#0F0H
MOV TH1,#0E8H
MOV TL1,#90H
SETB TB0
SETB TR1
…
…
;中断服务程序
ORG 000BH
LJMP 0080H
ORG 0080H
T0OV: SETB T1
MOV TH0,#0DBH
MOV TL0,#0F0H
CLR T1
RETI
ORG 001BH
LJMP 0090H
ORG 0090H
T1OV: MOV TH1,#0E8H
MOV TL1,#90H
…
…
;此起为检测程序
RETI
答案:
你这个程序里面好像有错误吧,CLP T1 什么意思?SETB TB0 什么意思?是不是抄错了?
不过,我看你程序的意思,可能是这样:
ORG 0000H
LJMP START
ORG 0030H
; 主程序
START: SETB P35 ;将P35置1
MOV TMOD,#51H ;设置T0为定时方式,T1为计数方式,都为模式1(16位定时/计数器)
MOV IE,#8AH ;允许中断,允许T0、T1中断
MOV TH0,#0D8H ;设置T0、T1定时和计数初值
MOV TL0,#0F0H
MOV TH1,#0E8H
MOV TL1,#90H
SETB TR0 ;启动T0、T1
SETB TR1
…
…
;中断服务程序
ORG 000BH ;T0溢出中断入口
LJMP T0OV
ORG 0080H
T0OV:
CLR P35 ;将P35清零,产生一个负跳变,T1计数器加1
MOV TH0,#0D8H ;重新载入T0定时初值
MOV TL0,#0F0H
SETB P35 ;恢复P35高电平
RETI ;中断返回
ORG 001BH ;T1溢出中断入口
LJMP T1OV
ORG 0090H
T1OV:
MOV TH1,#0E8H ;重新载入T1计数初值
MOV TL1,#90H
…
…
;此起为检测程序
RETI
需要说明的是:
fosc=12MHz,则一个机器周期=12/fosc=1(us)
T0工作在定时器方式下,每过1个机器周期定时器加1;T1工作在计数器模式下,当T1引脚即P35由1变0时计数器T1加1。
T0的定时初值为0D8F0H,所以定时时间为1us(2^16-0D8F0H)=10ms,每过10ms,T0溢出中断;T1的计数初值为0E890H,所以当T1引脚(P35)负跳变(2^16-0E890H)=6000次的时候,T1溢出中断。
察看整个程序可以得出结论:每当T0溢出中断一次(10ms),T1就计数1次,当T1计数6000次的时候,T1中断执行检测程序,也就是说,每隔10ms6000=1分钟执行一次检测程序。
请参考~~
声明:本试题内容来源于网络投稿,仅做交流使用,侵权必删,举报请发送邮件到
1、中断请求:中断事件一旦发生或者中断条件一旦构成,中断源提交“申请报告”,与请求CPU暂时放下目前的工作而转为中断源作为专项服务
2、中断屏蔽:虽然中断源提交了“申请报告”,但是,是否得到CPU的响应,还要取决于“申请报告”是否能够通过2道或者3道“关卡”(中断屏蔽)送达CPU(相应的中断屏蔽位等于1,为关卡放行;反之相应的中断屏蔽位等于0,为关卡禁止通行);
3、中断响应:如果一路放行,则CPU响应中断后,将被打断的工作断点记录下来(把断点地址保护到堆栈),挂起“不再受理其他申请报告牌”(清除全局中断标志位GIE=0),跳转到中断服务子程序
4、保护现场:在处理新任务时可能破坏原有的工作现场,所以需要对工作现场和工作环境进行适当保护;
5、调查中断源:检查“申请报告”是由哪个中断源提交的,以便作出有针对性的服务;
6、中断处理:开始对查明的中断源进行有针对性的中断服务;
7、清除标志:在处理完毕相应的任务之后,需要进行撤消登记(清除中断标志),以避免造成重复响应;
8、恢复现场:恢复前面曾经被保护起来的工作现场,以便继续执行被中断的工作;
9、中断返回:将被打断的工作断点找回来(从堆栈中恢复断点地址),并摘下“不再受理其他申请报告牌”(GIE=1),继续执行原先被打断的工作。
ARM中的异常中断是如何实现进入中断程序的,比如如何进入
swi(0x00) void SwiHandle1(int Handle);其实没有函数体,执行这个语句后就自动把Handle的值赋给了R0,接着执行下面的代码。__swi(0x00)是软件中断,0为软中断指令中的24位立即数,但是通过R0寄存器来传递参数具体的函数体,当然是要在swi的中断处理程序中去找了可以在复位时的异常向量表里面找到swi中断服务程序的入口地址。
SWI 执行的流程是,先进入异常中断向量表,然后跳到向量地址处,接着一小段汇编 *** 作,把功能号读入到一个寄存器中,然后 switch 判断这个功能号是多少,接着跳转到对应的终端服务程序,如果函数有参数,则根据ATPCS规则进行参数的传递;如只有一个参数,则用 R0 来传递,超过4个参数,超出的部分用堆栈来传递。
__swi是ADS编译器的关键字,用它做前缀可以声明一个软中断调用,格式为:
__swi(功能号) 返回值 名称 (参数列表)
功能号:即软中断指令中的24位立即数,软中断号
名 称:即调用软中断时用于描述软中断的函数名称
参 数:软中断函数的参数,根据ATPCS规则,如果软中断函数有不超过4个参数时,通过R0~R3传递,超过4个参数时用堆栈来传递。
__swi(0x00) void SwiHandle1(int Handle)。其中0x00为软中断功能号(软中断号);软中断函数名称为SwiHandle1;只有一个参数,则使用R0来传递;函数没有返回值。紧接着这句代码的是定义了4个宏,分别表示禁能IRQ函数、使能IRQ函数、禁能FIQ函数、使能IFQ函数,其实调用的软中断函数是一样的,只是参数不同而已。例如在用户程序中调用“IRQEnable( );”时,处理器会产生软中断。位于启动代码中的那些是软中断处理函数,当发生软中断时,PC被强制指向0x00000008,这个地址中存放的是软中断异常的处理函数的地址,所以程序会跳转至标号“SoftwareInterrupt ”处执行。SoftwareInterrupt 函数的功能是判断R0的值(R0的值为软中断函数传递过来的参数)是否小于4,如果小于4则跳转至标号“SwiFunction”执行,如果不是则函数返回。SwiFunction函数是一个散转函数,它的功能是根据R0的值跳转至对应的函数处执行,即如果参数为1,则函数会跳转至IRQEnable处执行,将IRQ中断使能。
本文件SWIs位于ARM Executable Image for LPC2294工程模板中,故不考虑SWI触发前为Thumb态;SWI异常一旦触发,内核硬件完成:
♂ 进入Supervisor模式;
♂ 拷贝CPSR至SPSR_svc
♂ 拷贝异常返回地址至LR_svc
♂ 将0x00000008装入PC
因此,当触发SWI软中断前内核处于Supervisor模式,SPSR_svc、LR_svc中的值将被破坏;
3、SWI指令编码中自带24bit数据作为软中断号(swi_num),因此可通过取SWI指令编码获取软中断号;LDR r0,[lr,#-4]就是这样;
4、SWI_Exception_Function函数一般采用C编码(也可汇编),采用C编码可直接套用switch根据swi_nun软中断号切换,SWI_Exception_Function函数的编制是灵活的,比如可以为带参或不带参函数;
5、一个SWI调用允许带1~4个字型参数和1~4个字型返回值,触发SWI调用时四个参数依次保存在R0~R3中,返回值也
以上就是关于单片机响应中断请求,是根据什么来找到相应中断服务程序的如何定义一个中断全部的内容,包括:单片机响应中断请求,是根据什么来找到相应中断服务程序的如何定义一个中断、谁会用C语言编写61的中断服务程序,举个列,格式是怎么样的。、单片机中断,写中断程序的格式是什么,是固定的么,程序是怎么执行的,能举个例子,说明白么,我很想搞懂等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)