DSP开发知识 > 文章列表
教你学DSP28335 第七讲 数字输入输出GPIO (浏览次数:3)
发表于2022/1/22 12:10:00
一、GPIO工作原理

外界二进制信息(数字量)要被CPU处理,要给存储器存放,就需要外界信息源与两者之间的交换接口,这样的交换接口若用来进行通用目的数字量的输入输出,就被称为通用数字量输入/输出接口,简称GPIO。F28335 DSP有多达88个GPIO口,对应着芯片引出的88个引脚,随着芯片的封装与尺寸的确定,引脚数目是有限的,所以这88个引脚多数都是功能复用的,即可以灵活配置为输入引脚,也可以灵活配置为输出引脚,即可以作为通用I/O引脚,也可以作为特殊功能口(如SCI、SPI、ECAN等),非常灵活,用户根据需要,可以通过GPIO MUX(输入输出多路选择器,复用开关)寄存器来进行相关配置,下边详细介绍GPIO的工作原理及其配置过程。

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引脚的噪声干扰。此外,有下面4种方式对GPIO引脚进行读写操作:

控制GPIO接口的关键控制寄存器
1、可以通过GPxDAT寄存器独立读/写I/O信号;
2、利用GPxSET寄存器写1(写0无效)对I/O口进行置位 
3、利用GPxCLEAR寄存器写1(写0无效)对I/O口进行清零;
4、利用GPxTOOGLE寄存器置1后(写0无效)来将I/O输出电平翻转,原来高电平变成低电平,原来低电平则变成高电平。


二、GPIO寄存器

名   称

地   址

   空间地址

描   述

    GPACTRL

     0X6F80

2

GPIOA控制寄存器

    GPAQSEL1

     0X6F82

2

GPIOA量化控制寄存器1

    GPAQSEL2

     0X6F84

2

GPIOA量化控制寄存器2

    GPAMUX1

     0X6F86

2

GPIOA选择寄存器1

    GPAMUX2

     0X6F88

2

GPIOA选择寄存器2

    GPIOADIR

     0X6F8A

2

GPIOA方向寄存器

    GPIOAPUD

     0X6F8C

2

GPIOA上拉禁止寄存器

    GPBCTRL

     0X6F90

2

GPIOB控制寄存器

    GPBQSEL1

     0X6F92

2

GPIOB量化控制寄存器1

    GPBQSEL2

     0X6F94

2

GPIOB量化控制寄存器2

    GPBMUX1

     0X6F96

2

GPIOB选择寄存器1

    GPBMUX2

     0X6F98

2

GPIOB选择寄存器2

    GPBDIR

     0X6F9A

2

GPIOB方向寄存器

    GPBPUD

     0X6F9C

2

GPIOB上拉禁止寄存器

    GPCMUX1

     0X6FA6

2

GPIOC 选择寄存器1

    GPCMUX2

     0X6FA8

2

GPIOC 选择寄存器2

    GPCDIR

     0X6FAA

2

GPIOC 方向寄存器

    GPCPUD

     0X6FAC

2

GPIOC 上拉禁止寄存器

 GPIOXINT1SEL

     0X6FE0

1

外部中断源选择寄存器1

 GPIOXINT2SEL

     0X6FE1

1

外部中断源选择寄存器2

 GPIONMISEL

     0X6FE2

1

不可屏蔽中断源选择寄存器

 GPIOXINT3SEL

     0X6FE3

1

外部中断源选择寄存器3

 GPIOXINT4SEL

     0X6FE4

1

外部中断源选择寄存器4

 GPIOXINT5SEL

     0X6FE5

1

外部中断源选择寄存器5

 GPIOXINT6SEL

     0X6FE6

1

外部中断源选择寄存器6

 GPIOXINT7SEL

     0X6FE7

1

外部中断源选择寄存器7

 GPIOLPMSEL

     0X6FE8

1

唤醒低功耗模式源选择寄存


GPIO寄存器数据结构

struct GPIO_CTRL_REGS {
                      union  GPACTRL_REG  GPACTRL;     
                      union  GPA1_REG     GPAQSEL1;  
                      union  GPA2_REG     GPAQSEL2;    
                      union  GPA1_REG     GPAMUX1;   
                      union  GPA2_REG     GPAMUX2;   
                      union  GPADAT_REG   GPADIR;    
                      union  GPADAT_REG   GPAPUD;    
                      Uint32              rsvd1;
                      union  GPBCTRL_REG  GPBCTRL;  
                      union  GPB1_REG     GPBQSEL1;  
                      union  GPB2_REG     GPBQSEL2;  
                      union  GPB1_REG     GPBMUX1;   
                      union  GPB2_REG     GPBMUX2;   
                      union  GPBDAT_REG   GPBDIR;    
                      union  GPBDAT_REG   GPBPUD;    
                      Uint16              rsvd2[8];
                      union  GPC1_REG     GPCMUX1;   
                      union  GPC2_REG     GPCMUX2;   
                      union  GPCDAT_REG   GPCDIR;    
                      union  GPCDAT_REG   GPCPUD;   
};

三、GPIO编程

例1:采用上述结构体定义可以直接对GPIO的寄存器进行操作,完成外部引脚的初始化操作。例如,将IOA全部设置GPIO功能,输出状态,0量化:

void Gpio_Select(void)
Uint16 var1;
  Uint16 var2;
  Uint16 var3;
  var1=0x0000; 
  var2=0xffff; 
  var3=0x0000; 

  EALLOW;
  GpioCtrlRegs.GPAMUX1=var1;//GPIO0-15
  GpioCtrlRegs.GPAMUX2=var1;//GPIO16-31
  GpioCtrlRegs.GPADIR.all=var2;//GPIO0-31 
  GpioCtrlRegs.GPAQSEL1.all=var3;
  GpioCtrlRegs.GPAQSEL2.all=var3;
  EDIS;
}

例2: F28335一共有88个GPIO,分为3组,分别是A、B、C。其中A组GPIO可以通过软件配置为外部中断1、2以及NMI功能,B组GPIO可以通过软件配置为外部中断3、4、5、6、7功能。而C组的GPIO不能配置为中断功能。如果将某GPIO配置为外部中断功能,那么下面是设置步骤:
1. 将数字量I/O配置为GPIO功能;
2. 将数字量I/O配置为输入方向;
3. 将数字量I/O量化配置正确;
4. 利用外部中断选择寄存器选择相应的引脚为外部中断源;
5. 为此GPIO触发信号设置极性,上升沿、下降沿或者双边沿;

void GPIO_xint (void)
{
  ELLOW;
  GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0;  GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0;
  GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0;  GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0;
  GpioCtrlRegs.GPBDIR.bit.GPIO54 = 0;   GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0;
  GpioCtrlRegs.GPBDIR.bit.GPIO56 = 0;   GpioCtrlRegs.GPBDIR.bit.GPIO57 = 0;
      GpioCtrlRegs.GPBQSEL2.bit.GPIO54= 0;   GpioCtrlRegs.GPBQSEL2.bit.GPIO55= 0;
  GpioCtrlRegs.GPBQSEL2.bit.GPIO56= 0;  GpioCtrlRegs.GPBQSEL2.bit.GPIO57= 0;
  GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 54;GpioIntRegs.GPIOXINT4SEL.bit.GPIOSEL = 55;
      GpioIntRegs.GPIOXINT5SEL.bit.GPIOSEL = 56; GpioIntRegs.GPIOXINT6SEL.bit.GPIOSEL = 57; 
  XIntruptRegs.XINT3CR.bit.POLARITY= 0; XIntruptRegs.XINT4CR.bit.POLARITY= 0;
  XIntruptRegs.XINT5CR.bit.POLARITY= 0; XIntruptRegs.XINT6CR.bit.POLARITY= 0;
  XIntruptRegs.XINT3CR.bit.ENABLE = 1; XIntruptRegs.XINT4CR.bit.ENABLE = 1;
XIntruptRegs.XINT5CR.bit.ENABLE = 1; XIntruptRegs.XINT6CR.bit.ENABLE = 1;
  EDIS;
}

楼主

您必须登录后才能进行回复或者发起新的主题