📄 gpio.c
字号:
#include "DSP28_Device.h"
// void Delay(long z);
void InitSysCtrl(void);
void IntiGpio(void);
void InitPieCtrl(void);
void InitPieVectTable(void);
void InitCpuTimers(void);
void ConfigCpuTimer(struct CPUTIMER_VARS *timer,float Freq,float Period);
interrupt void cpu_timer0_isr(void);
void main(void)
{
unsigned int i;
// LED显示设置
unsigned int LED[8]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080};
// 清CPU中断
DINT;
IER=0x0000;
IFR=0x0000;
// EINT;
// 系统初始化
InitSysCtrl();
// 初始化通用输入输出口GPIO
InitGpio();
// 初始化PIE
InitPieCtrl();
// 初始化中断向量表
InitPieVectTable();
// 对PIE向量表中的定时器Timer0的中断入口向量进行重新映射(赋值)
EALLOW;
PieVectTable.TINT0=&cpu_timer0_isr;
EDIS;
// 初始化定时器Timer0
InitCpuTimers();
// 将CPU定时器Timer0配置成每隔50ms中断一次,CPU主频为150MHz,定时器的周期为50000us
ConfigCpuTimer(&CpuTimer0,150,50000);
// 使能PIE中的TINT0中断
PieCtrl.PIEIER1.bit.INTx7=1;
// 使能和定时器Timer0中断相连的CPU中断
IER=0x0001;
EINT; // 使能全局中断位
ERTM; // 使能全局实时调试中断DBGM
// 启动CPU定时器Timer0
CpuTimer0Regs.TCR.bit.TSS=0;
while(1)
{
for(i=0;i<16;i++)
{
if(i<8) GpioDataRegs.GPADAT.all=LED[i];
else GpioDataRegs.GPADAT.all=LED[15-i];
// Delay((long)50000*(long)(GpioDataRegs.GPADAT.all>>8)+1000);
while(CpuTimer0.InterruptCount<3); // 等待直到定时器0的中断服务被调用了3次
CpuTimer0.InterruptCount=0; // 将中断计数器清零
}
}
}
/*void Delay(long z)
{
long i;
for(i=0;i<z;i++) {}
}
*/
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
// 对该中断作出应答,从而能够响应分组1中的其他中断
PieCtrl.PIEACK.all=PIEACK_GROUP1; // 清除PIE分组1的中断响应位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -