打印

GPIO基本知识——配置为输出

[复制链接]
2294|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Jasmines|  楼主 | 2017-9-27 10:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GPIO基本知识——配置为输出


概述:F2806x系列DSP3IO端口。A口由GPIO0-GPIO31构成,B口由GPIO32-GPIO58构成。模拟端口由AIO0-AIO15构成。
DSP上的IO数量有限,为了最大化利用其功能,芯片的GPIO管脚通常具有复用功能,可以通过MUX实现对IO功能的选择。除GPIO功能外,F2806x系列DSP的管脚通常具有多达三种的外设信号接口功能。


以下,将按照功能进行叙述,详细说明GPIO的使用方法。


1.GPIO配置为输出


打开F28069核心板原理图,可以看到控制LED的相关电路。其中GPIO31与GPIO34经LVC2G07分别控制两个LED。LVC2G07为双路缓冲器,1Y-1A、2Y-2A保持一致信号。这里使用该缓冲器的原因在于,DSP的IO驱动能力有限,直接驱动LED电流可能出现驱动不足的现象。使用缓冲器可以解决这个问题。
1.        GPIO功能初始化
为了控制LED亮灭,需要将GPIO31与GPIO34设置为GPIO的输出功能,进而控制LED。
GPIO31使用A口控制,GPIO34使用B口控制。
GPIO功能选择寄存器为MUX寄存器,IO方向控制寄存器为DIR寄存器。
需要注意的是,GPIO初始化流程可以放在CPU初始化完成之后,即InitPieVectTable()之后。
因此,将GPIO31与GPIO34初始化为GPIO功能,方向为输出的代码可以设置如下。
  
    InitSysCtrl();
  
   DINT;
  
  
   InitPieCtrl();
  
  
   IER = 0x0000;
  
   IFR = 0x0000;
  
  
   InitPieVectTable();
  
  
   EALLOW;
  
   GpioCtrlRegs.GPAMUX2.bit.GPIO31  = 0;
  
   GpioCtrlRegs.GPADIR.bit.GPIO31  = 1;
  
   GpioCtrlRegs.GPBMUX1.bit.GPIO34  = 0;
  
   GpioCtrlRegs.GPBDIR.bit.GPIO34  = 1;
  
   EDIS;
  
  
   EINT;   // Enable Global interrupt INTM
  
   ERTM;   // Enable Global realtime interrupt DBGM
  
注意:EALLOW与EDIS为寄存器写保护控制指令。为了防止程序异常而错误写入寄存器,创建了寄存器保护机制。受到保护的寄存器只有允许状态下才能被写入。
其中,EALLOW为允许访问受保护的寄存器,EDIS为禁止访问受保护的寄存器。在查阅用户指南是,如果寄存器被标注为收到EALLOW保护(This register is EALLOW protected),则必须通过EALLOW打开保护才能进行写入。
2.        使用DATA寄存器进行操作
GPIO的DATA寄存器可以读取或写入。
当将IO配置为GPIO的输出管脚时,向DATA寄存器写入数据可以进行电平的设置。向DATA相应位写入1,对应的IO将输出高电平;向DATA相应位写入0,对应的IO将输出低电平。
因此,使用如下代码可以实现LED闪烁的效果。

  
      for(;;)
  
   {
  
      loop_count++;
  
  
      GpioDataRegs.GPADAT.bit.GPIO31 = 0;
  
      GpioDataRegs.GPBDAT.bit.GPIO34 = 0;
  
      DELAY_US(1000000);
  
  
      GpioDataRegs.GPADAT.bit.GPIO31 = 1;
  
      GpioDataRegs.GPBDAT.bit.GPIO34 = 1;
  
      DELAY_US(1000000);
  
  
   }
  

3.        使用SET/CLEAR/TOGGLE寄存器进行操作
对于GPIO的SET/CLEAR/TOGGLE寄存器,向其中对应位写入1将分别执行置位、清零和翻转指令。写0无效。
如果使用SET/CLEAR寄存器进行操作,可以通过置位、复位指令实现与DATA寄存器同样的效果。
因此,使用如下代码可以实现LED闪烁的效果。
  
      for(;;)
  
   {
  
      loop_count++;
  
  
      GpioDataRegs.GPASET.bit.GPIO31 = 1;
  
      GpioDataRegs.GPBSET.bit.GPIO34 = 1;
  
      DELAY_US(1000000);
  
  
      GpioDataRegs.GPACLEAR.bit.GPIO31 = 1;
  
      GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
  
      DELAY_US(1000000);
  
   }
  
事实上,如果进行LED闪烁实验,使用TOGGLE寄存器是最为便捷的。代码如下。

  
      for(;;)
  
   {
  
      loop_count++;
  
  
      GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;
  
      GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;
  
      DELAY_US(1000000);
  
   }

相关帖子

沙发
chuntian2016| | 2017-9-27 20:44 | 只看该作者
DSP上的IO数量有限,为了最大化利用其功能,芯片的GPIO管脚通常具有复用功能,可以通过MUX实现对IO功能的选择。

使用特权

评论回复
板凳
uptown| | 2017-9-27 21:44 | 只看该作者
bios的io驱动方式有吗?

使用特权

评论回复
地板
uptown| | 2017-9-27 21:48 | 只看该作者
最近在学习相关的操作系统的设计。

使用特权

评论回复
5
tongbu2015| | 2017-9-27 22:23 | 只看该作者
这个直接的对寄存器进行配置的,没啥难度的吧

使用特权

评论回复
6
tongbu2015| | 2017-9-27 22:24 | 只看该作者
现在是什么问题的?这两IO寄存器的配置好后能不能加个小延时的呢?

使用特权

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

本版积分规则

745

主题

1077

帖子

10

粉丝