GPIO(General-Purpose Input/Output)——通用输入/输出口;
DSP28335 GPIO模块分为三类IO口:PORTA(0-31),PORTB(32-63),PORTC(64-87)
对GPIO模块的设置主要通过三类寄存器来完成,分别是:控制寄存器、数据寄存器、中断寄存器。
1、控制寄存器
GPxCTRL; // GPIO x Control Register (GPIO0 to 31)
//设置采样窗周期T=2*GPXCTRL*Tsysclk;
GPxQSEL1; // GPIO x Qualifier Select 1 Register (GPIO0 to 15)(32-47)
GPxQSEL2; // GPIO x Qualifier Select 2 Register (GPIO16 to 31)(48-63)
//每两位控制一个引脚,确定是3周期采样还是6周期采样或者不用采样
GPxMUX1; // GPIO x Mux 1 Register (GPIO0 to 15)(32-47)(64-79)
GPxMUX2; // GPIO x Mux 2 Register (GPIO16 to 31)(48-63)(80-95)
//配置各个引脚的功能,0:I/O功能,1:外设功能。
GPxDIR; // GPIO x Direction Register (GPIO0 to 31)(32-63)(64-95)
//配置每个引脚是输入还是输出,0:数字量输入;1:数字量输出。
GPxPUD; // GPIO x Pull Up Disable Register (GPIO0 to 31)(32-63)(64-95)
//使能或禁止内部上拉 0:开启上拉,1:禁止上拉
2、数据寄存器 GPxDAT; // GPIO Data Register (GPIO0 to 31)(32-63)(64-95)
GPxSET; // GPIO Data Set Register (GPIO0 to 31)(32-63)(64-95)——置位 GPxCLEAR; // GPIO Data Clear Register (GPIO0 to 31)(32-63)(64-95) GPxTOGGLE; // GPIO Data Toggle Register (GPIO0 to 31)(32-63)(64-95)—反转
3、中断寄存器 GPIOXINT1SEL; // XINT1 GPIO Input Selection
GPIOXINT2SEL; // XINT2 GPIO Input Selection GPIOXNMISEL; // XNMI_Xint13 GPIO Input Selection GPIOXINT3SEL; // XINT3 GPIO Input Selection GPIOXINT4SEL; // XINT4 GPIO Input Selection GPIOXINT5SEL; // XINT5 GPIO Input Selection GPIOXINT6SEL; // XINT6 GPIO Input Selection GPIOXINT7SEL; // XINT7 GPIO Input Selection GPIOLPMSEL; // Low power modes GP I/O input select
可以对GPIO0-63进行外部中断设置;
具体定义在DSP28335Gpio.h中,如下: - struct GPIO_CTRL_REGS {
- union GPACTRL_REG GPACTRL; // GPIO A Control Register (GPIO0 to 31)
- union GPA1_REG GPAQSEL1; // GPIO A Qualifier Select 1 Register (GPIO0 to 15)
- union GPA2_REG GPAQSEL2; // GPIO A Qualifier Select 2 Register (GPIO16 to 31)
- union GPA1_REG GPAMUX1; // GPIO A Mux 1 Register (GPIO0 to 15)
- union GPA2_REG GPAMUX2; // GPIO A Mux 2 Register (GPIO16 to 31)
- union GPADAT_REG GPADIR; // GPIO A Direction Register (GPIO0 to 31)
- union GPADAT_REG GPAPUD; // GPIO A Pull Up Disable Register (GPIO0 to 31)
- Uint32 rsvd1;
- union GPBCTRL_REG GPBCTRL; // GPIO B Control Register (GPIO32 to 63)
- union GPB1_REG GPBQSEL1; // GPIO B Qualifier Select 1 Register (GPIO32 to 47)
- union GPB2_REG GPBQSEL2; // GPIO B Qualifier Select 2 Register (GPIO48 to 63)
- union GPB1_REG GPBMUX1; // GPIO B Mux 1 Register (GPIO32 to 47)
- union GPB2_REG GPBMUX2; // GPIO B Mux 2 Register (GPIO48 to 63)
- union GPBDAT_REG GPBDIR; // GPIO B Direction Register (GPIO32 to 63)
- union GPBDAT_REG GPBPUD; // GPIO B Pull Up Disable Register (GPIO32 to 63)
- Uint16 rsvd2[8];
- union GPC1_REG GPCMUX1; // GPIO C Mux 1 Register (GPIO64 to 79)
- union GPC2_REG GPCMUX2; // GPIO C Mux 2 Register (GPIO80 to 95)
- union GPCDAT_REG GPCDIR; // GPIO C Direction Register (GPIO64 to 95)
- union GPCDAT_REG GPCPUD; // GPIO C Pull Up Disable Register (GPIO64 to 95)
- };
-
- struct GPIO_DATA_REGS {
- union GPADAT_REG GPADAT; // GPIO Data Register (GPIO0 to 31)
- union GPADAT_REG GPASET; // GPIO Data Set Register (GPIO0 to 31)
- union GPADAT_REG GPACLEAR; // GPIO Data Clear Register (GPIO0 to 31)
- union GPADAT_REG GPATOGGLE; // GPIO Data Toggle Register (GPIO0 to 31)
- union GPBDAT_REG GPBDAT; // GPIO Data Register (GPIO32 to 63)
- union GPBDAT_REG GPBSET; // GPIO Data Set Register (GPIO32 to 63)
- union GPBDAT_REG GPBCLEAR; // GPIO Data Clear Register (GPIO32 to 63)
- union GPBDAT_REG GPBTOGGLE; // GPIO Data Toggle Register (GPIO32 to 63)
- union GPCDAT_REG GPCDAT; // GPIO Data Register (GPIO64 to 95)
- union GPCDAT_REG GPCSET; // GPIO Data Set Register (GPIO64 to 95)
- union GPCDAT_REG GPCCLEAR; // GPIO Data Clear Register (GPIO64 to 95)
- union GPCDAT_REG GPCTOGGLE; // GPIO Data Toggle Register (GPIO64 to 95)
- Uint16 rsvd1[8];
- };
-
- struct GPIO_INT_REGS {
- union GPIOXINT_REG GPIOXINT1SEL; // XINT1 GPIO Input Selection
- union GPIOXINT_REG GPIOXINT2SEL; // XINT2 GPIO Input Selection
- union GPIOXINT_REG GPIOXNMISEL; // XNMI_Xint13 GPIO Input Selection
- union GPIOXINT_REG GPIOXINT3SEL; // XINT3 GPIO Input Selection
- union GPIOXINT_REG GPIOXINT4SEL; // XINT4 GPIO Input Selection
- union GPIOXINT_REG GPIOXINT5SEL; // XINT5 GPIO Input Selection
- union GPIOXINT_REG GPIOXINT6SEL; // XINT6 GPIO Input Selection
- union GPIOXINT_REG GPIOXINT7SEL; // XINT7 GPIO Input Selection
- union GPADAT_REG GPIOLPMSEL; // Low power modes GP I/O input select
- };
[color=rgb(51, 102, 153) !important]复制代码
注意:GPIO相关寄存器介绍 1、GPxMUX寄存器(功能选择寄存器) 每个I/O口都有一个功能选择寄存器,功能选择寄存器主要用于选择I/O工作在特殊功能还是通用数组I/O模式。在复位时,所有GPIO配置成通用数字模式。 1)如果GPxMUX.bit = 0,配置成通用数字I/O功能; 2)如果GPxMUX.bit = 1,配置成特殊外设功能口(如SCI、CAN); I/O的输入功能和外设的输入通道总是被使能的,输出通道是通用数组I/O和特殊外设复用的。如果引脚配置成通用数组I/O功能,相应的外设功能将被禁止。 2、GPxDIR(方向控制寄存器) 每个I/O口都有数据方向控制寄存器,数据方向控制寄存器用于设置通用数字I/O为输入还是输出口,在复位时,引脚的默认状态为输入状态。 1)如果GPxDIR.bit = 0,引脚设置为通用数字量输入; 2)如果GPxDIR.bit = 1,引脚设置为通用数字量输出; 复位时,GPxMUX和GPxDIR默认值都为0,所以在复位时,引脚的默认状态为数字I/O输入。 3、GPxDAT寄存器(数据寄存器) 每个I/O口都有一个数据寄存器,数据寄存器是可读可写寄存器。 1)I/O设置为输出功能时,如果GPxDAT.bit = 0,那么操作将会使相应的引脚拉低; 2)I/O口设置为输入功能时,如果GPxDAT.bit = 0,反映相应的引脚状态为低电平; 3)I/O口设置为输出功能时,如果GPxDAT.bit = 1,那么操作将会使相应的引脚拉高; 4)I/O口设置为输入功能时,如果GPxDAT.bit = 1,反映相应的引脚状态为高电平。 需要说明的是,当用户试图改变一个数字I/O的状态时,不要改变另一个I/O的引脚状态。 4、GOxSET寄存器(置位寄存器) 每个I/O口都有一个置位寄存器,置位寄存器是只写寄存器,任何读操作都返回0,如果相应的引脚配置成数据量输出,写1后相应的引脚会置高,写0时没有反映。 1)如果GPxSET.bit = 0,没有影响; 2)引脚设置为输出时,如果GPxSET.bit = 1,那么操作将会使引脚置高。 5、GPxCLEAR寄存器(清除寄存器) 每个I/O口都有一个清除寄存器,清除寄存器是只写寄存器,任何读操作都返回0。 1)如果GPxCLEAR.bit = 0,没有影响; 2)引脚设置为输出时,如果GPxCLEAR.bit = 1,将相应的引脚置成低电平。 6、GPxTOGGLE寄存器(取反触发寄存器) 每个I/O口都有一个取反触发寄存器,该寄存器是只写寄存器,任何读操作都返回0。 1)如果GPxTOGGLE.bit = 0,没有影响; 2)引脚设置为输出时,如果GPxTOGGLE.bit = 1,那么操作将使相应的引脚取反。
4.GPIO实例
代码- #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
- #include "DSP2833x_Examples.h" // DSP2833x Examples Include File
- #define LED1 GpioDataRegs.GPBDAT.bit.GPIO60
- #define LED2 GpioDataRegs.GPBDAT.bit.GPIO61
- interrupt void ISRTimer0(void);
- void configtestled(void);
- Uint16 i;
- void main(void)
- {
- InitSysCtrl();
- InitXintf16Gpio();
- DINT;
- InitPieCtrl();
- // Disable CPU interrupts and clear all CPU interrupt flags:
- IER = 0x0000;
- IFR = 0x0000;
- InitPieVectTable();
- EALLOW; // This is needed to write to EALLOW protected registers
- PieVectTable.TINT0 = &ISRTimer0; //配置中断函数地址
- //PieVectTable.XINT13 = &cpu_timer1_isr;
- //PieVectTable.TINT2 = &cpu_timer2_isr;
- EDIS; // This is needed to disable write to EALLOW protected registers
- InitCpuTimers(); // For this example, only initialize the Cpu Timers
- // Configure CPU-Timer 0, 1, and 2 to interrupt every second:
- // 150MHz CPU Freq, 1 second Period (in uSeconds)
- ConfigCpuTimer(&CpuTimer0, 150, 1000000); //配置定时时间 1s
- //ConfigCpuTimer(&CpuTimer1, 150, 1000000);
- //ConfigCpuTimer(&CpuTimer2, 150, 1000000);
- StartCpuTimer0(); //定时器计数
- // Enable CPU int1 which is connected to CPU-Timer 0, CPU int13
- // which is connected to CPU-Timer 1, and CPU int 14, which is connected
- // to CPU-Timer 2:
- IER |= M_INT1;
- //IER |= M_INT13;
- //IER |= M_INT14;
- // Enable TINT0 in the PIE: Group 1 interrupt 7
- PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能PIE中断
- // Enable global Interrupts and higher priority real-time debug events:
- EINT; // Enable Global interrupt INTM
- ERTM; // Enable Global realtime interrupt DBGM
- configtestled();
- LED1 = 0;
- LED2 = 0;
- i = 0;
- for(; ;)
- {
- }
- }
- interrupt void ISRTimer0(void)
- {
- CpuTimer0.InterruptCount++;
- // Acknowledge this interrupt to receive more interrupts from group 1
- PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//PIEACK清0
- CpuTimer0Regs.TCR.bit.TIF=1; //外设中断标志位清0
- CpuTimer0Regs.TCR.bit.TRB=1; //重新装载
- LED1=~LED1;
- LED2=~LED2;
- }
- void configtestled(void)
- {
- EALLOW;
- GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; // GPIO60 = GPIO60配置为普通数字IO
- GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; // 方向为输出
- GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0; // GPIO61 = GPIO61
- GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;
- EDIS;
- }
- //===========================================================================
- // No more.
- //===========================================================================
[color=rgb(51, 102, 153) !important]复制代码
|