打印

TMS320F28335项目开发记录8_28335之GPIO引脚

[复制链接]
575|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Peonys|  楼主 | 2017-9-27 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TMS320F28335项目开发记录8_28335之GPIO引脚


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]复制代码


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

640

主题

901

帖子

5

粉丝