根據網絡資料以及以下兩篇博客整理
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 //===========================================================================