根据网络资料以及以下两篇博客整理
http://blog.sina.com.cn/s/blog_86a6035301017rr7.html
http://blog.csdn.net/hmf1235789/article/details/51883714
F28335 DSP将这88个GPIO口分成了A、B、C三大组,A组包括GPIO0至GPIO31,B组包括GPIO32至GPIO63,C组包括GPIO64至GPIO87,每个引脚都复用了多个功能,同一时刻,每个引脚只能用该引脚的一个功能。究竟工作在哪个模式下,可以通过GPIO Mux(复用开关)寄存器配置每个引脚的具体功能(通用数字量I/O或者外设专用功能)。如果将这些引脚选择数字量I/O模式,可以通过方向寄存器GPxDIR配置数字量I/O的方向,即是作为输入引脚还是作为输出引脚;还可以通过量化寄存器GPxQUAL对输入信号进行量化限制,从而可以消除数字量I/O引脚的噪声干扰。
对GPIO模块的设置主要通过三类寄存器来完成,分别是:控制寄存器、数据寄存器、中断寄存器。
1、控制寄存器
1 GPxCTRL; // GPIO x Control Register (GPIO0 to 31) 2 //设置采样窗周期T=2*GPXCTRL*Tsysclk; 3 GPxQSEL1; // GPIO x Qualifier Select 1 Register (GPIO0 to 15)(32-47) 4 5 GPxQSEL2; // GPIO x Qualifier Select 2 Register (GPIO16 to 31)(48-63) 6 //每两位控制一个引脚,确定是3周期采样还是6周期采样或者不用采样 7 GPxMUX1; // GPIO x Mux 1 Register (GPIO0 to 15)(32-47)(64-79) 8 GPxMUX2; // GPIO x Mux 2 Register (GPIO16 to 31)(48-63)(80-95) 9 //配置各个引脚的功能,0:I/O功能,1:外设功能。 10 GPxDIR; // GPIO x Direction Register (GPIO0 to 31)(32-63)(64-95) 11 //配置每个引脚是输入还是输出,0:数字量输入;1:数字量输出。 12 GPxPUD; // GPIO x Pull Up Disable Register (GPIO0 to 31)(32-63)(64-95) 13 //使能或禁止jie口的内部上拉
2、数据寄存器
1 GPxDAT; // GPIO Data Register (GPIO0 to 31)(32-63)(64-95) 2 GPxSET; // GPIO Data Set Register (GPIO0 to 31)(32-63)(64-95) 3 GPxCLEAR; // GPIO Data Clear Register (GPIO0 to 31)(32-63)(64-95) 4 GPxTOGGLE; // GPIO Data Toggle Register (GPIO0 to 31)(32-63)(64-95)
3、中断寄存器
1 GPIOXINT1SEL; // XINT1 GPIO Input Selection 2 GPIOXINT2SEL; // XINT2 GPIO Input Selection 3 GPIOXNMISEL; // XNMI_Xint13 GPIO Input Selection 4 GPIOXINT3SEL; // XINT3 GPIO Input Selection 5 GPIOXINT4SEL; // XINT4 GPIO Input Selection 6 GPIOXINT5SEL; // XINT5 GPIO Input Selection 7 GPIOXINT6SEL; // XINT6 GPIO Input Selection 8 GPIOXINT7SEL; // XINT7 GPIO Input Selection 9 GPIOLPMSEL; // Low power modes GP I/O input select 10 可以对GPIO0-63进行外部中断设置
注:0~31配置为XINT1、XINT2;32~63配置为XINT3、4、5、6、7
在《手把手教你学DSP》的第六章为GPIO介绍,在配套例程配套文档例程资料\CCS4.12\lab2-GPIO_SETUP下的DSP2833x_Gpio.c程序如下
1 // TI File $Revision: /main/1 $ 2 // Checkin $Date: August 18, 2006 13:46:25 $ 3 //########################################################################### 4 // 5 // FILE: DSP2833x_Gpio.c 6 // 7 // TITLE: DSP2833x 通用 I/O 初始化& 支持函数. 8 // 9 //########################################################################### 10 // $TI Release: DSP2833x Header Files V1.01 $ 11 // $Release Date: September 26, 2007 $ 12 //########################################################################### 13 14 #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File 15 #include "DSP2833x_Examples.h" // DSP2833x Examples Include File 16 17 //--------------------------------------------------------------------------- 18 // InitGpio: 19 //--------------------------------------------------------------------------- 20 // 该函数初始化到一个已知的(默认)状态. 21 // 22 // 更多关于配置GPIO外围功能的细节, 23 // 请参照个人设置的外围例子/或 GPIO 设置示例. 24 void InitGpio(void) 25 { 26 EALLOW; 27 28 // 每个 GPIO pin 都可以: 29 // a) a GPIO 输入/输出 30 // b) 外设功能 1 31 // c) 外设功能 2 32 // d) 外设功能 3 33 // 默认情况下, 所有的 GPIO 都为输入 34 GpioCtrlRegs.GPAMUX1.all = 0x0000; // GPIO 功能 GPIO0-GPIO15 35 GpioCtrlRegs.GPAMUX2.all = 0x0000; // GPIO 功能 GPIO16-GPIO31 36 GpioCtrlRegs.GPBMUX1.all = 0x0000; // GPIO 功能 GPIO32-GPIO39 37 GpioCtrlRegs.GPBMUX2.all = 0x0000; // GPIO 功能 GPIO48-GPIO63 38 GpioCtrlRegs.GPCMUX1.all = 0x0000; // GPIO 功能 GPIO64-GPIO79 39 GpioCtrlRegs.GPCMUX2.all = 0x0000; // GPIO 功能 GPIO80-GPIO95 40 41 GpioCtrlRegs.GPADIR.all = 0x0000; // GPIO0-GPIO31 都为输入 42 GpioCtrlRegs.GPBDIR.all = 0x0000; // GPIO32-GPIO63 都为输入 43 GpioCtrlRegs.GPCDIR.all = 0x0000; // GPI064-GPIO95 都为输入 44 45 // 每个输入都可以有不同的限制 46 // a) 输入信号同步 to SYSCLKOUT 47 // b) 输入合适的采样窗口 48 // c) 异步输入模式 (仅外围输入有效) 49 GpioCtrlRegs.GPAQSEL1.all = 0x0000; // GPIO0-GPIO15 同步 to SYSCLKOUT 50 GpioCtrlRegs.GPAQSEL2.all = 0x0000; // GPIO16-GPIO31 同步 to SYSCLKOUT 51 GpioCtrlRegs.GPBQSEL1.all = 0x0000; // GPIO32-GPIO39 同步 to SYSCLKOUT 52 GpioCtrlRegs.GPBQSEL2.all = 0x0000; // GPIO48-GPIO63 同步 to SYSCLKOUT 53 54 // 上拉可以禁止或使能. 55 GpioCtrlRegs.GPAPUD.all = 0x0000; // 启用上拉 GPIO0-GPIO31 56 GpioCtrlRegs.GPBPUD.all = 0xffff; //0x0000; // 启用上拉 GPIO32-GPIO63 57 GpioCtrlRegs.GPCPUD.all = 0x0000; // 启用上拉 GPIO64-GPIO79 58 59 //GpioCtrlRegs.GPAPUD.all = 0xFFFF; // 禁止上拉 GPIO0-GPIO31 60 //GpioCtrlRegs.GPBPUD.all = 0xFFFF; // 禁止上拉 GPIO32-GPIO34 61 //GpioCtrlRegs.GPCPUD.all = 0xFFFF // 禁止上拉 GPIO64-GPIO79 62 63 EDIS; 64 65 } 66 67 //========================================================= 68 // End of file. 69 //=========================================================
GPIO的控制实例在《手把手教你学DSP》配套例程CCS4.12\lab1-GPIO_LED下控制LED灯闪烁
1 #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File 2 #include "DSP2833x_Examples.h" // DSP2833x Examples Include File 3 4 #define LED1 GpioDataRegs.GPADAT.bit.GPIO0 //数据寄存器宏定义 5 #define LED2 GpioDataRegs.GPADAT.bit.GPIO1 6 #define LED3 GpioDataRegs.GPADAT.bit.GPIO2 7 #define LED4 GpioDataRegs.GPADAT.bit.GPIO3 8 #define LED5 GpioDataRegs.GPADAT.bit.GPIO4 9 #define LED6 GpioDataRegs.GPADAT.bit.GPIO5 10 11 12 13 interrupt void ISRTimer0(void); 14 void configtestled(void); 15 16 17 void main(void) 18 { 19 // 步骤 1. 初始化系统控制: 20 // PLL, WatchDog, 使能外围时钟 21 // 这个函数在 DSP2833x_SysCtrl.c 文件中. 22 InitSysCtrl(); 23 24 // 步骤 2. 初始化设置 GPIO: 25 // 这个函数例子在 DSP2833x_Gpio.c 文件中 26 // 说明了如何设置GPIO的默认状态. 27 // InitGpio(); // 跳过这个函数 28 InitXintf16Gpio(); //zq 29 30 // 步骤 3. 清除所有中断向量和初始化向量表: 31 // 禁止CPU中断 32 DINT; 33 34 // 初始化PIE控制寄存器的默认状态. 35 // 默认状态是所有的中断和中断标志被清除 36 // 这个函数在 DSP2833x_PieCtrl.c 文件中. 37 InitPieCtrl(); 38 39 // Disable CPU interrupts and clear all CPU interrupt flags: 40 IER = 0x0000; 41 IFR = 0x0000; 42 43 // 初始化中断向量表的地址指针 44 // 中断服务程序 (ISR). 45 // 即使不使用中断也要将表格填充满, 这样的目的是用于调试. 46 // 这个函数在 DSP2833x_DefaultIsr.c文件中 47 // 这个函数在 DSP2833x_PieVect.c.文件中 48 InitPieVectTable(); 49 configtestled(); 50 51 LED1=1; 52 DELAY_US(10); 53 LED2=1; 54 DELAY_US(10); 55 LED3=1; 56 DELAY_US(10); 57 LED4=0; 58 DELAY_US(10); 59 LED5=0; 60 DELAY_US(10); 61 LED6=0; 62 DELAY_US(10); 63 64 65 while(1){ 66 LED1=~LED1; 67 DELAY_US(50000); 68 LED2=~LED2; 69 DELAY_US(50000); 70 LED3=~LED3; 71 DELAY_US(50000); 72 LED4=~LED4; 73 DELAY_US(50000); 74 LED5=~LED5; 75 DELAY_US(50000); 76 LED6=~LED6; 77 DELAY_US(50000); 78 79 } 80 81 } 82 83 84 void configtestled(void) 85 { 86 EALLOW; 87 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0 = GPIO0 88 GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // 输出 89 GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1 90 GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; // 输出 91 GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO2 = GPIO2 92 GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; // 输出 93 GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // GPIO3 = GPIO3 94 GpioCtrlRegs.GPADIR.bit.GPIO3 = 1; // 输出 95 GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; // GPIO4 = GPIO4 96 GpioCtrlRegs.GPADIR.bit.GPIO4 = 1; // 输出 97 GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0; // GPIO5 = GPIO5 98 GpioCtrlRegs.GPADIR.bit.GPIO5 = 1; // 输出 99 100 EDIS; 101 } 102 //=========================================================================== 103 // No more. 104 //===========================================================================