📄 ext_int.c
字号:
#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"
#define SetData GpioDataRegs.GPFDAT.bit.GPIOF0 = 1
#define ClrData GpioDataRegs.GPFDAT.bit.GPIOF0 = 0
#define SetClk GpioDataRegs.GPFDAT.bit.GPIOF2 = 1
#define ClrClk GpioDataRegs.GPFDAT.bit.GPIOF2 = 0
unsigned int *LedReg = (unsigned int *)0x23FF; //LED 控制寄存器
unsigned int *Led8Lock = (unsigned int *)0x25FF;
unsigned int *ExtIEReg = (unsigned int *) 0x29FF; //扩展中断控制寄存器,产生中断时置1,必须软件清零
unsigned int *ExtIFReg = (unsigned int *) 0x2FFF; //扩展中断标志寄存器,有中断产生时置1
const Uint16 LedCode[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF};
const Uint16 SpiCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
Uint16 LedCount = 0;
Uint16 SpiCount = 0;
Uint16 ExtIntCounter = 5;
Uint16 T0Counter=0;
Uint16 T2Counter=0;
interrupt void ISRTimer0(void);
interrupt void ISRTimer2(void);
interrupt void ExtIntISR(void);
void SendData(Uint16 data);
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化外设*/
InitPeripherals();
*ExtIEReg = 0;
InitGpio();
InitXIntrupt();
*ExtIEReg = 1;
EALLOW;
PieVectTable.TINT0 = &ISRTimer0;
PieVectTable.TINT2 = &ISRTimer2;
PieVectTable.XINT1 = &ExtIntISR;
EDIS;
/*设置CPU*/
ConfigCpuTimer(&CpuTimer0, 10, 1000000);
ConfigCpuTimer(&CpuTimer2, 20, 1000000);
StartCpuTimer0();
StartCpuTimer2();
/*开中断*/
IER |= M_INT1;
IER |= M_INT14;
PieCtrl.PIEIER1.bit.INTx7=1;
PieCtrl.PIEIER1.bit.INTx4=1;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
*Led8Lock = 0XB7;
*LedReg = 0xFF;
for(;;);
}
interrupt void ISRTimer0(void)
{
PieCtrl.PIEACK.bit.ACK7=1;
T0Counter++;
if (T0Counter>=ExtIntCounter)
{
T0Counter = 0;
*LedReg = LedCode[LedCount];
LedCount++;
if (LedCount>8) LedCount=0;
}
}
interrupt void ISRTimer2(void)
{
T2Counter++;
if (T2Counter>=2*ExtIntCounter)
{
T2Counter = 0;
SendData(SpiCode[SpiCount]);
SpiCount++;
if (SpiCount>16) SpiCount=0;
}
}
interrupt void ExtIntISR(void)
{
Uint16 Temp;
PieCtrl.PIEACK.all = 0xFFFF;
PieCtrl.PIEIFR1.bit.INTx4 = 0;
ERTM;
Temp = *ExtIFReg;
Temp = Temp & 0x1F;
if (Temp==0x0F) ExtIntCounter--;
*ExtIEReg = 0;
if (ExtIntCounter<=0) ExtIntCounter = 5;
*ExtIEReg = 1;
}
void Delay(Uint16 data)
{
Uint16 i;
for (i=0;i<data;i++) { ; }
}
void SendData(Uint16 data)
{
Uint16 i,Temp;
Temp = 0x80;
for (i=0;i<8;i++)
{
if ((data & Temp)==0) ClrData;
else SetData;
Temp >>= 1;
ClrClk;
Delay(10);
SetClk;
}
*Led8Lock = 0xB7;
Delay(10);
*Led8Lock = 0xBF;
SetData;
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -