DSP相关笔记_4:LaunchXL-F28379D的简单教程系列(三)X-Bar与GPIO中断-下
注:
1)这是本人关于Ti的C2000系列的学习笔记,所用工具有官方的开发软件CCS10版本,帮助文库以及函数库软件controlSUITE。硬件部分LaunchXL-F28379D和逻辑分析仪一台。
2) DSP相关笔记_1:LaunchXL-F28379D的简单教程系列(一)GPIO输出
3) DSP相关笔记_2:LaunchXL-F28379D的简单教程系列(二)GPIO输入
4) DSP相关笔记_3:LaunchXL-F28379D的简单教程系列(三)X-Bar与GPIO中断-上
前言:这章会阐述PIE的简单功能实现,需要大家在配好X-BAR和XINT的前提下。
Peripheral Interrupt Expansion (PIE) 它属于系统控制一块,简单解释就是管理各种中断的设备。通过上一张配好的XINT中断与PIE连接,在通过PIE来进行管理,这里只是简单说明PIE的实现步骤。
老规矩上图:
设备中断结构图:
单个中断的图:
从上图可以知道要完成中断需要对INT1-INT14,14组中断组进行选择,并且每一组又有16个通道,选择你所需中断对应的组和通道完成对PIE的配置。
如下图:
如图我们可以知道,如果要完成对XINT1的配置则需要选择,第一组XIN1.y与第四通道INTx.4进行组合即可。当然只完成对PIE配置,还并没有完成对整个中断过程的配置,还需要对IER和INTM寄存器进行中断开启的配置,而IFR需要在初始化的时候复位操作。
其次在完成以上操作的时候,接下来就是完成中断服务函数ISR中的编写(这里直接可以参考代码部分),其中需要注意是清除中断组的PIEACK位,否则中断会出现异常。
官方的原话:
实现内容是:
通过GPIO0(input)接受GPIO2(output),如果产生下降沿触发中断XINT1,XINT1_ISR中控制GPIO1(output)输出方波数量为i。
代码部分:(后面的内容可能就部分寄存器和函数版了,能用官方给的函数,就用可以节约时间点,没有到时候根据手册实现流程自己写也可以。)
#include "F28x_Project.h"
void DelaySoftwore(void);//延时函数
void Gpio_Init(void);//GPIO初始化函数
void GpioInter_Init(void);//GPIO中断初始化函数
interrupt void xint1_isr(void);//中断函数
//extern interrupt void XINT1_ISR(void);引入F2837XD_DefaultSR.c中官方写好的中断函数,自行在里面更改具体功能。
void main(void)
{
InitSysCtrl();
Gpio_Init();
DINT;//关闭中断
InitPieCtrl();//PIE初始化
IER = 0x0000;//IER复位
IFR = 0x0000;//IFR复位
InitPieVectTable();//中断向量表初始化,要使用
GpioInter_Init();
;
for(;;)
{
GPIO_WritePin(2,1);
DelaySoftwore();
GPIO_WritePin(2,0);
DelaySoftwore();
}
}
void Gpio_Init(void)
{
InitGpio();
GPIO_SetupPinMux(0,GPIO_MUX_CPU1,0x0);
GPIO_SetupPinOptions(0, GPIO_INPUT, GPIO_PULLUP);
GPIO_SetupPinMux(1,GPIO_MUX_CPU1,0x0);
GPIO_SetupPinOptions(1, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(2,GPIO_MUX_CPU1,0x0);
GPIO_SetupPinOptions(2, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupXINT1Gpio(0);
EALLOW;//控制寄存器写保护
XintRegs.XINT1CR.bit.POLARITY = 0;//0:下降沿触发,1:上升沿触发
XintRegs.XINT1CR.bit.ENABLE = 1;//1:启动XINT中断
EDIS;//控制寄存器关闭写保护
}
void GpioInter_Init(void)
{
EALLOW;
PieVectTable.XINT1_INT = &xint1_isr;//更改中断函数,如果这句不下相当于下面这句
//PieVectTable.XINT1_INT = &XINT1_ISR; 需要增加一个包含了所有中断函数的文件找XINT1_ISR进行修改就行:F2837XD_DefaultSR.c这个文件。
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;
IER |= M_INT1;
EINT;
}
void DelaySoftwore(void)
{
Uint16 i = 200;
while(i>0)
i--;
}
interrupt void xint1_isr(void)
{
int i;
for(i=20;i>0;i--)
{
GPIO_WritePin(1,0);
DelaySoftwore();
GPIO_WritePin(1,1);
DelaySoftwore();
GPIO_WritePin(1,0);
DelaySoftwore();
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//这个一定要有,并且根据是第几所属第几组更改,F2837XD_DefaultSR.c也有提示。不清楚可以参考这里的组次。
}
结果:就是分析仪上会循环产生20个方波,忘记拍图了。。。。。。尴尬,不过问题不大,都比较简单。
总结:GPIO的中断需要配合X-BAR通过XINT来触发中断,再利用进行PIE对中断的管理,它们的优先级都可以从参考手册查到。后面我们就先把常用的数据传输协议说了,再玩高级的,预计IIC->SPI这样的过程。应该存在很多问题,我这个也只是提供简单的思路吧,有问题留言我会及时更改我的笔记的。
参考资料:(这次参考资料是三本)
[1] TMS320F2837XD Dual-Core Microcontollers Technical Reference Manual
[2] TMS320x281x DSP System Control and Interrupts Reference Guide
[3] TMS320C28x CPU and Instruction Set Reference Guide