实验2 中断模拟实验
试验目的 掌握中断的含义和中断响应过程。 掌握用CCS simulator模拟中断的方法。 掌握中断应用程序的编写方法。
摘要 复习C54x中断操作 模拟中断的方法 实验内容及步骤
试验原理 中断是一些由硬件或软件产生的信号,能使CPU暂时停止执行正在执行的程序,转而执行由DSP程序开发者编写的中断服务程序(ISR—— Interrupt Service Routine) C54x既支持软件中断也支持硬件中断 软件中断,是由指令 (INTR、TRAP、RESET) 产生的。 硬件中断: 外部中断——通过DSP外部中断引脚接收到的片外设备产生的中断(例如ADC/DAC向DSP发出的中断) 片上外设中断——DSP片上外设 (如定时器、串口、DMA等) 向CPU发出的中断 当同一CPU时钟周期内有多个硬件中断发生时,CPU会按照中断优先级对它们进行响应 ! 软件中断无优先级。
可屏蔽和非可屏蔽中断 DSP的中断可分为两大类: 可屏蔽 (Maskable) 中断:可以通过软件被禁止/使能的中断。被禁止掉的中断即使产生,CPU 也不会去响应 !被使能的中断,当它产生时 CPU 就会去响应它 ! 非可屏蔽 (Nonmaskable) 中断:不能被禁止的中断。当这些中断产生时 CPU 会无条件响应 !C54x 的非可屏蔽中断有: 所有的软件中断 ! 外部中断 NMI (DSP外部中断引脚NMI) 复位中断 RS (DSP外部中断引脚RS) CPU在响应 NMI 中断时,将不能被任何其他中断打断 !包括复位中断 !
IFR IFR (Interrupt Flag Register) 中断标志寄存器 (地址0x01) 当一个可屏蔽中断产生时,IFR中相应的中断标志位会被置1,当CPU响应该中断后,该标志位才被清除 ! 清除中断标志还可通过: 软件或硬件复位; 向标志位写1; 使用INTR #K指令响应该中断 15-14 13 12 11 10 9 8 7 Reserved DMAC5 DMAC4 BXINT1 /DMAC3 BRINT1 /DMAC2 HPINT INT3 TINT1 /DMAC1 6 5 4 3 2 1 DMAC0 BXINT0 BRINT0 TINT0 INT2 INT1 INT0 C5402 DSP 的 IFR 寄存器
IMR IMR (Interrupt Mask Register) 中断屏蔽寄存器 (地址0x00) 当 ST1 的 INTM 位为 0 时,IMR 可用于禁止和使能可屏蔽中断,向 IMR 中的某个屏蔽位写 1 就能使能相应的可屏蔽中断 !如果写 0,则相应的中断被禁止 ! 11 INTM 中断模式位,可屏蔽中断的全局开关 ! =0 全局开 =1 全局关 ST1: (0x07) 15-14 13 12 11 10 9 8 7 Reserved DMAC5 DMAC4 BXINT1 /DMAC3 BRINT1 /DMAC2 HPINT INT3 TINT1 /DMAC1 6 5 4 3 2 1 DMAC0 BXINT0 BRINT0 TINT0 INT2 INT1 INT0 C5402 DSP 的 IMR 寄存器
C54x 中断响应流程 中断请求产生 Request 中断应答 Acknowledgment 执行用户编写的ISR Y N N Y N Y 可屏蔽中断? INTM=0 ? Y 从ISR返回时,将先前 压入堆栈的 PC 值 弹出放入PC 中 N N Y N IMR屏蔽位=1? 产生应答信号 IACK INTM置1 Y 产生应答信号 IACK 将当前PC值压入堆栈 程序继续从被中断处 运行
PC = (IPTR<<7) + 中断号×4 CPU 如何跳转到 ISR 去执行 ? 中断 INT0 得到应答 Acknowledgment PC = (IPTR<<7) + 中断号×4 执行 C 函数 MyInt0isr PMST: (0x1D) 15 - 7 IPTR 中断向量(表)指针 … … 程序空间 中断向量表 中断 号 中断名称 RS 1 NMI … 16 INT0 17 INT1 18 INT2 4-word space 4-word space B _MyInt0isr NOP 4-word space INT0的 中断向量 NOP 4-word space NOP 4-word space
摘要 复习C54x中断操作 模拟中断的方法 实验内容及步骤
Simulator 下模拟中断 编写引脚文件,指示出中断产生的时间! 将引脚文件和相应的中断引脚进行“连接”! 装载并运行程序后,CCS会根据引脚文件中设置的时间来产生模拟的中断信号!
引脚文件(.txt) 文件内容 含义 100 120 300 分别在第 100、120、300 个CPU clock时产生中断 100 120 300 分别在第 100、120、300 个CPU clock时产生中断 100 +20 300 同上,分别在第 100、120、300 个CPU clock时产生中断 5 (+10) rpt 3 分别在第 5、15、25、35 个CPU clock时产生中断 5 (+10 +20) rpt 2 分别在第 5、15、35、45、65 个CPU clock时产生中断 100 (+200) rpt EOS 分别在第 100、300、500、700… 个CPU clock时产生中断,无限循环!
引脚文件和中断引脚的“连接” Tools → Pin connect
实验内容 在C54x Device Simulator模式下,编写引脚文件模拟部中断0 (INT0) 的产生。
实验步骤 使用CCS Setup添加“C5402 Device Simulator”配置到系统中;运行CCS,进入Simulator工作模式。 编写引脚文件 intsim.txt 包含: 10000 (+10000) rpt EOS 使用 Tools Pin Connect 工具将该引脚文件连接到引脚 INT0。 建立一个CCS项目,包含下列文件 main.c 使能并打开中断 isr.c 中断服务函数 vectors.asm 中断向量表 linker.cmd 链接器命令文件
实验环境建立
main.c #include <stdio.h> #define IMR *(unsigned int *)0x0000 #define IFR *(unsigned int *)0x0001 #define ST1 *(unsigned int *)0x0007 #define PMST *(unsigned int *)0x001D int INTtimes; void main() { asm(" SSBX INTM"); PMST = 0x00A0; IFR = 0xFFFF; IMR = 0x0001; asm(" RSBX INTM"); puts("interrupt enabled !"); INTtimes = 0; while(1) { }
isr.c #include <stdio.h> extern int INTtimes; interrupt void myisr() { printf("%d\n", ++INTtimes); }
vectors.asm .sect ".vectors" .ref _myisr .align 0x80 Unused .space 16*4*16 int0: B _myisr NOP int1: RETE int2: RETE .end
linker.cmd -lrts.lib -stack 0x400 -heap 0x400 MEMORY { PAGE 0: VECT: o=0x0080, l=0x0080 SRAM: o=0x4000, l=0x3000 PAGE 1: REVS: o=0x1000, l=0x0400 STACK: o=0x1400, l=0x0400 IDRAM: o=0x1800, l=0x2800 } SECTIONS .vectors: > VECT .text: > SRAM .cinit: > SRAM .stack: > STACK .bss: > IDRAM .const: > IDRAM .cio: > IDRAM .sysmem > IDRAM
实验内容和步骤 构建可执行模块。 装载并运行后观察结果。 修改程序,使其响应INT1中断。 重新构建、装载并运行后观察结果。
实验报告要求 中断发生时程序是如何转移到ISR的? 如何编程实现对中断的响应 ? 附.c程序和.asm程序(中断向量表),并添加注释,说明一些关键语句的含义。