实验 2 中断模拟实验

Preview:

DESCRIPTION

实验 2 中断模拟实验. 试验目的. 掌握中断的含义和中断响应过程。 掌握用 CCS simulator 模拟中断的方法。 掌握中断应用程序的编写方法。. 摘要. 复习 C54x 中断操作 模拟中断的方法 实验内容及步骤. 试验原理. 中断是一些由硬件或软件产生的信号,能使 CPU 暂时停止执行正在执行的程序,转而执行由 DSP 程序开发者编写的中断服务程序 (ISR—— Interrupt Service Routine) C54x 既支持软件中断也支持硬件中断 软件中断,是由指令 (INTR 、 TRAP 、 RESET) 产生的。 硬件中断: - PowerPoint PPT Presentation

Citation preview

实验 2中断模拟实验

一.试验目的1. 掌握中断的含义和中断响应过程。2. 掌握用 CCS simulator 模拟中断的方法。3. 掌握中断应用程序的编写方法。

摘要 复习 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

ReserveReservedd

DMACDMAC55 DMAC4DMAC4 BXINT1BXINT1

/DMAC3/DMAC3BRINT1BRINT1/DMAC2/DMAC2 HPINTHPINT INT3INT3 TINT1TINT1

/DMAC1/DMAC1

C5402 DSP 的 IFR 寄存器 6 5 4 3 2 1 0

DMAC0DMAC0 BXINT0BXINT0 BRINT0BRINT0 TINT0TINT0 INT2INT2 INT1INT1 INT0INT0

IMR IMR (Interrupt Mask Register) 中断屏蔽寄存器 ( 地址 0x00)

当 ST1 的 INTM 位为 0 时, IMR 可用于禁止和使能可屏蔽中断,向 IMR 中的某个屏蔽位写 1 就能使能相应的可屏蔽中断 !如果写 0 ,则相应的中断被禁止 !

15-14 13 12 11 10 9 8 7

ReserveReservedd

DMACDMAC55 DMAC4DMAC4 BXINT1BXINT1

/DMAC3/DMAC3BRINT1BRINT1/DMAC2/DMAC2 HPINTHPINT INT3INT3 TINT1TINT1

/DMAC1/DMAC1

C5402 DSP 的 IMR 寄存器 6 5 4 3 2 1 0

DMAC0DMAC0 BXINT0BXINT0 BRINT0BRINT0 TINT0TINT0 INT2INT2 INT1INT1 INT0INT0

11

INTM中断模式位,可屏蔽中断的全局开关 !=0 全局开=1 全局关

ST1 :(0x07)

C54x 中断响应流程中断请求产生Request 中断应答Acknowledgment 执行用户编写的 ISR

IMR 屏蔽位 =1 ?

将当前 PC 值压入堆栈

产生应答信号 IACK

可屏蔽中断? 从 ISR 返回时,将先前压入堆栈的 PC 值弹出放入 PC 中

程序继续从被中断处运行

INTM=0 ?Y

N

Y

产生应答信号 IACKINTM 置 1Y

N

N

CPU 如何跳转到 ISR 去执行 ?

中断号

中断名称0 RS1 NMI

… ……

16 INT017 INT118 INT2

… ……

15 - 7

IPTR

中断 INT0 得到应答Acknowledgment PC = (IPTR<<7) + 中断号 ×4 PMST :(0x1D)

… …

程序空间

NOP B _MyInt0isr

NOP NOP

执行 C 函数 MyInt0isr

INT0 的中断向量

中断向量表

中断向量 ( 表 ) 指针

4-word space

4-word space

4-word space

4-word space

4-word space

摘要 复习 C54x 中断操作 模拟中断的方法 实验内容及步骤

Simulator 下模拟中断 编写引脚文件,指示出中断产生的时间! 将引脚文件和相应的中断引脚进行“连接”! 装载并运行程序后, CCS 会根据引脚文件中设置的时间来产生模拟的中断信号!

引脚文件 (.txt) 文件内容 含义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) 的产生。 编写程序响应 INT0 中断。

四.实验步骤1. 使用 CCS Setup 添加“ C5402 Device Simulator” 配置到系统中;运行 CCS ,进入 Simulator 工作模式。2. 编写引脚文件 intsim.txt 包含:3. 10000 (+10000) rpt EOS2. 使用 Tools Pin Connect 工具将该引脚文件连接到引脚 INT0 。3. 建立一个 CCS 项目,包含下列文件

main.c 使能并打开中断 isr.c 中断服务函数 vectors.asm 中断向量表 linker.cmd 链接器命令文件

实验环境建立

#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) {

asm(" RSBX INTM");}

}

main.c

#include <stdio.h>

extern int INTtimes;

interrupt void myisr(){

printf("%d\n", ++INTtimes);}

isr.c

.sect ".vectors"

.ref _myisr .align 0x80

Unused .space 16*4*16

int0: B _myisr NOP NOP NOPint1: RETE NOP NOP NOPint2: RETE NOP NOP NOP

.end

vectors.asm

-lrts.lib-stack 0x400-heap 0x400MEMORY{

PAGE 0: VECT: o=0x0080, l=0x0080SRAM: o=0x4000, l=0x3000

PAGE 1: REVS: o=0x1000, l=0x0400STACK: o=0x1400, l=0x0400IDRAM: o=0x1800, l=0x2800

}SECTIONS{

.vectors: > VECT

.text: > SRAM

.cinit: > SRAM

.stack: > STACK

.bss: > IDRAM

.const: > IDRAM

.cio: > IDRAM

.sysmem > IDRAM}

linker.cmd

实验内容和步骤4. 构建可执行模块。5. 装载并运行后观察结果。6. 修改程序,使其响应 INT1 中断。7. 重新构建、装载并运行后观察结果。

实验报告要求1. 中断发生时程序是如何转移到 ISR 的 ?2. 如何编程实现对中断的响应 ?3. 附 .c 程序和 .asm 程序 ( 中断向量表 ) ,并添加注释,说明一些关键语句的含义。

Recommended