OMAP-L138的新历程之DSP6748中断intc(6)
- 格式:doc
- 大小:177.50 KB
- 文档页数:5
OMAP-L138的新历程之DSP6748中断intc(6)
其实ti的C6000系列的dsp设计基本上差不多,就是不同的cpu片上的资源不一样而已,大家可以以前看过我前面的文章《DSP(TMS320C6713)入门之旅(三、中断的理解和使用)》这个讲了dsp中断的一些概念和基本的使用方法。
在此我也不想把前面的内容copy过来了,我这儿只说重点注意和实现的源代码。
首先我们来看看dsp的中断控制模块:
The interrupt co ntroller outputs signals to the C674x CPU fro m these event inputs: • One maskable, hardware exception (EXCEP)
• Twelve maskable hardware interrupts (INT4 thro ugh INT15)
• One non-maskable signal that yo u can use as either an interrupt o r an exceptio n (NMI)
• One reset signal (RESET)
我们的cpu只接受四种类型的中断产生的,那我们一般常用的只有那12个可标识的硬件中断,但是我们的omapl138有多大0~127个中断,那么我们要使用的时候也得映射,这样一对多来达到我们对各个外设的服务要求。
最终我们通过映射得到如图所示的效果:
这样就安装完成了我们的dsp中断,674x系列和前面的6713不一样的地方主要是多了一些应答,比如说当cpu处理不过来的时候就可以放弃一些中断,或者中断服务时间太长也可以放弃。
废话就少说了,我们还是实例吧,这儿我有用了timer0作为中断源,还是先是关闭全局中断,然后设置intc 和中断向量表,安装timer0的中断向量和映射中断到INT4~INT15中的某一个,最后使能子中断和打开全局中断!
void main()
{
unsigned int i;
InitDspIntc();
initTimer();
while(1)
{
LED=0;
for(i=0;i<0x000fffff;i++);
LED=0×2;
for(i=0;i<0x000fffff;i++);
}
}
void InitDspIntc()
{
IRQ_globalDisable();
CSL_FINST(intcRegs->EVTCLR[0], DSPINTC_EVTCLR_EC4, SET);
CSL_FINS(intcRegs->INTMUX3, DSPINTC_INTMUX3_INTSEL12, T64P0_TINT12_EVT);
/* set ISTP to point to the vector table address */
IRQ_setVecs(intcVecto rTable);
/* clear all interrupts, bits 4 thru 15 */
IRQ_disable(0xFFF0);
/* enable the bits fo r non maskable interrupt 12 and NMIE*/
IRQ_enable(0×1002);
/* enable interrupts, set GIE bit */
IRQ_globalEnable();
}
void initTimer()
{
v oid resetTimer(unsigned int tmrNum);
v oid _irqTIMER0(void);
resetTimer(0); // half of this timer is used for rtos tick
resetTimer(1); // This timer is not used in this applicatio n
TMR_REGS[0]->PRD12 = 0xfffff;
// Set up DUAL 32-bit on Timer0
TMR_REGS[0]->TGCR = CSL_FMKT(TMR_TGCR_TIMMODE, 32BIT_UNCHAIN) | CSL_FMKT(TMR_TGCR_PLUSEN, ENABLE);
TMR_REGS[0]->EMUMGT = 1; // run in emulation mode as well
TMR_REGS[0]->INTCTLSTAT = CSL_FMKT(TMR_INTCTLSTAT_PRDINTEN34, DISABLE) | CSL_FMKT(TMR_INTCTLSTAT_PRDINTSTAT34, PEND) |
CSL_FMKT(TMR_INTCTLSTAT_PRDINTEN12, ENABLE) |
CSL_FMKT(TMR_INTCTLSTAT_PRDINTSTAT12, PEND);
TMR_REGS[0]->TGCR |= CSL_FMKT(TMR_TGCR_TIM34RS, NO_RESET) |
CSL_FMKT(TMR_TGCR_TIM12RS, NO_RESET);
TMR_REGS[0]->REL12=0xfffff;
// Enable Timer fo r continuo us operatio n
CSL_FINST(TMR_REGS[0]->TCR, TMR_TCR_ENAMODE12, EN_CONTRELOAD);
return;
}
_intcVectorTable:
_vecto r0: VEC_ENTRY _c_int00 ;RESET
_vector1: VEC_ENTRY _vec_dummy ;NMI
_vecto r2: VEC_ENTRY _vec_dummy ;RSVD
_vecto r3: VEC_ENTRY _vec_dummy ;RSVD
_vecto r4: VEC_ENTRY _vec_dummy;isr0
_vecto r5: VEC_ENTRY _vec_dummy ;isr1
_vecto r6: VEC_ENTRY _vec_dummy;isr2
_vecto r7: VEC_ENTRY _vec_dummy ;isr3
_vecto r8: VEC_ENTRY _vec_dummy ;isr4
_vecto r9: VEC_ENTRY _vec_dummy;isr5
_vecto r10: VEC_ENTRY _vec_dummy ;isr6
_vecto r11: VEC_ENTRY _vec_dummy ;isr7
_vecto r12: VEC_ENTRY _Timer0Handler;isr8
interrupt v o id Timer0Handler()
{
CSL_FINST(TMR_REGS[0]->INTCTLSTAT, TMR_INTCTLSTAT_EVTINTEN12, SHIFT); }。