//#####################################################################
// 文件: DSP281x_Gpio.c
// 说明: DSP281x 通用I/O初始化函数
//#####################################################################
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
// 初始化GPIO,该函数将GPIO初始化到已知状态
void InitGpio(void)
{
//设置GPIO A 口引脚,AL(位7:0)(输入)-AH(位15:8))(输出)
//输入采样限定值=0,不限定
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0000;
GpioMuxRegs.GPADIR.all = 0xFF00; //高字节输出,低字节输入
GpioMuxRegs.GPAQUAL.all = 0x0000; //输入采样限定关闭
//设置GPIO B口引脚为EVB信号
//输入采样限定值=0,不限定
//将位写1配置为片内外设功能
GpioMuxRegs.GPBMUX.all = 0xFFFF;
GpioMuxRegs.GPBQUAL.all = 0x0000; //输入采样限定关闭
EDIS;
}
//#####################################################################
// 文件: Example_281xGpioToggle.c
// 说明: DSP281x 芯片GPIO 反转触发测试程序
//#####################################################################
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
//选择被编译的例子,只有一个例子设为1,其他的设为0
#define EXAMPLE1 1 //使用DATA 寄存器触发I/O引脚
#define EXAMPLE2 0 //使用SET/CLEAR寄存器触发I/O引脚
#define EXAMPLE3 0 //使用 TOGGLE寄存器触发I/O引脚
//文件中定义的函数原型声明
void delay_loop(void);
void Gpio_select(void);
void Gpio_example1(void);
void Gpio_example2(void);
void Gpio_example3(void);
void main(void)
{
//Step 1.系统初始化系统控制:PLL、看门狗、使能外部时钟
InitSysCtrl();
//Step 2. 初始化 GPIO
//InitGpio(); //本例中采用下面的配置,跳过
Gpio_select();
//Step 3.清除所有中断,初始化PIE向量表
DINT; //关全局中断
InitPieCtrl();
IER = 0x0000; //关CPU级中断
IFR = 0x0000; //清除所有CPU级中断标志位
InitPieVectTable();
//Step 4. 用户代码
#if EXAMPLE1 //本例使用DATA 寄存器触发I/O引脚
Gpio_example1();
#endif // - EXAMPLE1
#if EXAMPLE2 //本例使用SET/CLEAR寄存器触发I/O引脚
Gpio_example1();
#endif
#if EXAMPLE3 //本例使用TOGGLE寄存器触发I/O引脚
Gpio_example3();
#endif
}
void delay_loop()
{
short i;
for (i = 0; i < 1000; i++) {}
}
void Gpio_example1(void)
{
//用DATA寄存器触发I/O引脚。注意:当使用DATA寄存器输入值可能丢失,如果在
//I/O口有输入数据,最好使用CLEAR/SET/TOGGLE寄存器代替
while(1)
{
GpioDataRegs.GPADAT.all = 0xAAAA;
GpioDataRegs.GPBDAT.all = 0xAAAA;
GpioDataRegs.GPDDAT.all = 0x0022;
GpioDataRegs.GPEDAT.all = 0x0002;
GpioDataRegs.GPFDAT.all = 0xAAAA;
GpioDataRegs.GPGDAT.all = 0x0020;
delay_loop();
GpioDataRegs.GPADAT.all = 0x5555;
GpioDataRegs.GPBDAT.all = 0x5555;
GpioDataRegs.GPDDAT.all = 0x0041; //仅有4个I/O引脚
GpioDataRegs.GPEDAT.all = 0x0005; //仅有3个I/O引脚
GpioDataRegs.GPFDAT.all = 0x5555;
GpioDataRegs.GPGDAT.all = 0x0010; //仅有2个I/O引脚
delay_loop();
}
}
void Gpio_example2(void)
{
//用SET/CLEAR寄存器触发I/O引脚
while(1)
{
GpioDataRegs.GPASET.all = 0xAAAA;
GpioDataRegs.GPACLEAR.all = 0x5555;
GpioDataRegs.GPBSET.all = 0xAAAA;
GpioDataRegs.GPBCLEAR.all = 0x5555;
GpioDataRegs.GPDSET.all = 0x0022;
GpioDataRegs.GPDCLEAR.all = 0x0041; //仅有4个I/O引脚
GpioDataRegs.GPESET.all = 0x0002;
GpioDataRegs.GPECLEAR.all = 0x0005; //仅有3个I/O引脚
GpioDataRegs.GPFSET.all = 0xAAAA;
GpioDataRegs.GPFCLEAR.all = 0x5555;
GpioDataRegs.GPGSET.all = 0x0020;
GpioDataRegs.GPGCLEAR.all = 0x0010; //仅有2个I/O引脚
delay_loop();
GpioDataRegs.GPACLEAR.all = 0xAAAA;
GpioDataRegs.GPASET.all = 0x5555;
GpioDataRegs.GPBCLEAR.all = 0xAAAA;
GpioDataRegs.GPBSET.all = 0x5555;
GpioDataRegs.GPDCLEAR.all = 0x0022;
GpioDataRegs.GPDSET.all = 0x0041; //仅有4个I/O引脚
GpioDataRegs.GPECLEAR.all = 0x0002;
GpioDataRegs.GPESET.all = 0x0005; //仅有3个I/O引脚
GpioDataRegs.GPFCLEAR.all = 0xAAAA;
GpioDataRegs.GPFSET.all = 0x5555;
GpioDataRegs.GPGCLEAR.all = 0x0020;
GpioDataRegs.GPGSET.all = 0x0010; //仅有2个I/O引脚
delay_loop();
}
}
void Gpio_example3(void)
{
//用TOGGLE寄存器触发I/O引脚,设置引脚为已知状态
GpioDataRegs.GPASET.all = 0xAAAA;
GpioDataRegs.GPACLEAR.all = 0x5555;
GpioDataRegs.GPBSET.all = 0xAAAA;
GpioDataRegs.GPBCLEAR.all = 0x5555;
GpioDataRegs.GPDSET.all = 0x0022;
GpioDataRegs.GPDCLEAR.all = 0x0041; //仅有4个I/O引脚
GpioDataRegs.GPESET.all = 0x0002;
GpioDataRegs.GPECLEAR.all = 0x0005; //仅有3个I/O引脚
GpioDataRegs.GPFSET.all = 0xAAAA;
GpioDataRegs.GPFCLEAR.all = 0x5555;
GpioDataRegs.GPGSET.all = 0x0020;
GpioDataRegs.GPGCLEAR.all = 0x0010; //仅有2个I/O引脚
//用TOGGLE寄存器反转引脚状态,任何位写1反转,写0不反转
while(1)
{
GpioDataRegs.GPATOGGLE.all = 0xFFFF;
GpioDataRegs.GPBTOGGLE.all = 0xFFFF;
GpioDataRegs.GPDTOGGLE.all = 0xFFFF;
GpioDataRegs.GPETOGGLE.all = 0xFFFF;
GpioDataRegs.GPFTOGGLE.all = 0xFFFF;
GpioDataRegs.GPGTOGGLE.all = 0xFFFF;
delay_loop();
}
}
void Gpio_select(void)
{
Uint16 var1;
Uint16 var2;
Uint16 var3;
var1= 0x0000; //设置GPIO多路复用为I/O功能
var2= 0xFFFF; //设置GPIO方向为输出
var3= 0x0000; //设置输入采样限定值
EALLOW;
GpioMuxRegs.GPAMUX.all = var1;
GpioMuxRegs.GPBMUX.all = var1;
GpioMuxRegs.GPDMUX.all = var1;
GpioMuxRegs.GPFMUX.all = var1;
GpioMuxRegs.GPEMUX.all = var1;
GpioMuxRegs.GPGMUX.all = var1;
GpioMuxRegs.GPADIR.all = var2; //GPIO 方向为输出
GpioMuxRegs.GPBDIR.all = var2; //GPIO 方向为输出
GpioMuxRegs.GPDDIR.all = var2;
GpioMuxRegs.GPEDIR.all = var2;
GpioMuxRegs.GPFDIR.all = var2;
GpioMuxRegs.GPGDIR.all = var2;
GpioMuxRegs.GPAQUAL.all = var3; //设置输入采样限定值
GpioMuxRegs.GPBQUAL.all = var3;
GpioMuxRegs.GPDQUAL.all = var3;
GpioMuxRegs.GPEQUAL.all = var3;
EDIS;
}