前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c6000 中断小结

c6000 中断小结

作者头像
全栈程序员站长
发布2022-07-04 10:17:05
5840
发布2022-07-04 10:17:05
举报
文章被收录于专栏:全栈程序员必看

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

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.cn/149065.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档