上级目录TMS320F28335.CCS12使用教程
想直接看应用的可以直接跳到配置步骤
中断介绍
因为dsp的cpu级别中断线比较少,所以发明了peripheral interrupt expansion (PIE)模块,在DSP28335中,PIE模块将12根cpu级别中断线扩展成了12组中断,每组包含8个中断源。中断源中存储的是中断地址。
cpu级别的中断线有:INT1-INT14, RTOSINT, DLOGINT
多路复用的中断源如下图(图中只有复用的中断线,没在图中的是直接到cpu的中断线)
中断是中断源先到PIE,再到cpu
PIEIFRx.y(x:1-12,y:1-8)
经典的中断响应流程:
发生中断后,cpu会从PIE模块中获取中断服务程序的地址(PIE模块根据PIEIFR和PIEIER寄存器的值确定是哪个中断,然后提供给cpu对应中断服务程序的地址),PIEIFRx.y会自动清零,中断对应组的PIEACKx会置位,PIEACKx需要手动清零。
遵循的一些主要规则:
针对规则3
中断产生流程:
DSP28335中固化了优先级,如INT1.1和INT1.8同时发生,则先响应INT1.1,再响应INT1.8,如果INT1.1和INT8.1同时发生,则先响应INT1.1,再响应INT8.1。
关于外设对应的中断线的位置都是硬件已经固定的,所以使用时要参考中断向量表(中断向量表不能随意更改)。
配置:(注意看注释)
step1,:开PIE和cpu中断,第一步都相同
关于PIE和cpu中断开启过程如下:(以SCIA接收中断为例)
//
// EnableInterrupts - This function enables the PIE module and CPU interrupts
//
void EnableInterrupts()
{
//
// Enable the PIE
//
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
//
// Enables PIE to drive a pulse into the CPU
//
PieCtrlRegs.PIEACK.all = 0xFFFF;//写1清除对应中断组响应标记,只有12个中断线,其余位写1没影响
//
// Enable Interrupts at the CPU level
//
EINT;
// 使用SCIA接收中断举例,SCIA接收中断为INT9.1,即第九组中断的第一个中断
//(对应中断需要查看技术手册,根据PIE中断向量表确定中断是第几组第几个)
PieCtrlRegs.PIEIER9.all = 0xFF;//第九组PIE中断使能,只有INT9.1-INT9.8
IER|=M_INT9;//使能cpu级别中断对应的中断线
}
开启了PIE中断和cpu中断后,需要使能相应的所需要的外设或者外部中断
step2:开对应外设中断,需要查询对应外设寄存器,看哪些寄存器配置后可以产生中断
void scia_init()
{
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
//SciaRegs.SCICTL2.all =0; //关闭接收发送中断
SciaRegs.SCICTL2.all =2; //开启SCIA接收中断
SciaRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz.
SciaRegs.SCILBAUD =0x00E7;
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
step3:中断服务子程序,注意清除对应中断组的响应标志(PIE中断都有这一步),这个是需要手动清除的。如果对应外设中有需要手动清除的位,注意别忘了清除(不同外设情况不同,SCIA接收中断没有需要清除的位)
中断处理程序:
//
// SCIRXINTA_ISR - INT9.1
//
interrupt void
SCIRXINTA_ISR(void) // SCI-A
{
//
// Insert ISR Code here
//
TestSciRXINT_loopback();//中断服务子程序
//
// To receive more interrupts from this PIE group, acknowledge this
// interrupt
//可以直接把对应组赋值给PIEACK.all,例如PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
//PIEACK_GROUP9是在DSP2833x_DefaultIsr.c文件中宏定义的
//PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;//这种方式可以
PieCtrlRegs.PIEACK.bit.ACK9 = 1;//写入1清除响应标志,也可以直接在对应位写入1,注意,是写1清除响应标志
//
// Next two lines for debug only to halt the processor here
// Remove after inserting ISR Code
//
// asm (" ESTOP0");
// for(;;);
}
中断现象参考SCI接收中断
结束。