22
实实 2 实实实实实实

实验 2 中断模拟实验

  • Upload
    brick

  • View
    74

  • Download
    5

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: 实验 2 中断模拟实验

实验 2中断模拟实验

Page 2: 实验 2 中断模拟实验

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

Page 3: 实验 2 中断模拟实验

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

Page 4: 实验 2 中断模拟实验

二.试验原理 中断是一些由硬件或软件产生的信号,能使 CPU 暂时停止执行正在执行的程序,转而执行由 DSP 程序开发者编写的中断服务程序 (ISR—— Interrupt Service Routine) C54x 既支持软件中断也支持硬件中断

软件中断,是由指令 (INTR 、 TRAP 、 RESET) 产生的。 硬件中断:

外部中断——通过 DSP 外部中断引脚接收到的片外设备产生的中断( 例如 ADC/DAC 向 DSP 发出的中断 )

片上外设中断—— DSP 片上外设 ( 如定时器、串口、 DMA 等 ) 向CPU 发出的中断

当同一 CPU 时钟周期内有多个硬件中断发生时, CPU 会按照中断优先级对它们进行响应 ! 软件中断无优先级。

Page 5: 实验 2 中断模拟实验

可屏蔽和非可屏蔽中断 DSP 的中断可分为两大类:

可屏蔽 (Maskable) 中断:可以通过软件被禁止 / 使能的中断。被禁止掉的中断即使产生, CPU 也不会去响应 !被使能的中断,当它产生时 CPU 就会去响应它 ! 非可屏蔽 (Nonmaskable) 中断:不能被禁止的中断。当这些中断产生时 CPU 会无条件响应 ! C54x 的非可屏蔽中断有:

所有的软件中断 ! 外部中断 NMI (DSP 外部中断引脚 NMI) 复位中断 RS (DSP 外部中断引脚 RS)

CPU 在响应 NMI 中断时,将不能被任何其他中断打断 !包括复位中断 !

Page 6: 实验 2 中断模拟实验

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

Page 7: 实验 2 中断模拟实验

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)

Page 8: 实验 2 中断模拟实验

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

IMR 屏蔽位 =1 ?

将当前 PC 值压入堆栈

产生应答信号 IACK

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

程序继续从被中断处运行

INTM=0 ?Y

N

Y

产生应答信号 IACKINTM 置 1Y

N

N

Page 9: 实验 2 中断模拟实验

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

Page 10: 实验 2 中断模拟实验

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

Page 11: 实验 2 中断模拟实验

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

Page 12: 实验 2 中断模拟实验

引脚文件 (.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 时产生中断,无限循环!

Page 13: 实验 2 中断模拟实验

引脚文件和中断引脚的“连接” Tools → Pin connect

Page 14: 实验 2 中断模拟实验

三.实验内容 在 C54x Device Simulator 模式下,编写引脚文件模拟部中断 0 (INT0) 的产生。 编写程序响应 INT0 中断。

Page 15: 实验 2 中断模拟实验

四.实验步骤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 链接器命令文件

Page 16: 实验 2 中断模拟实验

实验环境建立

Page 17: 实验 2 中断模拟实验

#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

Page 18: 实验 2 中断模拟实验

#include <stdio.h>

extern int INTtimes;

interrupt void myisr(){

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

isr.c

Page 19: 实验 2 中断模拟实验

.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

Page 20: 实验 2 中断模拟实验

-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

Page 21: 实验 2 中断模拟实验

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

Page 22: 实验 2 中断模拟实验

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