c6000 中断小结

c6000 中断小结1. 中断相关概念中断过程———————————–你在下象棋,突然电话响了,你回屋接电话,然后回来继续下象棋,这个过程就叫做中断响应过程。CPU执行正常任务———————下象棋保护现场———————————-你已经想好要“将军”,先在脑海中记下来。中断

大家好,又见面了,我是你们的朋友全栈君。

1.  中断相关概念
中断过程———————————–你在下象棋,突然电话响了,你回屋接电话,然
后回来继续下象棋,这个过程就叫做中断响应过程。
CPU执行正常任务———————下象棋
保护现场———————————-你已经想好要“将军”,先在脑海中记下来。
中断发生———————————-电话响-
中断服务程序—————————-接电话
恢复现场———————————-回来后恢复刚才想法
中断返回———————————-你回来继续下象棋
中断屏蔽———————————-Boss 正在训话,要求所有电话关机,你不能接电话
了。
不可屏蔽中断——————————-你内急,即使是 Boss 在训话,你还是得到外面去
嘘嘘。

可屏蔽中断——————————-你在“闭关修炼”,可以不受外界干扰。
 
2.  中断源
C6000 支持软件中断和硬件中断。软件中断由指令产生中断请求,硬件中断可以来自
外设的一个请求信号,如外部中断。C620x/C670x 中断向量表

 

中断号   中断名称     中断功能

00000b    DSPINT      Host port host to DSP interrupt

00001b    TINT0        Timer 0 interrupt

00010b    TINT1        Timer 1 interrupt

00011b    SD_INT      EMIF SDRAM timer interrupt

00100b    EXT_INT4     External interrupt 4

00101b    EXT_INT5     External interrupt 5

00110b    EXT_INT6     External interrupt 6

00111b    EXT_INT7     External interrupt 7

01000b    EDMA_INT    EDMA channel (0 through 15) interrupt

01001b    Reserved Not used

01010b    Reserved Not used

01011b    Reserved Not used

01100b    XINT0        McBSP 0 transmit interrupt

01101b    RINT0        McBSP 0 receive interrupt

01110b    XINT1        McBSP 1 transmit interrupt

01111b    RINT1        McBSP 1 receive interrupt

Other   Reserved

不同型号的 DSP 定义中断号所对应的中断功能不同,为了达到统一使用中断号功能,
DSP 可以使用中断复用寄存器进行重新映射。通过中断复用寄存器映射可以把中断源映射
到任何 CPU中断。
 
中断复用寄存器默认中断号映射表

CPU

Related

INTSEL

Interrupt

 

Interrupt

INTSEL field

Reset V alue

Acronym

Interrupt Deion

INT4

INTSEL4

00100b

EXT_INT4

External interrupt pin 4

INT5

INTSEL5

00101b

EXT_INT5

External interrupt pin 5

INT6

INTSEL6

001 10b

EXT_INT6

External interrupt pin 6

INT7

INTSEL7

001 1 1b

EXT_INT7

External interrupt pin 7

INT8

INTSEL8

01000b

DMA_INT0/

DMA Channel 0 Interrupt/

 

 

 

EDMA_INT

EDMA interrupt

INT9

INTSEL9

01001b

DMA_INT1

DMA Channel 1 interrupt ??

INT10

INTSEL10

0001 1b

SD_INT

EMIF SDRAM timer interrupt

 

 

 

 

(C62x/C67x)

 

 

 

SD_INT A

EMIF A SDRAM timer interrupt

 

 

 

 

(C64x)

INT1 1

INTSEL1 1

01010b

DMA_INT2

DMA Channel 2 interrupt ??

INT12

INTSEL12

0101 1b

DMA_INT3

DMA Channel 3 interrupt ??

INT13

INTSEL13

00000b

DSPINT

Host port to DSP interrupt

INT14

INTSEL14

00001b

TINT0

T imer 0 interrupt

INT15

INTSEL15

00010b

TINT1

T imer 1 interrupt

3.  常用中断寄存器
通过对中断寄存器进行配置,可以实现各种中断功能。
IER(中断使能寄存器)
IFR(中断标志寄存器)
ISR(中断设置寄存器)
ICR(中断清除寄存器)
ISTP(中断向量表起始地址寄存器)中断向量程序的地址可以通过 ISTP寄存器进行重新映
射
MUXH(中断复用寄存器)
MUXL(中断复用寄存器)
通过 DSP data sheet 可以很容易找到寄存器的绝对地址,但为了减少配置错误和方便移
植,在编程时一般采用 CSL 函数对中断寄存进行配置。

4.  CSL(DSP API 函数)函数使用说明
在开发 DSP 的过程中一定要用好 CSL 函数,它给 DSP 的编程带来很多方便。使用 CSL
函数可以使程序更容易理解和维护,同时可以有效避免在编程中的笔误。
 
IRQ_clear(IRQ_EVT_TINT0);//对 IFR寄存器进行操作,定时中断标志位清零
IRQ_enable(IRQ_EVT_TINT0;//对 IER寄存器进行操作,使能定时中断
IRQ_map(IRQ_EVT_TINT0,12);//对 MUX 寄存器进行配置,根据需要把中断号进行重新映
射。
IRQ_globalEnable();//对CSR 中 GIE 标志位进行配置,标志位置 1;
。。。。。。。。。。。。。
 
相应的 CSL函数可以在 CCS自带的PDF 文档《TMS320C6000Chip Support Library API
Reference Guide》中进行查找
 
5.  中断响应流程图 
 中断流程图
  

6.  中断过程描述
 
1.  上电复位,产生复位中断请求,上电中断无需确认,直接执行。
2.  STW    B0,*–B15;  进行现场保护
3.  MVKL  addr,B0;
MVKH  addr,B0;载入中断向量表,将中断向量表送入程序指针。
4.  B      B0;跳转至 B0 中存储的地址,执行中断向量表。
5.  执行_c_int00 进行初始化
6.  跳转至 main()执行 csl 函数,IO口,定时器等初始化。
7.  执行 while 循环。
8.  定时时间到,产生定时中断。
9.  重复执行 2-4步骤
10.  执行中断服务程序 c_int14。
11.  中断返回
12.  LDW    *B15++,B0  恢复现场。
13.  继续执行 while 循环。
 
7.  中断程序解析
void main()
{
           
           CSL_init();//CSL函数初始化
 
           Htimer = TIMER_open(TIMER_DEV0,TIMER_OPEN_RESET);//打开定时器 0,返回定
时器句柄
           TimerEventId = TIMER_getEventId(Htimer);//取得定时事件 ID
           TIMER_config(Htimer,&Mtimer_configA);//配置定时器
 
           Hgpio  = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);//打开 IO
           GPIO_config(Hgpio,&Mgpio_config);//配置 IO
 
           IRQ_setVecs(vectors);//重新设置中断向量,
           IRQ_globalEnable();//全局中断使能
           IRQ_nmiEnable(); 
           IRQ_map(TimerEventId,14);//把定时中断重新映射到 14
           IRQ_reset(TimerEventId);
           IRQ_enable(TimerEventId);//
 
           TIMER_start(Htimer);//定时开始
 
    while(1);//死循环
 
           TIMER_close(Htimer);
           GPIO_close(Hgpio);

}
/**********************************************************************
*  中断服务程序
**********************************************************************/
interrupt void c_int14(void)//中断服务程序
{
    if(flag==0)
    {
                GPIO_pinWrite(Hgpio,GPIO_PIN3,flag); 
                flag=1;
           }
           else
           {
                GPIO_pinWrite(Hgpio,GPIO_PIN3,1); //点灯
                flag=0;
           }
}
 
*——————————————————————————
* Global symbols defined here and exported out of this file
*——————————————————————————
    .global _vectors//全局标号,可以在别处使用.
    .global _c_int00
    .global _vector1
    .global _vector2
    .global _vector3
    .global _vector4
    .global _vector5
    .global _vector6
    .global _vector7
    .global _vector8
   .global _vector9          
    .global _vector10  
    .global _vector11    
    .global _vector12  
    .global _vector13    
    .global _c_int14  ; Hookup the c_int14 ISR in main()
    .global _vector15
 
*——————————————————————————
* Global symbols referenced in this file but defined somewhere else.  
* Remember that your interrupt service routines need to be referenced here.
*——————————————————————————
    .ref _c_int00//相当于 extern,在这里引用,在别处定义

*——————————————————————————
* This is a macro that instantiates one entry in the interrupt service table.
*——————————————————————————
VEC_ENTRY .macro addr//定义中断向量入口地址
 
    STW   B0,*–B15;保存B0 内容,中断产生后执行的第一条指令
    MVKL  addr,B0;
      MVKH  addr,B0;//把地址装入 B0
    B     B0;跳转至 B0 中存储的地址
    LDW   *B15++,B0;恢复B0内容; 由于C6000流水线的原因,跳转后仍然可以执行多条指                 
令
    NOP   2
    NOP   
    NOP   
    .endm
 
 
*——————————————————————————
* This is a dummy interrupt service routine used to initialize the IST.
*——————————————————————————
_vec_dummy:未定义中断服务程序
  B     B3;其他没有定义的中断跳转至 B3 存储的地址
  NOP  5
 
*——————————————————————————
* This is the actual interrupt service table (IST). It is properly aligned and
* is located in the subsection .text:vecs. This means if you don’t explicitly
* specify this section in your linker command file, it will default and link
* into the .text section. Remember to set the ISTP register to point to this
* table.
*——————————————————————————
.sect “.text:vecs”;定义段
.align 1024;1024 字节对边界对齐
 
_vectors:
_vector0:    VEC_ENTRY _c_int00      ;RESET  跳转到_c_int00 ,_c_int00是 c语言程序的入口
_vector1:    VEC_ENTRY _vec_dummy  ;NMI
_vector2:    VEC_ENTRY _vec_dummy  ;RSVD
_vector3:    VEC_ENTRY _vec_dummy ;  所有未定义中断均跳转到同一地址
_vector4:    VEC_ENTRY _vec_dummy
_vector5:    VEC_ENTRY _vec_dummy
_vector6:    VEC_ENTRY _vec_dummy
_vector7:    VEC_ENTRY _vec_dummy

_vector8:    VEC_ENTRY _vec_dummy
_vector9:    VEC_ENTRY _vec_dummy
_vector10:  VEC_ENTRY _vec_dummy
_vector11:  VEC_ENTRY _vec_dummy
_vector12:  VEC_ENTRY _vec_dummy
_vector13:  VEC_ENTRY _vec_dummy
_vector14:  VEC_ENTRY _c_int14  ; Hookup the c_int14 ISR in main()  定时中断中断向量
_vector15:  VEC_ENTRY _vec_dummy
 
*——————————————————————————————————

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149065.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号