单片机 中断系统详细教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

判断不 正确
A= 0 1 3
1 GcA = 2 3
GcB = 1
变量值
volatile的作用
C语言代码 volatile char GcA = 2; C:0x0109 char GcB = 1; C:0x010B main () C:0x010D { C:0x010F while (1) { C:0x0111 GcA = GcA + GcB; C:0x0114 if (GcA == GcB) { C:0x0017 GcB = 5; …… } 判断 } 正确 } A= 0 1 3 void ISR() interrupt 1 { GcA = 1; } volatile的作用: 每次使用变量时都重新读取变量 的值而不是使用寄存器的备份值
中断编号 n 中断源
interrupt n —— n是中断编号,指示中断向量 [ using m ] —— 可选部分,用于选择工作寄存器组
定时器0的中断服务函数
void time0ISR(void) interrupt 1 { tnOsTimeTick(); }
0 1 2 3 4
INT0
T0
INT1 T1 UART
有保护地使用全局资源(如全局变量) 不调用不可重入函数 以原子型的方式使用硬件
不可重入函数
temp int temp; void fun(int *x, *y) { if (*x < *y) { temp = *x; // 交换*x和*y的值 *x = *y; *y = temp; } }
void some_isr(void) interupt 2 { int c = 4, d = 5; fun(&c,&d); ………… } void main(void) { int a = 1, b = 2; fun(&a,&b); …… }
UART T1 INT1 T0 INT0 复位后PC指向的地址 0x2B 0x23 0x1B 0x13 0x0B 0x03 0x00 8字节空间
程序存储器
中断向量表
中断编号
中断源
中断标志
中断向量
中断使能
中断优先级
仲裁顺序
掉电唤醒


中断概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
UART SPI
定时器0 定时器1
定时器2
P3 P2 P1 P0
振荡器
看门狗定时器
P89V51RB2功能框图
高性能80C51 CPU
16KB程序Flash
1KB数据RAM
UART SPI
定时器0 定时器1 定时器2
P3 P2 P1 P0
振荡器
看门狗定时器
单片机内部有很多功能部件 中断系统 UART
中断相关寄存器
1
0
0
1
0
1
0
0
1
0
0
相应位写1使能
相应位写1置为高优先级


中断概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
中断向量
中断向量——
CPU响应中断时跳转到一个特定的地址开始 执行中断服务程序,这个地址就是中断向量
0xFFFF
......
5个中断源均有 独立的中断向量
本章导读
下一阶段将要学习“模电”和“数电”, 重在分析电路原理、器件内部结构和应用设计理论
现阶段重在学习使用基本数字器件
E2PROM存储器
温度传感器
TTL-RS232电平转换器
……
本章中用到
P89V51RB2功能框图
上一章的数码管和键盘程序只用到P0~P2 I/O 口 高性能80C51 CPU
16KB程序Flash 1KB数据RAM
此时发 生中断
对应的汇编代码 MOV A, 0x5B ADD A, 0x5A MOV 0x5A, A MOV A, 0x5A CJNE A,0x5B,C:0x0109 MOV 0x5B,#0x05 SJMP C:0x0109
1 GcA = 3 2
GcB = 1 5
变量值
原子操作
原 子 —— 在化学里面指的是不可分割, 在计算机里面指的是不可中断
PC跳转方式
调用子函数 响应中断 服务函数
不同点
相同点
都是暂停当前 程序转去执行 其他的程序


中断概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
80C51中断结构示意图
中断仲裁
中断编号 中断源
0 1 2 3 4
INT0 T0 INT1 T1 UART
假设中断优先级如下: 中断源 INT0、INT1高优先级 低优先级 、UART 为低优先级; IT0、T1为高优先级 INT0 T0 INT1 T1 UART 中断请 求有效
C语言代码 char GcA = 2; // 地址为0x5A char GcB = 1; // 地址为0x5B main () { while (1) { GcA = GcA + GcB; if (GcA == GcB) { GcA = 1; } } } void ISR() interrupt 1 { GcA = 1; }
紧急处理
回忆会议进度
中断响应
现场保护 保存返回地址 和状态信息
中断服务
现场恢复 恢复暂停 前的环境
中断相关基础知识
调用程序与响应中断服务函数
中断请求 中断请求 子函数2 子函数3
主函数 程序段1
假象: CPU同时执 行多任务
子函数1
主函数 程序段3
……
中断服务 函数
中断服务 函数
事实: CPU不能同时执 行1条以上的指令
第一次调用
出错
*y = 4
第二次调用
temp=4 temp=1
如果该函数为可重入函数, 函数执行就不会发生错误
函数可重入 局部变量和参数分配到堆栈中
void fun(int *x, *y) { int temp; temp_0 temp_1 if (*x < *y) { temp = *x; // 交换*x和*y的值 *x = *y; *y = temp; } } void some_isr(void) interupt 2 { int c = 4, d = 5; fun(4,5); ………… } void main(void) { int a = 1, b = 2; fun(1,2); …… }
① 使用原子操作 执行临界段前禁能中 断,执行完毕后恢复 中断状态
critical {i++;} 对应的汇编语句
SETB JBC CLR Addr: INC MOV MOV 0x01 ;将EA状态保存在0x01中 EA,Addr ;禁能中断 0x01 _i ;执行{}块内语句 C,0x01 EA, C ;恢复EA初值
中断标志的产生
若配置为下降沿触发
P3.2
1
0xFFFE 0xFFFF 0x0000
P3.2引脚出现下降沿时IE0被置1 定时器0计数溢出是TF0被置1 若配置为低电平触发
1
P3.3
1
0xFFFE 0xFFFF 0x0000
P3.3引脚出现下降沿时IE1被置1 定时器1计数溢出是TF0被置1
接收完一个字符RI被置1 发送完一个字符TI被置1
中断服务函数分析
定时器0的中断服务函数 0xFFFF 0x2B
void time0ISR(void) interrupt 1 { tnOsTimeTick(); }
中断入口处汇编代码 0x000B 0x000E 0x000F 0x0010 0x0011 0x0012 …… LJMP time0ISR NOP NOP NOP NOP NOP …… time0ISR: 0x015D PUSH 0x20 …… 中断响应
主 程 序
T0中断 服务 INT0中 断服务
主 程 序
INT1中 断服务
UART中 断服务
高、低优先 级 中断仲裁
同优先级 中断仲裁
中断仲裁原则: 高和低优先级中断同时有效,
先响应高优先级中断
同优先级中断同时有效,
先响应编号小的中断
中断嵌套
中断嵌套发生条件:
低优先级中断正在处理的时候, 高优先级中断请求有效
对应的汇编指令
ORL 0x5B, 0x80
堆栈溢出
发生函数调用、分配局部变量和响应中断时
——将会使用堆栈空间
要使用堆栈的空间
>
可用的堆栈空间
——发生堆栈溢出
堆栈指针超 出堆栈空间
发生堆栈溢出的情况
0xFF SP 0xC0 0xBF
堆栈空间
0x7F
......
0x01 0x00
数据存储器
可重入性
一般来说具有如下特性的函数满足可重入性
中断嵌套处理机制:
高优先级中断抢先处理,处理完后 继续处理被抢占的低优先级中断
中断源
低优先级 高优先级
主 程 序
UART中 断服务
低优先级中 断被抢占
INT0 T0 INT1 中断请 求有效 UART T1
中断嵌套
T0中断 服务
继续处理被 抢占的中断


中断概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
......
中断源
UART T1 INT1 T0 0x23 0x1B
0x13
NOP…NOP 0x0B LJMP time0ISR 0x03 0x00
后5字节
前3字节
INT0
程序存储器
中断处理需要注意的bugs
1 2 3 4
变量没被声明为volatile 非原子操作 堆栈溢出 函数不可重入
volatile的作用
本章将学习的部件
定时器0 看门狗定时器
本章内容简介
2 . 1 中断系统
CPU事件响应机制
2 . 2 定时/计数器
2 . 3 看门狗 2 . 4 I2C总线及其驱动程序 2 . 5 串行口及其驱动程序
外设功能部件
2.1 中断系统


中断相关概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
1
P3.1/TXD
TXD/RXD
P3.0/RXD
1/1
中断标志被硬件置位
中断使能与优先级设置
P3.2
1
0xFFFE 0xFFFF 0x0000
1
P3.2
1
0xFFFE 0xFFFF 0x0000
1 1
P3.1/TXD
TXD/RXD
P3.0/RXD
1பைடு நூலகம்
0
0
1
0
1
0
0
1
0
0
软件设置中断使能
中断响应
中断得到响应时由硬件自动清0
轮询通信与中断驱动
主程序开始
请求服务
在处理任务4的时候 外围部件请求服务
处理任务1
请求服务? N
处理任务4
Y
提供服务 轮询通信只能在查 询到有请求的时候 才能提供服务 响应时间 不稳定
处理任务5
请求时间的不确定,导 致响应的时间不稳定
轮询通信流程图
轮询通信与中断驱动
主程序开始 主程序开始
请求服务
工作和状态寄存器 指针寄存器DPTR 累加器A、B 中断返回地址
执行RETI出栈 CPU自动处理入栈
中断响应过程
C51编程中由 编译器处理出 入栈的操作
中断函数的定义
void ISRname(void) interrupt n [ using m ] 函数类型 ISRname ——无参数,无返回值 ——中断服务函数名称,由用户定义
此时发 生中断
对应的汇编代码 C:0x0109 C:0x010B C:0x010D C:0x010F C:0x0112 C:0x0015 …… MOV A, 0x5B ADD A, 0x5A MOV 0x5A, A CJNE A,0x5B,C:0x0109 MOV 0x5B,#0x01 SJMP C:0x0109
第一次调用
temp=4 temp=1
第二次调用
函数两次调用执行都正确


中断概念 80C51的中断结构
相关寄存器
中断向量 中断操作 使能和禁止中断
临界块
共享资源—— 临界资源——
被两个以上调用者使用的资源
一次只能被一个调用者使用的共享资源
临界块 ——
访问临界资源的函数或程序段
临界资源的保护
保护临界资源的常用方法
处理任务1
处理任务1
响应时间在 几微秒内 提供服务
请求服务? N
处理任务4
Y
提供服务
处理任务2
处理任务3 响应时间 不稳定 暂停当 前任务
处理任务5
处理任务4
轮询通信流程图
中断驱动流程图
什么是中断
中断—— CPU暂停当前的工作,转去处理要求迅速处理 的事件,处理完后,继续原来的工作
紧急响应
记录会议进度
原子操作 —— 不可被中断的操作
对应的汇编指令 data char flags = 0; void main(void) { …… flags |= 0x80; …… } xdata char flags = 0; void main(void) { …… flags |= 0x80; …… } MOV DPTR, #0x0000 MOVX A, @DPTR ORL A, 0x80 MOVX @DPTR, A 中断可以发 生在访问变 量的过程中
外部中断0
0 1 1
同优先级 无 或更高优 中断处理 先级中断 处理中 中
外部中断1
0 1 1 1
1
0
0
1
0
1
0
0
1
0
0
由软件清0
中断响应
中断得到响应的条件
中断响应与返回过程
主程序 中断程序
堆栈空间
执行PUSH 执行POP 指令出栈 指令入栈
ISR()
PSW R0~R7 DPH DPL B ACC PCH PCL
相关文档
最新文档