DM6437 定时中断设置
中断向量都配置了 ,不过main函数中 具体的定时中断使能程序怎么弄?求教大神指导。。 参照以下看看1. 编写中断服务例程
在.c源文件中编写ISR函数c_intXX,用于中断处理,如:
interrupt void c_intXX (void)
{
…;
}
注:对于硬件中断而言,XX = 00~15。
2.初始化中断向量表,并在内存段中的中断向量表中配置好对应的中断向量
首先是把中断向量表定位到某一内存段中,我们可以在cmd文件中配置中断向量表的内存映射,如:
MEMORY
{
VECS: o = 0x10800000 l = 0x00000400
MEMTEST: o = 0x10800400 l = 0x00000200
IRAM: o = 0x10800600 l = 0x0001FA00
DDR2: o = 0x80000000 l = 0x10000000
}
SECTIONS
{
.bss > IRAM
.cinit > IRAM
.cio > IRAM
.const > IRAM
.data > IRAM
.far > IRAM
.stack > IRAM
.switch > IRAM
.sysmem > IRAM
.text > IRAM
.vecs > VECS
.ddr2 > DDR2
}
然后建立一个.asm文件,用以配置中断向量表中的中断向量,我们需要声明一些全局变量,以便其他源文件可以引用这些变量或者引用其他源文件的变量,如:
*-----------------------------------------------------------------* Global symbols defined here and exported out of this file
*-------------------------------------------------------------------- .global _vectors
.global _c_int00
.global _vector1
.global _vector2 ;RSVD保留
.global _vector3 ;RSVD保留
.global _vector4
.global _vector5
.global _vector6
.global _vector7
.global _vector8
.global _vector9
.global _vector10
.global _vector11
.global _vector12
.global _vector13
.global _c_int14_vencint ; Hookup the c_int14 ISR in main()
.global _vector15
因为引用了rts的_c_int00中断,即RESET中断,因此需要引入这个符号:
.ref _c_int00
为了把中断服务例程的地址,即中断向量插入到中断向量表中,可以定义一个宏:
VEC_ENTRY .macro addr
STW B0,*--B15
MVKL addr,B0
MVKH addr,B0
B B0
LDW *B15++,B0
NOP 2
NOP
NOP
.endm
为了初始化中断向量表中的中断向量,可以定义一个虚拟的中断向量:
_vec_dummy:
B B3
NOP 5
接下来就可以配置中断向量表了:
.sect “.vecs”
.align 1024
_vectors:
_vector0: VEC_ENTRY _c_int00 ;RESET中断
_vector1: VEC_ENTRY _vec_dummy ;NMI不可屏蔽中断
_vector2: VEC_ENTRY _vec_dummy ;保留中断1
_vector3: VEC_ENTRY _vec_dummy ;保留中断2
_vector4: VEC_ENTRY _vec_dummy ;外部中断INT4
_vector5: VEC_ENTRY _vec_dummy ;外部中断INT5
_vector6: VEC_ENTRY _vec_dummy ;外部中断INT6
_vector7: VEC_ENTRY _vec_dummy ;外部中断INT7
_vector8: VEC_ENTRY _c_int08 ; EDMA控制器中断EDMAINT,对应于c_int08 ISR
_vector9: VEC_ENTRY _vec_dummy;JTAGRTDX中断
_vector10: VEC_ENTRY _vec_dummy;EMIF_SDRAM_Timer中断
_vector11: VEC_ENTRY _vec_dummy;McBSP_0_Receive中断
_vector12: VEC_ENTRY _vec_dummy;McBSP_1_Transmit中断
_vector13: VEC_ENTRY _vec_dummy;Host_Port_Host_to_DSP中断
_vector14: VEC_ENTRY _vec_dummy;Timer0中断
_vector15: VEC_ENTRY _vec_dummy;Timer1中断
3. 在C程序中指定定义的中断向量表,并且启用CPU中断功能
在C程序中,用CSL的IRQ模块来设置中断比较方便,在设置之前,需要外部链接上面的asm程序的中断向量表符号:
extern far void vectors();//之所以为vectors,因为C编译器编译后自动改名其为_vectors
引用了中断向量表之后,就可以设置中断了:
IRQ_setVecs(vectors); //指向asm中定义的中断向量表
IRQ_nmiEnable();
IRQ_globalEnable();
IRQ_map(IRQ_EVT_EDMAINT, 8); //映射事件到指定的物理中断号
IRQ_reset(IRQ_EVT_EDMAINT);
4.启动中断源,如venc中断
至此,中断服务例程c_int14_vencint 就可以为venc中断服务了,其它硬件中断向量的配置同理。 参考一下楼上朋友的分享
DM6437应用向DSP/BIOS中增加硬中断
64+的中断系统和以往的不同,中断是基于事件的。整个硬件CPU接收15个中断,但中断源可以支持最多128个。64+将中断源视为事件"Event",128个事件可以分别通过配置连接到15个CPU中断。而128个事件每连续32个可以合并到四个固定的事件中,即Event0(对应事件号0-31)、Event1(对应事件号32-63)、Event2(对应事件号64-95)、Event3(对应事件号96-127)(实际最大有效中断源为124个)。这样可以通过数量有限的CPU中断来管理大量的中断源,使用灵活。DSP/BIOS默认将Event0-3分别对应到HWI_INT7-10四个中断号。TI驱动通过注册Event到这四个事件,进而对应到相应中断。在中断HWI_INT7-10服务函数中再去判断具体是哪个事件触发的中断。
另外还有几个中断是系统硬件复位中断、NMI中断、预保留中断及仿真通讯中断。HWI_INT4-6、HWI_INT13、HWI_INT15这5个中断是未使用中断。用户增加中断服务的话,可以将事件号对应到这5个中断来实现。
以T1高32位定时中断为例,介绍一下DM6437应用中如何在DSP/BIOS操作系统中实现硬件中断。首先用户需要将T1配置为双32位定时器,T1高32位定时器中断服务函数为 T1HIsr()。将事件对应到中断HWI_INT5。
1 在DSP/BIOS图形配置界面下打开"Scheduling"->"HWI-Hardware Interrupu Service"。
2 下拉表中有15个中断。观察各中断使用情况。右键点击"HWI_INT5",弹出下拉菜单中选"Properties"进入中断属性编辑栏。在"General"栏中,"interrpu selection number"项填入事件号"7"(6437数据手册中有中断源对应的事件号)。"function"项填入中断服务函数名"_T1HIsr"(需在C语言编写的函数前加下划线)。然后点"应用","确定"即可退出。
注:一些人说还要在"Dispatcher"中勾选"Use Dispatcher"前的复选框。那是复合事件Event0-3才需要的,所以HWI_INT7-10四个中断里的"Use Dispatcher"需要勾上。如果用户定义的新中断不是使用复合事件而是使用单一事件触发的话不需要勾选。但勾选的话不会影响使用。因为新中断未使用Event0-3。
3 在应用程序中使能中断。如"C64_enableIER( 1 << 5 )" 使能中断HWI_INT5。
4 编写中断服务函数"void T1HIsr()"。
注。仿真器通讯中断可能对新中断有影响,有可能导致中断表现不正常。可以在"release"下编译,以减少仿真引起的大量中断。
楼主成功了吗?最近我也在弄,成功的话能不能分享的经验
页:
[1]