DSP28335的GPIO的引脚配置

F28335有三种32位的I/O口,依次PORTA(GPIO0-GPIO31), PORTB(GPIO32-GPIO63), PORTC(GPIO64-GPIO87),这些口都可以配置为普通的数字IO口同样也能被配置为外部接口。
这样涉及到了IO的寄存器,IO口共有三类寄存器:
控制寄存器、数据寄存器和中断控制寄存器。
1、 GPIO可以配置为数字I/O或外设I/O口,GPxMUX1(2):‘0’为数字I/O,‘1’为外设I/O口;
2: GPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉
3: GPIO具有数字滤波功能,GPxQSEL1(2):量化输入寄存器,可以确定是3周期采样
还是6周期采样或者不用采样;
GPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉,

4、 输入输出可配置,GPxDIR是控制每个引脚的输入或是输出,‘0’是输入,‘1’是输出;
当GPIO配置为数字I/O时注意:
1)28335引脚作为输出时,虽然可以通过设置GPADAT或GPBDAT改变输出端口的高低电平,但是单独写某一位时可能会使其它引脚产生误操作。为了避免这种现象的产生,改变输出引脚的高低电平时,应该使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向,可以代替去翻操作)寄存器载入输出锁存寄存,GPIOxDIR配置方向,1为输出,0为输入.
2)当使用GPADAT的时候,一般是在初始化中,在函数中使用需要添加延时,否则可能达不到预定的输出状态。使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向)电平会立即变化,无需添加延时。
GPIOxSET, GPIOxCLEAR, GPIOxTOGGLE仅仅等于1时才有效,等于0无效

以下例程是针对野火DSP28335开发板的程序,已经验证。
#include “DSP2833x_Device.h” // DSP2833x Headerfile Include File
#include “DSP2833x_Examples.h” // DSP2833x Examples Include File
void Gpio_select(void);
void delay_loop();
int main(void) {
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();

InitSysCtrl();

Gpio_select();//GPIO 初始化

// 步骤 3. 清除所有中断初始化中断向量表:
// 禁止CPU全局中断
DINT;
// 初始化PIE控制寄存器到他们的默认状态.
// 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
// 这个函数放在DSP2833x_PieCtrl.c源文件里
InitPieCtrl();
// 禁止CPU中断和清除所有CPU中断标志
IER = 0x0000;
IFR = 0x0000;

//初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
// 这个函数放在了DSP2833x_PieVect.c源文件里面.
InitPieVectTable();

GpioDataRegs.GPBDAT.all    =0x00000000;//第28、29位为低电平LED灯亮
GpioDataRegs.GPCDAT.all    =0x00000000;//第0 -4位为低电平LED灯亮
delay_loop();
delay_loop();

// for(;?

while(1)
	{
	   delay_loop();  //延时
       GpioDataRegs.GPBTOGGLE.all =0x30000000;  //电平翻转
       GpioDataRegs.GPCTOGGLE.all =0x0000001F;  //电平翻转
	}

/*
EALLOW;
// 把LED灯熄灭
GpioDataRegs.GPBSET.bit.GPIO60 =1;
GpioDataRegs.GPBSET.bit.GPIO61 =1;
GpioDataRegs.GPCSET.bit.GPIO64 =1;
GpioDataRegs.GPCSET.bit.GPIO65 =1;
GpioDataRegs.GPCSET.bit.GPIO66 =1;
GpioDataRegs.GPCSET.bit.GPIO67 =1;
GpioDataRegs.GPCSET.bit.GPIO68 =1;
EDIS;

   delay_loop();

/
// GpioDataRegs.GPBTOGGLE.all =0x30000000;
// GpioDataRegs.GPCTOGGLE.all =0x0000001F;
/
EALLOW;
// 打开LED灯
GpioDataRegs.GPBCLEAR.bit.GPIO60 =1;
GpioDataRegs.GPBCLEAR.bit.GPIO61 =1;
GpioDataRegs.GPCCLEAR.bit.GPIO64 =1;
GpioDataRegs.GPCCLEAR.bit.GPIO65 =1;
GpioDataRegs.GPCCLEAR.bit.GPIO66 =1;
GpioDataRegs.GPCCLEAR.bit.GPIO67 =1;
GpioDataRegs.GPCCLEAR.bit.GPIO68 =1;
EDIS;
*/

return 0;

}

void delay_loop()
{
Uint32 i;
Uint32 j;
for(i=0;i<32;i++)
for (j = 0; j < 100000; j++) {}
}

void Gpio_select(void)
{

EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0x00000000;  // All GPIO
GpioCtrlRegs.GPAMUX2.all = 0x00000000;  // All GPIO
GpioCtrlRegs.GPBMUX1.all = 0x00000000;  // All GPIO
GpioCtrlRegs.GPBMUX2.all = 0x00000000;  // All GPIO
GpioCtrlRegs.GPCMUX1.all = 0x00000000;  // All GPIO
GpioCtrlRegs.GPCMUX2.all = 0x00000000;  // All GPIO


GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;   // All outputs
GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF;   // All outputs
GpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF;   // All outputs

EDIS;

}

你可能感兴趣的:(DSP)