单片机中断.docx
- 文档编号:9689757
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:17
- 大小:156.17KB
单片机中断.docx
《单片机中断.docx》由会员分享,可在线阅读,更多相关《单片机中断.docx(17页珍藏版)》请在冰点文库上搜索。
单片机中断
INT0------C&原理图
#include"../brd.h"
#include
/*外部中断0跳到这里*/
//当用到中断时必须有interrupt[?
],其他与不同的函数一样.
//其中[?
]为include里具体中断向量的名称
interrupt[EXT_INT0]voidext_int0(void){
//异或运算:
两者不同运算结果为1,相同为0
LED_RXD_L=LED_RXD_S^1; //LED亮灭转换
}
/*外部中断0初始化*/
voidinit_int0(void){
/* MCU控制寄存器-MCUCR */
// SE SM2 SM1 SM0 ISC11ISC10ISC01 ISC00
//读/写 R/W R/W R/W R/W R/W R/W R/W R/W
//初始值 0 0 0 0 0 0 0 0
// ISC11 ISC10说明
// 0 0 INT1为低电平时产生中断请求
// 0 1 INT1引脚上任意的逻辑电平变化都将引发中断
// 1 0 INT1的下降沿产生中断请求
// 1 1 INT1的上升沿产生中断请求
// ISC01 ISC00 说明
// 0 0 INT0为低电平时产生中断请求
// 0 1 INT0引脚上任意的逻辑电平变化都将引发中断
// 1 0 INT0的下降沿产生中断请求
// 1 1 INT0的上升沿产生中断请求
MCUCR=0B000000010;//置位ISC01,清零ISC00,使的外部中断0下降沿触发
/* 通用中断控制寄存器-GICR */
// INT1 INT0 – – – – IVSEL IVCE GICR
//读/写 R/W R/W R R R R R/W R/W
//初始值 0 0 0 0 0 0 0 0
// 1 0 0 0 0 0 0 0//使能外部中断1
// 0 1 0 0 0 0 0 0//使能外部中断0
GICR=0B01000000; //置位INT0,使能外部中断0
/*通用中断标志寄存器-GIFR*/
// INTF1 INTF0 – – – – – –
//读/写 R/W R/W R R R R R R
//初始值 0 0 0 0 0 0 0 0
//*Bit7–INTF1:
外部中断标志1
//INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。
如果SREG的位
//I以及GICR寄存器相应的中断使能位INT1为”1”,MCU即跳转到相应的中断向量。
进入中
//断服务程序之后该标志自动清零。
此外,标志位也可以通过写入”1”来清零。
//* Bit6–INTF0:
外部中断标志0
//INT0引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。
如果SREG的位
//I以及GICR寄存器相应的中断使能位INT0为”1”,MCU即跳转到相应的中断向量。
进入中
//断服务程序之后该标志自动清零。
此外,标志位也可以通过写入”1”来清零。
当INT0配
//置为电平中断时,该标志会被清零。
#asm("sei")//使能中断
}
/*initi/o*/
voidinit_io(void){
INT0_L=HIGH;
INT0_D=INPUT;
LED_RXD_L=LED_OFF;
LED_RXD_D=OUTPUT;
}
voidmain(void){
init_io();
init_int0(); //外部中断0初始化
while
(1); //不做任何事情,给中断做
二.中断系统
24102007-09-1713:
49:
04阅读3评论0字号:
大中小
二.中断系统
1.S3C2410有56个中断源
2.中断处理流程
1. 产生中断条件
①设置中断模式
②PSR寄存器的F和I位打开,为0
③中断屏蔽位打开,为0
④中断挂起寄存器的请求标志位为1
2. 使用中断通常需设置以下寄存器的值,前五个为必须。
注:
决定能否发生中断的寄存器,也就是说在没有发生中断已经设置的寄存器,不受中断后果的影响:
①PSR寄存器
②INTMASK寄存器 默认值为 0XFFFFFFFF
表明中断是否发生的寄存器
①SRCPND寄存器 默认值0X00000000
在中断服务程序中必须清“0”,通过向对应位写数据
②INTPND寄存器 默认值为0X00000000
在中断服务程序中必须清“0”,通过向对应位写“1”
SRCPND和INTPND的区别:
大体上可以这样理解:
S3C2410A支持56个中断源,由一些寄存器的32个位管理决定是否使能中断:
SRCPND、INTPND、INTMASK、INTMOD、PRIORITY。
①有中断源请求到达,SRCPND寄存器的对应位置为1,经过优先模块仲裁后INTPND寄存器的其中一位被置1,而且只能有一位置1,而SRCPND可允许多位
②若中断被屏蔽,尽管这样,SRCPND寄存器的相应位被置1,但不影响INTPND寄存器。
只要INTPND寄存器的相应位为1,且I-FLAGorF-FLAG位清0,就可以立即启动中断服务程序
③中断源的中断请求首先在SRCPND登记
④SRCPND寄存器不受中断控制器的优先逻辑所影响,INTPND受制于优先级控制。
3. 使用定时器1产生中断步骤
① 配置定时器寄存器:
rTCFG0――预份频值
rTCFG1――选择MUX的分割比例
rTCNTB1――设定计数值
rTCMPB1――设置占空比
定时器输入时钟频率=MCLK/{预分频值+1}/{除数值},也即1秒钟的计数值
②配置中断系统
pISR_TIMER1=(int)Timer1_ISR 赋中断服务程序的入口地址
rINTMSK&=~(BIT_TIMER1) 开中断
如:
/******************************************************************************
-函数名称:
voidTimer1_init(void)
-函数说明:
定时器初始化程序
-输入参数:
无
-输出参数:
无
******************************************************************************/
voidTimer1_init(void)
{
rGPGCON=rGPGCON&0xfff0ffff|0x00050000;//配置GPG口为信号输出
rGPGDAT=rGPGDAT|0x300;
rTCFG0 =255; //Prescaler0=255
rTCFG1 =0<<4; //
//rTCNTB1=48828; //在pclk=50MHZ下,1秒钟的记数值rTCNTB1=50000000/4/256=48828;
rTCNTB1=3;
rTCMPB1=0x00;
rTCON =(1<<11)|(1<<9)|(0<<8);//禁用定时器1,手动加载
rTCON =(1<<11)|(0<<9)|(1<<8);//启动定时器1,自动装载
}
/******************************************************************************
-函数名称:
voidTimer1INT_Init(void)
-函数说明:
定时器中断初始化程序
-输入参数:
无
-输出参数:
无
******************************************************************************/
voidTimer1INT_Init(void) //定时器接口使能
{
if((rINTPND&BIT_TIMER1))
{
rSRCPND|=BIT_TIMER1;
}
pISR_TIMER1=(int)Timer1_ISR;
rINTMSK &=~(BIT_TIMER1); //开中断;
}
6.对中断的实质理解
其实我对2410的中断没有真正理解的,我不清楚其中的执行流程,以下是我的部分理解(不一定正确的),写下让自己以后改正。
① 2410的向量中断:
中断产生后,CPU自动跳中断服务程序执行。
不用计算地址偏移,也不需要到rINTPND中查询
② 2410非向量中断:
中断产生后,CPU跳到一个固定的地址,查询中断源标号,接着利用“加载程序”跳到中断服务程序。
这属于
启动代码,程序如下:
IsrIRQ
sub sp,sp,#4 ;//reservedforPC
stmfd sp!
{r8-r9}
ldr r9,=INTOFFSET
ldr r9,[r9]
ldr r8,=HandleEINT0
add r8,r8,r9,lsl#2
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!
{r8-r9,pc}
问题:
C代码中的中断服务程序是如何和启动代码联系起来的,一定要通过启动代码实现中断吗?
51单片机常用寄存器速查表
一:
定时器/计数器方式选择:
TMOD地址(89H)不可位寻址
D7
D6
D5
D4
D3
D2
D1
D0
GATE
C/T
M1
M0
GATE
C/T
M1
M0
GATE:
门控制位GATE="0"时于外部中断无关GATE="1"时无外部中断才允许启动。
即(INT0/1=1时)C/T:
定时、计数方式选择位。
C/T=0时为定时方式C/T=1时计数方式
M1M0:
M0M1=00时为方式0、M1M0=10时为方式1,M1M0=11时为方式3
二:
中断标志与中断控制寄存器:
TCON地址(88H)可位寻址
D7
D6
D5
D4
D3
D2
D1
D0
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
TR1、TR0是T1、T0的启动控制位,置1起动。
置0停止定时/计数器。
TF1、TF0是T1、T0的溢出标志位,溢出时由硬件置1,CPU响应中断后由硬件清0软件查询时由软件清0
IT0、IT1为外部中断0、1的触发控制位IT0/1=0时为电平触发=1时下降沿触发
IE0、IE1为外部中断0、1请求标志,当有中断信号时由硬件置1,完成中断时由硬件清0
三:
中断允许控制寄存器:
IE地址(A8H)可位寻址
D7
D6
D5
D4
D3
D2
D1
D0
EA
―――
―――
ES
ET1
EX1
ET0
EX0
EA:
总控位,EA="0"时关所有中断。
EA="1"时所有中断请求均被开放。
ES:
串行口,ES="1"时开,ES="0"时关串行中断
ET1、ET0定时计数=1时开=0时关EX1、EX0外部中断=1时开=0时关
四:
中断优先级控制寄存器IP地址(B8H)可位寻址
D7
D6
D5
D4
D3
D2
D1
D0
―――
―――
―――
PS
PT1
PX1
PT0
PX0
PS:
串口PT1/0定时/计数器PX1/0外部中断=1高优先=0低优先
五:
串行控制寄存器SCON地址(98H)可位寻址
D7
D6
D5
D4
D3
D2
D1
D0
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0/1是串行工作方式选择位,共四种工作方式见表
SM0
SM1
工作方式
说明
波特率
0
0
方式0
同步移位寄存器
Fosc/12
0
1
方式1
10位异步收发
由定时器控制
1
0
方式2
11位异步收发
Fosc/32/64
1
1
方式3
11位异步收发
由定时器控制
SM2:
是多机通信控制位,主要用于2和3。
仅用于接收。
对于方式2和3若SM2=1,允许多机通信,只有当接收到第9位数(RB8)为1时,才接收前8位数送入SBUF,并向RI位产生中断请求,否则前8位数丢弃。
SM2=0时,无论RB8是0/1都将前8位数装入SBUF中并产生中断请求。
在方式0进不用SM2时必须设为0。
在方式1时,若SM2=1时则只有接收到有效停止位时RI才置1。
REN允许接收位,REN=1允许接收,否则不允许。
TB8:
为发送的第9位数(在方式2、3时),可用作校验位,在多机通信中,用TB8的状态表示主机发送的是地址还是数据。
TB8=1时表示地址。
=0时表示数据。
RB8:
是接收数据第9位(方式2、3)还代表接收数据的特征,可能是校验或地址/数据标志
TI:
发关中断标志位RI:
接收中断标志位。
由软件清0。
串行接收必须满足REN="1",RI=0.
六:
电源控制寄存器PCON地址(87H)
D7
D6
D5
D4
D3
D2
D1
D0
SMOD
―――
―――
―――
GF1
GF0
PDWN
IDLE
SMOD=1时波特率提高1倍,MOVPCON,#80H
SMOD 串行口通信波特率控制位置位使波特率翻倍
- 保留
- 保留
- 保留
GF1 通用标志位
GF0 通用标志位
PDWN 低功耗标志位置位进入低功耗模式
IDLE 空闲标志位置位进入空闲模式
51单片机的边沿触发及电平触发简介及测量
51单片机的外部中断有两种触发方式可选:
电平触发和边沿触发。
选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。
选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。
这个原理很好理解。
但应用时需要特别注意的几点:
1) 电平触发方式时,中断标志寄存器不锁存中断请求信号。
也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。
标志寄存器对于请求信号来说是透明的。
这样当中断请求被阻塞而没有得到及时响应时,将被丢失。
换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止。
因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样。
同样,当CPU在执行不可被中断的指令(如RETI)时,产生的电平触发中断如果时间太短,也得不到执行。
2) 边沿触发方式时,中断标志寄存器锁存了中断请求。
中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。
因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。
在该中断退出后,将被响应执行。
如果你不希望这样,必须在中断退出之前,手工清除外部中断标志。
3) 中断标志可以手工清除。
一个中断如果在没有得到响应之前就已经被手工清除,则该中断将被CPU忽略。
就如同没有发生一样。
4) 选择电平触发还是边沿触发方式应从系统使用外部中断的目的上去考虑,而不是如许多资料上说的根据中断源信号的特性来取舍。
比如,有的书上说(《KeilC51使用技巧及实战》),就有类似的观点。
MCS51单片机系列属于8位单片机,它是Intel公司继MCS48系列的成功设计之后,于1980年推出的产品。
由于MCS51系列具有很强的片内功能和指令系统,因而使单片机的应用发生了一个飞跃,这个系列的产品也很快成为世界上第二代的标准控制器。
51系列单片机有5个中断源,其中有2个是外部输入中断源INT0和INT1。
可由中断控制寄存器TCON的IT1(TCON.2)和IT0(TCON.1)分别控制外部输入中断1和中断0的中断触发方式。
若为0,则外部输入中断控制为电平触发方式;若为1,则控制为边沿触发方式。
这里是下降沿触发中断。
1 问题的引出
几乎国内所有的单片机资料对单片机边沿触发中断的响应时刻方面的定义都是不明确的或者是错误的。
例如文献[1]中关于边沿触发中断响应时刻的描述为“对于脉冲触发方式(即边沿触发方式)要检测两次电平,若前一次为高电平,后一次为低电平,则表示检测到了负跳变的有效中断请求信号”,但实际情况却并非如此。
我们知道,单片机外部输入的中断触发电平是TTL电平。
对于TTL电平,TTL逻辑门输出高电平的允许范围为2.4~5V,其标称值
为3.6V;输出低电平的允许范围为0~0.7V,其标称值为0.3V[2],在0.7V与2.4V之间的是非高非低的中间电平。
这样,在实际应用中,假设单片机外部中断引脚INT0输入一路由+5V下降到0V的下降沿信号,单片机在某个时钟周期采样INT0引脚得到2.4V的高电平;而在下一个时钟周期到来进行采样时,由于实际的外部输入中断触发信号由高电平变为低电平往往需要一定的时间,因此,检测到的可能并非真正的低电平(小于0.7V),而是处于低电平与高电平之间的某一中间电平,即0.7~2.4V的某一电平。
对于这种情况,单片机是否会依然置位中断触发标志从而引发中断呢?
关于这一点,国内的绝大部分教材以及单片机生产商提供的器件资料都没有给予准确的定义,但在实际应用中这种情况确实会碰到。
以美国Analog公司生产的运算放大器芯片AD708为例,其转换速率(slewrate)为0.3V/μs,在由AD708芯片组成的比较器电路中,其输出方波的下降沿由2.4V下降到0.7V,所需时间约为:
(2.4V-0.7V)/0.3V·μs-1=4.67μs。
即需要约4.67μs的过渡时间,下降沿才真正地由高电平下降为低电平,在实际应用电路中,这个下降时间往往可达10μs以上。
对于精密的测量系统,这么长的不确定时间是无法接受的,因此,有必要对单片机边沿中断触发时刻进行精确的测定。
2 测试波形的设计与分析
为了测定MCS51单片机下降沿触发的实际时刻,使用Agilent公司生产的型号为33250A的80MHz函数/任意波形发生器(function/arbitrarywaveformgenerator),产生出如图1所示的周期为20ms的周期波形。
图1 周期为20ms的周期波形
将该波形通过单片机的外部中断0输入,可以测出下降沿中断触发的实际时刻,下面对该波形进
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 中断