定时器中断方式实验报告
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定时器中断方式实验报告
通信 0203 班 王建超 02211272
一.中断初始化及服务程序的编写
5402DSP 中断有两大类,一类是可屏蔽中断:可以用软件来屏蔽或开放的硬件和软件中断。在 5402
中有 INT3 ~INT0(外部中断),BRINT0,BXINT0(缓冲串行口中断),TRINT,TXINTW(时分多路串行口
void interrupt_init(void)
{
IFR|=0x0ffff;
//清中断标识寄存器
IMR|=0x0002;
//开放外部中断 1
asm(" RSBX INTM ");
//开放所有可屏蔽中断
} C54X 处理中断分为 3 个阶段: 第一阶段:接受终端请求,IFR 中相应的中断标志位置 1 第二阶段:对于软件中断和非屏蔽中断,CPU 立即响应。对于可屏蔽中断,只有满足几 个条件后才能响应:
void set_clock(u16 plldiv); void set_wait_states(void); void init_io_reg(void);
//set system clock mode //set wait state register //initialize CPLD I/O control register
转指令转到相应的中断服务程序,其余的空位用 NOP 填充;未使用的向量直接用 RETE 中
断返回指令返回,是为了防止意外进入未用中断,同样其余的空位用 NOP 填充。
在中断向量表中.sect ".vectors" ;定义的中断向量段,中断向量表即放在此段当中
.ref _c_int00 ;定义 C 语言的初始化入口地址
TIMER_HALT(TIM0); PRD(TIM0)=62499; TCR(TIM0)=0x0C0f; //TCR(TIM0)=TCR_MASK(1,0,15);
interrupt_init();
for(;;) {};
}
interrupt void int1_isr(void) {
board_led_toggle(BRD_LED2); }
//set IPTR //enable all interrupt,,
//set clock generator mode
void set_clock(u16 plldiv)
Hale Waihona Puke {if (CLKMD&0x0001) //if clock generator is PLL mode
{
if ((plldiv==DIV2)||(plldiv==DIV4)) //PLL mode to DIV mode
5402 DSP 复位时中断指针 IPTR=1FFh,所以硬件复位的中断向量的地址是 FF80h。中断
向量地址是由 IPTR 和中断号(左移两位后)两部分构成的。中断指针占 9 个比特,中断号 共 30 个,为 5 个比特,左移两位后为 7 个比特构成。在修改时,在中断初始化程序中重新 设置中断指针 IPTR 的值,以及在 5402.CMD 链接命令文件中设置.vectors 段的存储位置。 三.源程序:
} MEMORY 为存储器指示关键字,程序区用 PAGE 0 来表示,数据区用 PAGE 1 来表示。程序区
的中断向量表放置名字为 VECS 开始于 4000h,长度为 80h.程序区放置名字为 PRAM 开始于 8000h, 长度为 4000h.而 STACK 为堆栈区,开始于 3100h,长度为 500h.
cpu执行中断向量处预定义的跳转指令跳转到中断服务程序执行pc存到数据存储器堆栈的栈顶将中断向量地址加载pc执行分支转移指令跳转到中断服务程序执行中断服务程序中断返回从栈顶弹出返回地址到pc继续执行被中断了的程序语言编写中断服务程序时在普通的函数前加关键字interrupt例如写外部中断interruptvoidint1isrvoid
PRAM: origin = 8000h, length = 4000h /* Internal Program RAM */
PAGE 1: SCRATCH: origin = 0060h, length = 0020h /* Scratch Pad Data RAM */ DATA: origin = 3000h, length = 0080h /* Internal Data RAM */ STACK: origin = 3100h, length = 0500h /* Stack Memory Space */ EXRAM: origin = 3600h, length = 0900h /* External Data RAM */
优先级别最高(当同时出现一个以上中断时) 状态寄存器 ST1 中的 INTM 位为 0 中断屏蔽寄存器 IMR 中的相应位为 1 CPU 响应中断时,令 PC 转到适当的地址取出中断向量,并发出中断响应信号 IACK, 清除相应的中断标志 第三阶段:CPU 执行中断向量处预定义的跳转指令,跳转到中断服务程序执行 PC 存到数据存储器堆栈的栈顶 将中断向量地址加载 PC 执行分支转移指令,跳转到中断服务程序 执行中断服务程序 中断返回,从栈顶弹出返回地址到 PC 继续执行被中断了的程序 C 语言编写中断服务程序时,在普通的函数前加关键字 interrupt ,例如写外部中断 1 时 interrupt void int1_isr(void){}。除此之外,中断服务程序的编写方法与一般 C 语言程序相同。
.ref _int1_isr
;定义外部中断 1 服务程序的入口地址
.align 0x80
;中断向量表必须对齐 128 字的页边界
二.CMD 文件的配置及编写
MEMORY
{ PAGE 0: VECS: origin = 4000h, length = 0080h /* Internal Program RAM */
应的中断;IFR 表示是否发生了中断,如果 IFR 的某一位置 1 则说明发生了相应的中断,直到中断得
到处理后,才会将中断标志清 0。以下 4 种情况会使中断标志清零:C54X 复位;中断在中断服务程
序中得到处理,常用于中断方式;将 1 写到 IFR 中的相应位,常用于查询方式;使用适当的中断号执
行 INTR 指令。
中断),TINT(定时器中断),HPINT(HPI 中断)。
还有一类是非屏蔽中断:这些中断是不可屏蔽的,包括所有的软件中断,和两个外部中断 RS 和
NMI 中断。
在 5402 DSP 内有两个与中断相关的寄存器—中断屏蔽寄存器 IMR 和中断标志寄存器 IFR。它们
都是存储器映像寄存器(MMR),IMR 定义了可屏蔽的硬件中断,如果 IMR 的某一位置 1 则允许相
//define clkmd register initialize value #define PLL15 0x0e007 #define PLL10 0x9007 #define PLL5 0x4007 #define PLL2 0x1007 #define PLL1 0x0f007 #define DIV2 0x0000 #define DIV4 0xf000
}
}
else //else clock generator is DIV mode
{
if ((plldiv==DIV2)||(plldiv==DIV4)) //DIV mode to DIV mode
{
CLKMD=PLL1|0x07f8;
//turn to PLL mode
while(!(CLKMD&0x0001));
.switch > EXRAM PAGE 1
} SECTIONS 为存储器区段关键字;.cinit 表示将 C 语言初始化程序存入 PRAM 区域中;.text 表
示将程序段放入 PAGE0 的 PRAM 区域,.vectors 表示将中断向量表放置在 VECS 区域。.stack 表 示将堆栈段放入 PAGE1 的 STACK 区域.
delay(1000); board_led_disable(BRD_LED1); board_led_enable(BRD_LED2);
delay(1000); board_led_disable(BRD_LED2); }
//initialize TIMER 0,timer period is 10ms //TIMER_INIT(TIM0,TCR_MASK(1,0,15),62499);
因此,在进行中断的初始化时一般中断的初始化要包括以下步骤:清除中断标志寄存器 IFR
中的中断标志,设置中断屏蔽寄存器 IMR 中的相应屏蔽位为 1,开放相应的中断,INTM=0 开
放全部可屏蔽中断,如果需要,重新设置处理器工作模式寄存器 PMST 中的中断指针 IPTR 进
行中断向量的重新定位。例如在本实验中要开放外部中断 1,则编写 C 语言中断程序如下:
{
CLKMD=plldiv;
}
else
//PLL mode to PLL mode
{
CLKMD=DIV2;
//turn to DIV mode
while (CLKMD&0x0001);
//check CLKMD PLL status bit
CLKMD=plldiv|0x07f8;
while (!(CLKMD&0x0001)); //check CLKMD PLL status bit
void interrupt_init(void); interrupt void int1_isr(void);
//interrupt initialization
u16 count=2; u8 xf_flag=0;
void main() {
asm(" SSBX INTM ");
//disable all interrupt
//check CLKMD PLL status bit
CLKMD=plldiv;
}
else
{
CLKMD=plldiv|0x07f8;
//DIV mode to PLL mode
while (!(CLKMD&0x0001)); //check CLKMD PLL status bit
/*
timer.c
*/
#include "type.h"
#include "board.h"
#include <stdio.h>
#include "timer.h"
//Tms320vc5402 have two timer--TIM0:timer0 TIM1:timer1 #define TIM0 0 #define TIM1 1
void board_led_toggle(BrdLed led); void board_led_enable(BrdLed led); void board_led_disable(BrdLed led);
//led toggle //led enable //led disable
void delay(int period);
中断向量表是 DSP 中断程序的重要组成部分,当有中断发生并且处于允许状态时,程
序指针跳转到中断向量表中对应的中断地址。由于中断服务程序一般较长,通常中断向量表
存放的是一个跳转指令,指向实际的中断服务程序。
5402 DSP 共有 30 个中断向量,每个向量占 4 个字的位置。使用的向量处一般用一条跳
void interrupt_init(void)
{
IFR|=0x0ffff;
//clear all interrupt flag
IMR=0x0002;
//enable int1 interrupt
//PMST=PMST&0x007f|0x4000; //set IPTR
PMST=0x404c; asm(" RSBX INTM "); }
SECTIONS {
.cinit > PRAM PAGE 0 .text > PRAM PAGE 0 .vectors > VECS PAGE 0
.stack .trap
> STACK PAGE 1 > SCRATCH PAGE 1
.const .data .bss .cio
> EXRAM PAGE 1 > EXRAM PAGE 1 > EXRAM PAGE 1 > EXRAM PAGE 1
set_clock(PLL10); //clkout=10*10=100Mhz
set_wait_states(); init_io_reg();
while(count--) {
board_led_enable(BRD_LED0);
delay(1000); board_led_disable(BRD_LED0); board_led_enable(BRD_LED1);
通信 0203 班 王建超 02211272
一.中断初始化及服务程序的编写
5402DSP 中断有两大类,一类是可屏蔽中断:可以用软件来屏蔽或开放的硬件和软件中断。在 5402
中有 INT3 ~INT0(外部中断),BRINT0,BXINT0(缓冲串行口中断),TRINT,TXINTW(时分多路串行口
void interrupt_init(void)
{
IFR|=0x0ffff;
//清中断标识寄存器
IMR|=0x0002;
//开放外部中断 1
asm(" RSBX INTM ");
//开放所有可屏蔽中断
} C54X 处理中断分为 3 个阶段: 第一阶段:接受终端请求,IFR 中相应的中断标志位置 1 第二阶段:对于软件中断和非屏蔽中断,CPU 立即响应。对于可屏蔽中断,只有满足几 个条件后才能响应:
void set_clock(u16 plldiv); void set_wait_states(void); void init_io_reg(void);
//set system clock mode //set wait state register //initialize CPLD I/O control register
转指令转到相应的中断服务程序,其余的空位用 NOP 填充;未使用的向量直接用 RETE 中
断返回指令返回,是为了防止意外进入未用中断,同样其余的空位用 NOP 填充。
在中断向量表中.sect ".vectors" ;定义的中断向量段,中断向量表即放在此段当中
.ref _c_int00 ;定义 C 语言的初始化入口地址
TIMER_HALT(TIM0); PRD(TIM0)=62499; TCR(TIM0)=0x0C0f; //TCR(TIM0)=TCR_MASK(1,0,15);
interrupt_init();
for(;;) {};
}
interrupt void int1_isr(void) {
board_led_toggle(BRD_LED2); }
//set IPTR //enable all interrupt,,
//set clock generator mode
void set_clock(u16 plldiv)
Hale Waihona Puke {if (CLKMD&0x0001) //if clock generator is PLL mode
{
if ((plldiv==DIV2)||(plldiv==DIV4)) //PLL mode to DIV mode
5402 DSP 复位时中断指针 IPTR=1FFh,所以硬件复位的中断向量的地址是 FF80h。中断
向量地址是由 IPTR 和中断号(左移两位后)两部分构成的。中断指针占 9 个比特,中断号 共 30 个,为 5 个比特,左移两位后为 7 个比特构成。在修改时,在中断初始化程序中重新 设置中断指针 IPTR 的值,以及在 5402.CMD 链接命令文件中设置.vectors 段的存储位置。 三.源程序:
} MEMORY 为存储器指示关键字,程序区用 PAGE 0 来表示,数据区用 PAGE 1 来表示。程序区
的中断向量表放置名字为 VECS 开始于 4000h,长度为 80h.程序区放置名字为 PRAM 开始于 8000h, 长度为 4000h.而 STACK 为堆栈区,开始于 3100h,长度为 500h.
cpu执行中断向量处预定义的跳转指令跳转到中断服务程序执行pc存到数据存储器堆栈的栈顶将中断向量地址加载pc执行分支转移指令跳转到中断服务程序执行中断服务程序中断返回从栈顶弹出返回地址到pc继续执行被中断了的程序语言编写中断服务程序时在普通的函数前加关键字interrupt例如写外部中断interruptvoidint1isrvoid
PRAM: origin = 8000h, length = 4000h /* Internal Program RAM */
PAGE 1: SCRATCH: origin = 0060h, length = 0020h /* Scratch Pad Data RAM */ DATA: origin = 3000h, length = 0080h /* Internal Data RAM */ STACK: origin = 3100h, length = 0500h /* Stack Memory Space */ EXRAM: origin = 3600h, length = 0900h /* External Data RAM */
优先级别最高(当同时出现一个以上中断时) 状态寄存器 ST1 中的 INTM 位为 0 中断屏蔽寄存器 IMR 中的相应位为 1 CPU 响应中断时,令 PC 转到适当的地址取出中断向量,并发出中断响应信号 IACK, 清除相应的中断标志 第三阶段:CPU 执行中断向量处预定义的跳转指令,跳转到中断服务程序执行 PC 存到数据存储器堆栈的栈顶 将中断向量地址加载 PC 执行分支转移指令,跳转到中断服务程序 执行中断服务程序 中断返回,从栈顶弹出返回地址到 PC 继续执行被中断了的程序 C 语言编写中断服务程序时,在普通的函数前加关键字 interrupt ,例如写外部中断 1 时 interrupt void int1_isr(void){}。除此之外,中断服务程序的编写方法与一般 C 语言程序相同。
.ref _int1_isr
;定义外部中断 1 服务程序的入口地址
.align 0x80
;中断向量表必须对齐 128 字的页边界
二.CMD 文件的配置及编写
MEMORY
{ PAGE 0: VECS: origin = 4000h, length = 0080h /* Internal Program RAM */
应的中断;IFR 表示是否发生了中断,如果 IFR 的某一位置 1 则说明发生了相应的中断,直到中断得
到处理后,才会将中断标志清 0。以下 4 种情况会使中断标志清零:C54X 复位;中断在中断服务程
序中得到处理,常用于中断方式;将 1 写到 IFR 中的相应位,常用于查询方式;使用适当的中断号执
行 INTR 指令。
中断),TINT(定时器中断),HPINT(HPI 中断)。
还有一类是非屏蔽中断:这些中断是不可屏蔽的,包括所有的软件中断,和两个外部中断 RS 和
NMI 中断。
在 5402 DSP 内有两个与中断相关的寄存器—中断屏蔽寄存器 IMR 和中断标志寄存器 IFR。它们
都是存储器映像寄存器(MMR),IMR 定义了可屏蔽的硬件中断,如果 IMR 的某一位置 1 则允许相
//define clkmd register initialize value #define PLL15 0x0e007 #define PLL10 0x9007 #define PLL5 0x4007 #define PLL2 0x1007 #define PLL1 0x0f007 #define DIV2 0x0000 #define DIV4 0xf000
}
}
else //else clock generator is DIV mode
{
if ((plldiv==DIV2)||(plldiv==DIV4)) //DIV mode to DIV mode
{
CLKMD=PLL1|0x07f8;
//turn to PLL mode
while(!(CLKMD&0x0001));
.switch > EXRAM PAGE 1
} SECTIONS 为存储器区段关键字;.cinit 表示将 C 语言初始化程序存入 PRAM 区域中;.text 表
示将程序段放入 PAGE0 的 PRAM 区域,.vectors 表示将中断向量表放置在 VECS 区域。.stack 表 示将堆栈段放入 PAGE1 的 STACK 区域.
delay(1000); board_led_disable(BRD_LED1); board_led_enable(BRD_LED2);
delay(1000); board_led_disable(BRD_LED2); }
//initialize TIMER 0,timer period is 10ms //TIMER_INIT(TIM0,TCR_MASK(1,0,15),62499);
因此,在进行中断的初始化时一般中断的初始化要包括以下步骤:清除中断标志寄存器 IFR
中的中断标志,设置中断屏蔽寄存器 IMR 中的相应屏蔽位为 1,开放相应的中断,INTM=0 开
放全部可屏蔽中断,如果需要,重新设置处理器工作模式寄存器 PMST 中的中断指针 IPTR 进
行中断向量的重新定位。例如在本实验中要开放外部中断 1,则编写 C 语言中断程序如下:
{
CLKMD=plldiv;
}
else
//PLL mode to PLL mode
{
CLKMD=DIV2;
//turn to DIV mode
while (CLKMD&0x0001);
//check CLKMD PLL status bit
CLKMD=plldiv|0x07f8;
while (!(CLKMD&0x0001)); //check CLKMD PLL status bit
void interrupt_init(void); interrupt void int1_isr(void);
//interrupt initialization
u16 count=2; u8 xf_flag=0;
void main() {
asm(" SSBX INTM ");
//disable all interrupt
//check CLKMD PLL status bit
CLKMD=plldiv;
}
else
{
CLKMD=plldiv|0x07f8;
//DIV mode to PLL mode
while (!(CLKMD&0x0001)); //check CLKMD PLL status bit
/*
timer.c
*/
#include "type.h"
#include "board.h"
#include <stdio.h>
#include "timer.h"
//Tms320vc5402 have two timer--TIM0:timer0 TIM1:timer1 #define TIM0 0 #define TIM1 1
void board_led_toggle(BrdLed led); void board_led_enable(BrdLed led); void board_led_disable(BrdLed led);
//led toggle //led enable //led disable
void delay(int period);
中断向量表是 DSP 中断程序的重要组成部分,当有中断发生并且处于允许状态时,程
序指针跳转到中断向量表中对应的中断地址。由于中断服务程序一般较长,通常中断向量表
存放的是一个跳转指令,指向实际的中断服务程序。
5402 DSP 共有 30 个中断向量,每个向量占 4 个字的位置。使用的向量处一般用一条跳
void interrupt_init(void)
{
IFR|=0x0ffff;
//clear all interrupt flag
IMR=0x0002;
//enable int1 interrupt
//PMST=PMST&0x007f|0x4000; //set IPTR
PMST=0x404c; asm(" RSBX INTM "); }
SECTIONS {
.cinit > PRAM PAGE 0 .text > PRAM PAGE 0 .vectors > VECS PAGE 0
.stack .trap
> STACK PAGE 1 > SCRATCH PAGE 1
.const .data .bss .cio
> EXRAM PAGE 1 > EXRAM PAGE 1 > EXRAM PAGE 1 > EXRAM PAGE 1
set_clock(PLL10); //clkout=10*10=100Mhz
set_wait_states(); init_io_reg();
while(count--) {
board_led_enable(BRD_LED0);
delay(1000); board_led_disable(BRD_LED0); board_led_enable(BRD_LED1);