//#####################################################################
// 文件: DSP281x_Gpio.c
// 說(shuō)明: DSP281x 通用I/O初始化函數(shù)
//#####################################################################
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
// 初始化GPIO,該函數(shù)將GPIO初始化到已知狀態(tài)
void InitGpio(void)
{
//設(shè)置GPIO A 口引腳,AL(位7:0)(輸入)-AH(位15:8))(輸出)
//輸入采樣限定值=0,不限定
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0000;
GpioMuxRegs.GPADIR.all = 0xFF00; //高字節(jié)輸出,低字節(jié)輸入
GpioMuxRegs.GPAQUAL.all = 0x0000; //輸入采樣限定關(guān)閉
//設(shè)置GPIO B口引腳為EVB信號(hào)
//輸入采樣限定值=0,不限定
//將位寫1配置為片內(nèi)外設(shè)功能
GpioMuxRegs.GPBMUX.all = 0xFFFF;
GpioMuxRegs.GPBQUAL.all = 0x0000; //輸入采樣限定關(guān)閉
EDIS;
}
//#####################################################################
// 文件: Example_281xGpioToggle.c
// 說(shuō)明: DSP281x 芯片GPIO 反轉(zhuǎn)觸發(fā)測(cè)試程序
//#####################################################################
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
//選擇被編譯的例子,只有一個(gè)例子設(shè)為1,其他的設(shè)為0
#define EXAMPLE1 1 //使用DATA 寄存器觸發(fā)I/O引腳
#define EXAMPLE2 0 //使用SET/CLEAR寄存器觸發(fā)I/O引腳
#define EXAMPLE3 0 //使用 TOGGLE寄存器觸發(fā)I/O引腳
//文件中定義的函數(shù)原型聲明
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.系統(tǒng)初始化系統(tǒng)控制:PLL、看門狗、使能外部時(shí)鐘
InitSysCtrl();
//Step 2. 初始化 GPIO
//InitGpio(); //本例中采用下面的配置,跳過(guò)
Gpio_select();
//Step 3.清除所有中斷,初始化PIE向量表
DINT; //關(guān)全局中斷
InitPieCtrl();
IER = 0x0000; //關(guān)CPU級(jí)中斷
IFR = 0x0000; //清除所有CPU級(jí)中斷標(biāo)志位
InitPieVectTable();
//Step 4. 用戶代碼
#if EXAMPLE1 //本例使用DATA 寄存器觸發(fā)I/O引腳
Gpio_example1();
#endif // - EXAMPLE1
#if EXAMPLE2 //本例使用SET/CLEAR寄存器觸發(fā)I/O引腳
Gpio_example1();
#endif
#if EXAMPLE3 //本例使用TOGGLE寄存器觸發(fā)I/O引腳
Gpio_example3();
#endif
}
void delay_loop()
{
short i;
for (i = 0; i < 1000; i++) {}
}
void Gpio_example1(void)
{
//用DATA寄存器觸發(fā)I/O引腳。注意:當(dāng)使用DATA寄存器輸入值可能丟失,如果在
//I/O口有輸入數(shù)據(jù),最好使用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個(gè)I/O引腳
GpioDataRegs.GPEDAT.all = 0x0005; //僅有3個(gè)I/O引腳
GpioDataRegs.GPFDAT.all = 0x5555;
GpioDataRegs.GPGDAT.all = 0x0010; //僅有2個(gè)I/O引腳
delay_loop();
}
}
void Gpio_example2(void)
{
//用SET/CLEAR寄存器觸發(fā)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個(gè)I/O引腳
GpioDataRegs.GPESET.all = 0x0002;
GpioDataRegs.GPECLEAR.all = 0x0005; //僅有3個(gè)I/O引腳
GpioDataRegs.GPFSET.all = 0xAAAA;
GpioDataRegs.GPFCLEAR.all = 0x5555;
GpioDataRegs.GPGSET.all = 0x0020;
GpioDataRegs.GPGCLEAR.all = 0x0010; //僅有2個(gè)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個(gè)I/O引腳
GpioDataRegs.GPECLEAR.all = 0x0002;
GpioDataRegs.GPESET.all = 0x0005; //僅有3個(gè)I/O引腳
GpioDataRegs.GPFCLEAR.all = 0xAAAA;
GpioDataRegs.GPFSET.all = 0x5555;
GpioDataRegs.GPGCLEAR.all = 0x0020;
GpioDataRegs.GPGSET.all = 0x0010; //僅有2個(gè)I/O引腳
delay_loop();
}
}
void Gpio_example3(void)
{
//用TOGGLE寄存器觸發(fā)I/O引腳,設(shè)置引腳為已知狀態(tài)
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個(gè)I/O引腳
GpioDataRegs.GPESET.all = 0x0002;
GpioDataRegs.GPECLEAR.all = 0x0005; //僅有3個(gè)I/O引腳
GpioDataRegs.GPFSET.all = 0xAAAA;
GpioDataRegs.GPFCLEAR.all = 0x5555;
GpioDataRegs.GPGSET.all = 0x0020;
GpioDataRegs.GPGCLEAR.all = 0x0010; //僅有2個(gè)I/O引腳
//用TOGGLE寄存器反轉(zhuǎn)引腳狀態(tài),任何位寫1反轉(zhuǎn),寫0不反轉(zhuǎn)
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; //設(shè)置GPIO多路復(fù)用為I/O功能
var2= 0xFFFF; //設(shè)置GPIO方向?yàn)檩敵?/div>
var3= 0x0000; //設(shè)置輸入采樣限定值
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 方向?yàn)檩敵?/div>
GpioMuxRegs.GPBDIR.all = var2; //GPIO 方向?yàn)檩敵?/div>
GpioMuxRegs.GPDDIR.all = var2;
GpioMuxRegs.GPEDIR.all = var2;
GpioMuxRegs.GPFDIR.all = var2;
GpioMuxRegs.GPGDIR.all = var2;
GpioMuxRegs.GPAQUAL.all = var3; //設(shè)置輸入采樣限定值
GpioMuxRegs.GPBQUAL.all = var3;
GpioMuxRegs.GPDQUAL.all = var3;
GpioMuxRegs.GPEQUAL.all = var3;
EDIS;
}