DSP28335 GPIO学习

时间:2024-03-11 07:29:28

根据网络资料以及以下两篇博客整理

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 //===========================================================================