GPIO基本知识——配置为输出
概述:F2806x系列DSP有3个IO端口。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); } |
|