TI DSP TMS320F280025 Note4:通用输入输出GPIO

TMS320F280025 通用输入输出GPIO



GPIO模块控制设备的数字和模拟I/O多路复用,它使用共享引脚来最大限度地提高应用灵活性。引脚由通用I/O名称命名(例如,GPIO0、GPIO25、GPIO58)。这些引脚可以单独选择作为数字I/O(也称为GPIO模式)操作,或连接到几个外围I/O信号之一。输入信号可以经过处理以去除不必要的噪声。

介绍

除了cpu控制的I/O能力外,多达12个独立的外设信号在单个gpio启用引脚上多路复用。每个引脚输出可以由外设或CPU主机之一控制。
有多达8个可能的I/O端口:
•A口由gpio ~ gpio31组成
•B口由gpio32 ~ gpio63组成
•C口由gpio64 ~ gpio95组成
•D口由gpio96 ~ gpio127组成
•E口由gpio128 ~ gpio159组成
•F口由gpio160 ~ gpio191组成
•G口由gpio192 ~ gpio223组成
•H口由gpio224 ~ gpio255组成
N:
某些GPIO和I/O端口在特定设备上可能不可用。有关可用的GPIO和I/O端口,请参阅GPIO寄存器部分。
该设备上的模拟信号与数字输入进行多路复用。这些模拟IO (AIO)引脚不具有数字输出能力。•H口由gpio224 ~ gpio247组成,单个引脚的GPIO逻辑如图所示。
在这里插入图片描述

图中有两个关键特性需要注意。首先,输入和输出路径是完全分开的,只在引脚处连接。第二,外围复用发生在远离引脚的地方。因此,对于CPU来说,独立于外设复用读取引脚的物理状态是可能的。同样,外部中断可以从外围活动生成。所有引脚选项,如输入资格和开漏输出对所有外设都有效。
N:

TAG使用不同的信号路径,不支持反转或限定。
GPIO18/X2和GPIO19/X1由于振荡器电路的负载而具有不同的时序。有关GPIO18/X2和GPIO19/X1作为gpio的详细信息,请参见数据表和本文档的“时钟”章节。
如果将边缘锐利(高dv/dt)的数字信号连接到aio,则可能与相邻的模拟信号发生串扰。因此,如果相邻通道被用于模拟功能,则限制连接到aio的信号的边缘速率。

配置简介

I/O引脚配置包括以下几个步骤:
1.规划设备引脚输出:列出应用程序所需的所有外设。使用设备数据表中的外设多路复用信息,选择用于外设信号的gpio。决定将剩余的哪个gpio用作输入和输出。
一旦选择了外设muxing,通过将适当的值写入GPyGMUX1/2和GPyGMUX1/2寄存器来实现mux。当更改引脚的GPyGMUX值时,总是首先将相应的GPyMUX位设置为零,以避免互斥器出现故障。默认情况下,所有引脚都是通用I/ o,而不是外设信号。
2. (可选)启用内部上拉电阻:要启用或禁用上拉电阻,请写入GPIO上拉禁用寄存器(GPyPUD)中的相应位。默认情况下,所有的下拉都是禁用的。当没有外部信号驱动时,拉接可用于保持输入引脚处于已知状态。
3. 选择输入限定:当引脚用作输入时,如果有输入限定,请指定所需的输入限定。
在GPyCTRL寄存器中选择输入限定采样周期,而在GPyQSEL1和GPyQSEL2寄存器中选择限定类型。缺省情况下,所有限定同步,采样周期为PLLSYSCLK。有关输入限定的解释,请参见第8.5节。
4. 选择任何通用I/O引脚的方向:对于配置为GPIO的每个引脚,使用GPyDIR寄存器指定引脚作为输入或输出的方向。缺省情况下,所有GPIO引脚都是输入。
在将引脚更改为输出之前,通过将该值写入GPySET, GPyCLEAR或GPyDAT寄存器,将输出锁存加载为要驱动的值。加载锁存器后,写入GPyDIR以改变引脚方向。默认情况下,所有输出锁存为零。
GPyDAT_R寄存器可用于读取写入GPyDAT寄存器的值。
5. 选择低功耗唤醒源:gpio 0 ~ 63可用于系统低功耗唤醒。要选择一个或多个gpio进行唤醒,请写入GPIOLPMSEL0和GPIOLPMSEL1寄存器中的适当位。这些寄存器是CPU系统寄存器空间的一部分。有关低功耗模式和GPIO唤醒的更多信息,请参阅系统控制和中断章节中的低功耗模式部分。
6. 选择外部中断源:配置外部中断分为两步。首先,必须启用中断本身,并且必须使用XINTnCR寄存器配置极性。
其次,必须通过分别选择输入X-BAR信号4、5、6、13和14的源来设置XINT1-5 GPIO引脚。有关输入X-BAR体系结构的更多信息,请参见(X-BAR)一章。

ADC引脚上的数字输入(AIOS)

一些gpio与模拟引脚多路复用,仅具有数字输入功能。这些也被称为aio。该端口上只有AIO选项的引脚只能在输入模式下工作。AIO信号列表请参见设备数据手册。缺省情况下,这些引脚为模拟引脚,且gpio处于高阻抗状态。
GPyAMSEL寄存器用于配置这些引脚进行数字或模拟操作。
N:
如果将边缘锐利(高dv/dt)的数字信号连接到aio,则可能与相邻的模拟信号发生串扰。因此,如果相邻通道被用于模拟功能,则限制连接到aio的信号的边缘速率。

数字通用I/O控制

配置为GPIO的引脚上的值可以通过使用以下寄存器来更改。
• GPyDAT Registers
每个I/O端口有一个数据寄存器。数据寄存器中的每个位对应于一个GPIO引脚。无论引脚如何配置(GPIO或外设功能),数据寄存器中相应的位反映了合格后引脚的当前状态。写入GPyDAT寄存器清除或设置相应的输出锁存,如果引脚被启用为通用输出(GPIO输出),引脚也被驱动为低电平或高电平。如果引脚未配置为GPIO输出,则值被锁存,但引脚不被驱动。
只有当引脚后来配置为GPIO输出时,锁存值才驱动到引脚上。
当使用GPyDAT寄存器更改输出引脚的电平时,要小心不要意外地更改另一个引脚的电平。例如,要通过使用读-修改-写指令写入GPADAT寄存器位0来改变GPIOA1的输出锁存器电平,如果另一个I/O端口a信号在该指令的读和写阶段之间改变电平,就会出现问题。以下是对发生这种情况的原因的分析:GPyDAT寄存器反映引脚的状态,而不是锁存器的状态。这意味着寄存器反映实际的引脚值。然而,从写入寄存器到新引脚值反映回寄存器之间存在滞后。当在随后的程序语句中使用该寄存器来改变GPIO引脚的状态时,这可能会造成问题。下面显示了一个示例,其中两个程序语句试图将当前低到高状态的两个不同的GPIO引脚驱动到高状态。

GpioDataRegs.GPADAT.bit.GPIO1 = 1; //I1 performs read-modify-write of GPADAT
GpioDataRegs.GPADAT.bit.GPIO2 = 1; //I2 also a read-modify-write of GPADAT
//GPADAT gets the old value of GPIO1 due to the delay

如果在GPyDAT寄存器上使用读-修改-写操作,由于第一条指令(I1)的输出和输入之间存在延迟,第二条指令(I2)将读取旧值并将该值写回。
由于外设帧上的读后写保护,第二个指令等待第一个指令完成写操作。但是,在写(I1)和GPyDAT位反映引脚上的新值(1)之间存在一些延迟。在此延迟期间,第二条指令读取GPIO1的旧值(0),并将该值与GPIO2的新值(1)一起写回。因此,GPIO1引脚保持低电平。
• GPyDAT_R Registers
GPyDAT_R寄存器是只读寄存器,它返回写入GPyDAT寄存器的值,而不是引脚状态。对这些寄存器的写入没有效果
• GPySET Registers
设置寄存器用于驱动指定的GPIO引脚高而不干扰其他引脚。每个I/O端口有一个寄存器,每个位对应一个GPIO引脚。集合寄存器总是读回0。如果相应的引脚配置为输出,则在设置寄存器中向该位写入1,将输出锁存设为高电平,并将相应的引脚驱动为高电平。如果引脚未配置为GPIO输出,则值被锁存,但引脚不被驱动。只有当引脚后来配置为GPIO输出时,锁存值才驱动到引脚上。将0写入设置寄存器中的任何位都没有效果。
• GPyCLEAR Registers
清除寄存器用于驱动指定的GPIO引脚低而不干扰其他引脚。每个I/O端口都有一个清晰的寄存器。清除寄存器总是读回0。如果相应的引脚配置为通用输出,则在清除寄存器中向相应的位写入1清除输出锁存器,并且引脚被驱动为低电平。如果引脚未配置为GPIO输出,则值被锁存,但引脚不被驱动。只有当引脚后来配置为GPIO输出时,锁存值才驱动到引脚上。在清除寄存器中向任何位写入0都没有效果。
• GPyTOGGLE Registers
切换寄存器用于驱动指定的GPIO引脚到相反的电平,而不干扰其他引脚。
每个I/O端口有一个切换寄存器。切换寄存器总是读回0。如果相应的引脚配置为输出,那么在切换寄存器中向该位写入1将翻转输出锁存器并将相应的引脚拉向相反的方向。也就是说,如果输出引脚被驱动为低电平,那么在切换寄存器中向相应的位写入1将引脚拉高。同样,如果输出引脚高,那么在切换寄存器中向相应位写入1将引脚拉低。如果引脚未配置为GPIO输出,则值被锁存,但引脚不被驱动。只有当引脚后来配置为GPIO输出时,锁存值才驱动到引脚上。将0写入切换寄存器中的任何位都没有效果。

Input Qualification

输入资格方案被设计得非常灵活。通过配置GPyQSEL1和GPyQSEL2寄存器来选择每个GPIO引脚的输入限定类型。在GPIO输入引脚的情况下,限定可以指定为仅同步到SYSCLKOUT或通过采样窗口限定。对于配置为外设输入的引脚,除了同步到SYSCLKOUT之外,输入还可以是异步的,或者由采样窗口限定。本节的其余部分将介绍可用的选项。

不同步(异步输入)

此模式用于不需要输入同步或由外设执行同步的外设。例如通信端口McBSP、SCI、SPI和I2C。此外,ePWM跳闸区(TZn)信号可以独立于SYSCLKOUT的存在而发挥作用。
N:
在外设执行输入同步时使用输入同步可能会导致意想不到的结果。在这种情况下,用户必须确保GPIO引脚配置为异步。

只同步到SYSCLKOUT

这是复位时所有引脚的默认限定模式。在这种模式下,输入信号只同步到系统时钟(SYSCLKOUT)。因为输入信号是异步的,所以需要一个SYSCLKOUT延迟周期来改变设备的输入。没有对信号进行进一步的限定。

使用采样窗口进行鉴定

在这种模式下,信号首先被同步到系统时钟(SYSCLKOUT),然后在允许改变输入之前经过指定周期数的限定。图显示了如何进行输入校正以消除不必要的噪声。对于这种类型的鉴定,用户指定了两个参数:1)采样周期,或对信号进行采样的频率,以及2)采样的数量。

采样间隔时间(采样周期):
在这里插入图片描述

为了使信号合格,输入信号以固定周期采样。采样周期由用户指定,并确定采样之间的时间间隔,或者相对于CPU时钟(SYSCLKOUT)对信号进行采样的频率。
采样周期由GPxCTRL寄存器中的资格周期(QUALPRDn)位指定。
采样周期可配置为8个输入信号组。例如,GPIO0到GPIO7使用GPACTRL[QUALPRD0]设置,GPIO8到GPIO15使用GPACTRL[QUALPRD1]设置。采样周期或采样频率与GPxCTRL[QUALPRDn]设置的关系如表所示

在这里插入图片描述
在这里插入图片描述

根据这些方程,对于给定的SYSCLKOUT频率,可以计算出采样之间的最小和最大时间:
示例:最大采样频率:
如果GPxCTRL[QUALPRDn] = 0,则采样频率为fSYSCLKOUT。如果,例如,fSYSCLKOUT = 60MHz,则信号以60MHz或每16.67ns采样一次。
示例:最小采样频率:
如果GPxCTRL[QUALPRDn] = 0xFF(255),则采样频率为fSYSCLKOUT × 1 ÷ (2 × GPxCTRL[QUALPRDn])。例如,如果fSYSCLKOUT = 60MHz,则信号采样频率为60MHz × 1 ÷ (2 × 255) (117.647kHz)或每8.5μs采样一次
采样次数:
信号的采样次数为3个采样或6个采样,在资格选择(GPAQSEL1, GPAQSEL2, GPBQSEL1和GPBQSEL2)寄存器中指定。当三个或六个连续的周期是相同的,然后输入的变化被传递到设备。

总采样窗宽:
在这里插入图片描述

采样窗是输入信号被采样的时间,如图所示。通过使用采样周期的方程,以及要取的样本数,可以确定窗口的总宽度。
为了使输入限定符检测输入中的变化,信号的电平必须在采样窗宽度的持续时间内或更长时间内保持稳定。
窗口内的采样周期数总是比采样数少一个。对于三采样窗口,采样窗口宽度为两个采样周期宽,采样周期定义如表所示。同样,对于6个样本窗口,采样窗口宽度为5个采样周期宽。表给出了基于GPxCTRL[QUALPRDn]和采样个数确定总采样窗宽度的计算方法。

在这里插入图片描述
在这里插入图片描述

N:
外部信号的变化对于采样周期和SYSCLKOUT来说都是异步的。由于外部信号的异步特性,输入必须在大于采样窗宽度的时间内保持稳定,以确保逻辑检测到信号的变化。
所需的额外时间最多可达一个额外的采样周期+ TSYSCLKOUT。
在数据表中描述了为检测变化的限定逻辑所需的输入信号稳定的持续时间。
输入限定窗口示例:
以图8-3为例,输入限定设置如下:
•GPxQSEL1/2 = 1,0。这表明有六个样本资格。
•GPxCTRL[QUALPRDn] = 1。采样周期为tw(SP) = 2 × GPxCTRL[QUALPRDn] × TSYSCLKOUT = 2 × TSYSCLKOUT。
该配置结果如下:
•采样窗口的宽度为:
tw(IQSW) = 5 × tw(SP) = 5 × 2 × GPxCTRL[QUALPRDn] × TSYSCLKOUT = 5 × 2 × TSYSCLKOUT
•例如,如果TSYSCLKOUT = 16.67ns,则采样窗口的持续时间为:
采样周期,tw(SP) = 2 × TSYSCLKOUT = 2 × 16.67ns = 33.3ns
采样窗口,tw(IQSW) = 5 × tw(SP) = 5 × 33.3ns = 166.7ns
•考虑到输入相对于采样周期和SYSCLKOUT的异步性质,最多需要一个额外的采样周期和SYSCLK周期来检测输入信号的变化。例如:
tw(IQSW) + tw(SP) + TSYSCLKOUT = 166.7ns + 33.3ns + 16.67ns = 216.7ns
•在图中,故障(A)比限定窗口短,被输入限定符忽略。
GPIO和外设多路复用技术

GPIO多路复用技术

每个引脚可复用多达12种不同的外设功能以及通用输入/输出(GPIO)功能。这允许您选择最适合您的特定应用程序的外设组合和引脚。混合组合和定义参见表
0-12
在这里插入图片描述

13-32
在这里插入图片描述

33-63
在这里插入图片描述

外设多路复用技术

例如,GPIO6引脚的多路复用通过写入GPAGMUX[13:12]和GPAMUX[13:12]来控制。
通过写入这些位,GPIO6被配置为通用数字I/O或几种不同外设功能之一。GPyGMUX和GPyMUX选择和单个GPIO选项的示例如表所示。
N:
下表仅为示例。参考设备数据表检查该设备上GPIO6的可用性。如果使用GPIO6,表中功能可能与实际功能不匹配。请参见上节了解该设备的正确gpio列表和相应的多路复用选项。
在这里插入图片描述

这些设备有不同的多路复用方案。如果外设在特定设备上不可用,则该设备保留该多路复用选择,不得使用。
N:
如果选择了不映射到外设或GPIO模式的保留GPIO mux配置,则引脚的状态为未定义并驱动引脚。未实现的配置用于将来的扩展,不能选择。在设备多路复用表(参见数据表)中,这些选项显示为保留或留空。
一些外设可以通过多路复用寄存器分配到多个引脚。例如,OUTPUTXBAR1可以分配给GPIO p、q或r(其中p、q和r是示例GPIO编号),具体取决于各个系统的需求。示例如表所示。
N:
下表仅为示例。位范围不能与该设备上的OUTPUTXBAR1对应。请参见8.6.1节了解该设备的正确gpio列表和相应的多路复用选项。
如果没有一个或多个GPIO引脚被配置为外设输入引脚,则该GPIO被设置为硬连接的默认值。
在这里插入图片描述

复用引脚GPIO28、29为串口的RX和TX
在这里插入图片描述

把GPIO28复用为第一种外设功能,通过写入GPAGMUX[25:24]和GPAMUX[25:24]来控制
把GPIO28复用为第一种外设功能,通过写入GPAGMUX[27:26]和GPAMUX[27:26]来控制
那么
1 = (GPAGMUX[25:24] <<2 ) | GPAMUX[25:24])
1 = (GPAGMUX[27:26] <<2 ) | GPAMUX[27:26])
【3 2 | 1 0】
GPAGMUX2 | GPAMUX2
所以GPAGMUX[25:24] = 0;
GPAMUX[25:24] = 1;

GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
GpioCtrlRegs.GPAGMUX2.bit.GPIO29 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;

内部上拉配置要求

在复位时,gpio处于输入模式并禁用内部上拉。一个未驱动的输入可能会浮到中轨电压,并导致输入缓冲器上浪费的穿透电流。用户必须始终将每个GPIO置于以下配置之一:
•输入模式,由另一个组件驱动到高于或低于Vih的水平
•输入模式与GPIO内部上拉使能
•输出模式
在引脚数较少的设备上,默认情况下,未绑定gpio上的上拉是启用的,以防止浮动输入。用户必须小心避免在应用程序代码中禁用这些拉出。
在具有较大引脚数封装的设备上,必须启用任何内部未绑定GPIO的上拉,以防止浮动输入。TI在controlSUITE/C2000Ware中提供了一些功能,用户可以调用这些功能来为正在使用的包启用任何未绑定的GPIO上拉。这个函数gpio_enabledunbondediopullps()位于(Device)_Sysctrl.c文件中,默认情况下由InitSysCtrl()调用。用户必须小心避免在应用程序代码中禁用这些拉出。

寄存器

GPIO Base Address Table

在这里插入图片描述

GPIO_CTRL_REGS Registers

在这里插入图片描述

在这里插入图片描述

GPIO_DATA_REGS Registers

在这里插入图片描述

GPIO_DATA_READ_REGS Registers

在这里插入图片描述

GPACTRL Register (Offset = 0h) [Reset = 00000000h]

GPIO A采样周期控制(GPIO0 ~ 31)
在这里插入图片描述

GPAQSEL1 Register (Offset = 2h) [Reset = 00000000h]

GPIO A Qualifier Select 1 Register (GPIO0 ~ 15)选择GPIO的输入限定类型::
0、0 Sync
0、1 qualification(3个采样)
1、0 qualification(6个采样)
1、1 Async(不同步、不合格)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

GPAMUX1 Register (Offset = 6h) [Reset = 00000000h]

GPIO A Mux 1寄存器(GPIO0到15)定义GPIO的引脚Mux选择。
注意:各自的GPyGMUXn。GPIOz必须在这个寄存器之前配置,以避免中间外设选择被映射到GPIO。

GPADIR Register (Offset = Ah) [Reset = 00000000h]

GPIO A方向寄存器(GPIO0 ~ 31)当指定引脚配置为GPIO模式时,控制GPIO引脚的方向。
0:配置引脚为输入。
1:配置输出引脚。
读取寄存器将返回寄存器设置的当前值

GPAPUD Register (Offset = Ch) [Reset = FFFFFFFFh]

GPIO A Pull Up Disable Register (GPIO0 ~ 31)关闭GPIO上拉开关。
0:开启上拉功能。
1:表示禁止上拉。
读取寄存器将返回寄存器设置的当前值。
注:[1]当IORSn信号低时,GPIO引脚上的pull - up会异步关闭。

GPAINV Register (Offset = 10h) [Reset = 00000000h]

GPIO A输入极性反转寄存器(GPIO0 ~ 31)用于选择非反转或反转的GPIO输入到设备。
0:选择非倒置GPIO输入
1:选择倒置GPIO输入
读寄存器返回寄存器设置的当前值。

GPAODR Register (Offset = 12h) [Reset = 00000000h]

GPIO A开漏输出寄存器(GPIO0 ~ GPIO31)选择GPIO引脚的正常输出和开漏输出。
0:正常输出
1:开漏输出
读取寄存器返回寄存器设置的当前值。
注:[1]在Open Drain输出模式下,如果将缓冲区配置为输出模式,则PAD上输出0值,而1值将使缓冲区处于三态。

GPAGMUX1 Register (Offset = 20h) [Reset = 00000000h]

GPIO A外设组复用器(GPIO0 ~ 15)定义GPIO的引脚复用选择。
注:[1]对于GPIOx上完整的引脚复用选择,GPAMUXy。GPIOx配置也是必需的。

GPALOCK Register (Offset = 3Ch) [Reset = 00000000h]

GPIO A Lock Configuration Register (GPIO0 ~ 31) GPIO配置锁。
0: GPyMUX1, GPyMUX2, GPyDIR, GPyINV, GPyODR, GPyAMSEL, GPyGMUX1, GPyGMUX2和GPyCSELx寄存器中控制同一引脚的位可以被更改。1:锁定GPyMUX1, GPyMUX2, GPyGMUX2和GPyCSELx寄存器中控制同一引脚的位

GPACR Register (Offset = 3Eh) [Reset = 00000000h]

GPIO A Lock Commit Register (GPIO0 ~ 31) GPIO Configuration Lock Commit for GPIO:
1:锁定GPyLOCK寄存器中控制同一引脚的位
0:GPyLOCK寄存器中控制同一引脚的位可以被更改

GPADAT Register (Offset = 0h) [Reset = 00000000h]

GPIO A数据寄存器(GPIO0 ~ 31)读取该寄存器表示GPIO引脚的当前状态,而不管引脚处于哪种模式。
如果引脚为GPIO输出模式启用,则写入该寄存器将设置GPIO引脚为高或低,否则写入的值被锁存但被忽略。输出寄存器锁存的状态将保持其当前状态,直到下一次写操作。系统复位将清除所有位和锁存值为零。
设计者注意:[1]读取GPIODAT寄存器应该反映PIN的状态(经过鉴定),而不是GPIODAT寄存器的输出锁存器的状态。

GPASET Register (Offset = 2h) [Reset = 00000000h]

GPIO A数据集寄存器(GPIO0到31)
写1将强制GPIO输出数据锁存为1。
0的写入将被忽略。
总是回读0。

GPACLEAR Register (Offset = 4h) [Reset = 00000000h]

GPIO A数据清除寄存器(GPIO0到31)
写1将强制GPIO0输出数据锁存为0。
0的写入将被忽略。
总是回读0

GPATOGGLE Register (Offset = 6h) [Reset = 00000000h]

GPIO A数据切换寄存器(GPIO0 to 31)
写1将GPIO0输出数据锁存器1切换到0或0到1。
0的写入将被忽略。
总是回读0。

GPADAT_R Register (Offset = 0h) [Reset = 00000000h]GPIO A数据读寄存器

在这里插入图片描述

例子(点灯)

GpioDriver.c

#include "GpioDriver.h"
#include "main.h"


/*
 * GPIO31、34为LED
 * GPIO44\46为输入模式
 * GPIO32\37\39 输出模式
 */
void GpioDriver_Init(void)
{
    EALLOW;


    /*
     * 设置GPIO31、34为输出模式,正常输出,禁止上拉
     */
    //GpioCtrlRegs.GPAGMUX2.bit.GPIO31 = 0;           //默认为0  定义GPIO复位类型的引脚 复用选择:SYSRSn
    GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;            // 默认为0   定义GPIO的引脚Mux复用选择
    //GpioCtrlRegs.GPAPUD.bit.GPIO31 = 1;             // 0:开启上拉功能    1:表示禁止上拉。
    //GpioCtrlRegs.GPAODR.bit.GPIO31 = 0;             // 0:正常输出       1:开漏输出
    GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;             // 0:配置引脚为输入。 1:配置输出引脚。
    //GpioCtrlRegs.GPAQSEL2.bit.GPIO31 = 0;           // 0,0 Sync ;     0,1 qualification(3个采样);   1,0 qualification(6个采样);    1,1 Async(没有Sync或qualification);
    GpioDataRegs.GPASET.bit.GPIO31 = 1;             // 1将强制GPIO输出数据锁存为1
    //GpioDataRegs.GPACLEAR.bit.GPIO31 = 1;

    //GpioCtrlRegs.GPBGMUX1.bit.GPIO34 = 0;           //默认为0  定义GPIO复位类型的引脚 复用选择:SYSRSn
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;            // GPIO的引脚Mux复用选择
    //GpioCtrlRegs.GPBPUD.bit.GPIO34 = 1;             // 0:开启上拉功能    默认1:表示禁止上拉
    //GpioCtrlRegs.GPBODR.bit.GPIO34 = 0;             // 默认0:正常输出       1:开漏输出
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;             // 0:配置引脚为输入。 1:配置输出引脚。
    //GpioCtrlRegs.GPBQSEL1.bit.GPIO34 = 0;         // 0,0 Sync ;     0,1 qualification(3个采样);   1,0 qualification(6个采样);    1,1 Async(没有Sync或qualification);
    //GpioDataRegs.GPBSET.bit.GPIO34 = 1;           // 写1将强制GPIO输出数据锁存为
    GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;           //写1将强制GPIO0输出数据锁存为0。

    /*
     * 输出引脚
     */
    //GpioCtrlRegs.GPBGMUX1.bit.GPIO32 = 0;           //默认为0  定义GPIO复位类型的引脚 复用选择:SYSRSn
    GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;            // GPIO的引脚Mux复用选择
    //GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;             // 0:开启上拉功能    默认1:表示禁止上拉
    //GpioCtrlRegs.GPBODR.bit.GPIO32 = 0;             // 默认0:正常输出       1:开漏输出
    GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;             // 0:配置引脚为输入。 1:配置输出引脚。
    GpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 0;         // 0,0 Sync ;     0,1 qualification(3个采样);   1,0 qualification(6个采样);    1,1 Async(没有Sync或qualification);
    //GpioDataRegs.GPBSET.bit.GPIO32 = 1;           // 写1将强制GPIO输出数据锁存为
    //GpioDataRegs.GPBCLEAR.bit.GPIO32 = 1;

    //GpioCtrlRegs.GPBGMUX1.bit.GPIO37 = 0;           //默认为0  定义GPIO复位类型的引脚 复用选择:SYSRSn
    GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 0;            // GPIO的引脚Mux复用选择
    //GpioCtrlRegs.GPBPUD.bit.GPIO37 = 0;             // 0:开启上拉功能    默认1:表示禁止上拉
    //GpioCtrlRegs.GPBODR.bit.GPIO37 = 0;             // 默认0:正常输出       1:开漏输出
    GpioCtrlRegs.GPBDIR.bit.GPIO37 = 1;             // 0:配置引脚为输入。 1:配置输出引脚。
    GpioCtrlRegs.GPBQSEL1.bit.GPIO37 = 0;         // 0,0 Sync ;     0,1 qualification(3个采样);   1,0 qualification(6个采样);    1,1 Async(没有Sync或qualification);
    //GpioDataRegs.GPBSET.bit.GPIO37 = 1;           // 写1将强制GPIO输出数据锁存为
    //GpioDataRegs.GPBCLEAR.bit.GPIO37 = 1;

    //GpioCtrlRegs.GPBGMUX1.bit.GPIO39 = 0;           //默认为0  定义GPIO复位类型的引脚 复用选择:SYSRSn
    GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 0;            // GPIO的引脚Mux复用选择
    //GpioCtrlRegs.GPBPUD.bit.GPIO39 = 0;             // 0:开启上拉功能    默认1:表示禁止上拉
    //GpioCtrlRegs.GPBODR.bit.GPIO39 = 0;             // 默认0:正常输出       1:开漏输出
    GpioCtrlRegs.GPBDIR.bit.GPIO39 = 1;             // 0:配置引脚为输入。 1:配置输出引脚。
//    GpioCtrlRegs.GPBQSEL1.bit.GPIO39 = 0;         // 0,0 Sync ;     0,1 qualification(3个采样);   1,0 qualification(6个采样);    1,1 Async(没有Sync或qualification);
    //GpioDataRegs.GPBSET.bit.GPIO39 = 1;           // 写1将强制GPIO输出数据锁存为
    //GpioDataRegs.GPBCLEAR.bit.GPIO39 = 1;

    /*
     * 输入引脚
     */
//    GpioCtrlRegs.GPBGMUX1.bit.GPIO44 = 0;           //默认为0  定义GPIO复位类型的引脚 复用选择:SYSRSn
//    GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0;            // GPIO的引脚Mux复用选择
//    GpioCtrlRegs.GPBPUD.bit.GPIO44 = 0;             // 0:开启上拉功能    默认1:表示禁止上拉
//    GpioCtrlRegs.GPBODR.bit.GPIO44 = 0;             // 默认0:正常输出       1:开漏输出
    GpioCtrlRegs.GPBDIR.bit.GPIO44 = 0;             // 0:配置引脚为输入。 1:配置输出引脚。
    GpioCtrlRegs.GPBQSEL1.bit.GPIO44 = 0;         // 0,0 Sync ;     0,1 qualification(3个采样);   1,0 qualification(6个采样);    1,1 Async(没有Sync或qualification);
//    GpioDataRegs.GPBSET.bit.GPIO44 = 1;           // 写1将强制GPIO输出数据锁存为
//    GpioDataRegs.GPBCLEAR.bit.GPIO44 = 1;           //写1将强制GPIO0输出数据锁存为0。

//    GpioCtrlRegs.GPBGMUX1.bit.GPIO46 = 0;           //默认为0  定义GPIO复位类型的引脚 复用选择:SYSRSn
//    GpioCtrlRegs.GPBMUX1.bit.GPIO46 = 0;            // GPIO的引脚Mux复用选择
//    GpioCtrlRegs.GPBPUD.bit.GPIO46 = 0;             // 0:开启上拉功能    默认1:表示禁止上拉
//    GpioCtrlRegs.GPBODR.bit.GPIO46 = 0;             // 默认0:正常输出       1:开漏输出
    GpioCtrlRegs.GPBDIR.bit.GPIO46 = 0;             // 0:配置引脚为输入。 1:配置输出引脚。
    GpioCtrlRegs.GPBQSEL1.bit.GPIO46 = 0;         // 0,0 Sync ;     0,1 qualification(3个采样);   1,0 qualification(6个采样);    1,1 Async(没有Sync或qualification);
//    GpioDataRegs.GPBSET.bit.GPIO46 = 1;           // 写1将强制GPIO输出数据锁存为
//    GpioDataRegs.GPBCLEAR.bit.GPIO46 = 1;           //写1将强制GPIO0输出数据锁存为0。






    EDIS;   // EDIS的意思是不允许修改被保护的寄存器

}
void Gpio_io_Test(void){
    if ((1 == GPIO44_STATUS) && (1 == GPIO46_STATUS))
    {
        LED1_ON();
        LED2_ON();
        GPIO32_HIGH();
        GPIO39_HIGH();
    }
    else if ((1 == GPIO44_STATUS) && (0 == GPIO46_STATUS))
    {
        LED1_ON();
        LED2_OFF();
        GPIO32_HIGH();
        GPIO39_LOW();
    }
    else if ((0 == GPIO44_STATUS) && (1 == GPIO46_STATUS))
    {
        LED1_OFF();
        LED2_ON();
        GPIO32_LOW();
        GPIO39_HIGH();
    }
    else if ((0 == GPIO44_STATUS) && (0 == GPIO46_STATUS))
    {
        LED1_OFF();
        LED2_OFF();
        GPIO32_LOW();
        GPIO39_LOW();
    }
    DELAY_US(1000000);
    GPIO37_TOGGLE();
}

GpioDriver.h

#ifndef _GPIO_DRIVER_H
#define _GPIO_DRIVER_H

#include "f28x_project.h"
#include "driverlib.h"
#include "device.h"



#define LED1_ON()          (GpioDataRegs.GPACLEAR.bit.GPIO31 = 1)
#define LED1_OFF()         (GpioDataRegs.GPASET.bit.GPIO31 = 1)
#define LED1_TOGGLE()        (GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1)
#define LED1_STATUS         (GpioDataRegs.GPADAT.bit.GPIO31)

#define LED2_ON()          (GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1)
#define LED2_OFF()         (GpioDataRegs.GPBSET.bit.GPIO34 = 1)
#define LED2_TOGGLE()        (GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1)
#define LED2_STATUS         (GpioDataRegs.GPBDAT.bit.GPIO34)

#define GPIO39_HIGH()          (GpioDataRegs.GPBSET.bit.GPIO39 = 1)
#define GPIO39_LOW()         (GpioDataRegs.GPBCLEAR.bit.GPIO39 = 1)
#define GPIO39_TOGGLE()        (GpioDataRegs.GPBTOGGLE.bit.GPIO39 = 1)
#define GPIO39_STATUS         (GpioDataRegs.GPBDAT.bit.GPIO39)

#define GPIO32_HIGH()          (GpioDataRegs.GPBSET.bit.GPIO32 = 1)
#define GPIO32_LOW()         (GpioDataRegs.GPBCLEAR.bit.GPIO32 = 1)
#define GPIO32_TOGGLE()        (GpioDataRegs.GPBTOGGLE.bit.GPIO32 = 1)
#define GPIO32_STATUS         (GpioDataRegs.GPBDAT.bit.GPIO32)

#define GPIO37_HIGH()          (GpioDataRegs.GPBSET.bit.GPIO37 = 1)
#define GPIO37_LOW()         (GpioDataRegs.GPBCLEAR.bit.GPIO37 = 1)
#define GPIO37_TOGGLE()        (GpioDataRegs.GPBTOGGLE.bit.GPIO37 = 1)
#define GPIO37_STATUS         (GpioDataRegs.GPBDAT.bit.GPIO37)

#define GPIO44_STATUS         (GpioDataRegs.GPBDAT.bit.GPIO44)
#define GPIO46_STATUS         (GpioDataRegs.GPBDAT.bit.GPIO46)
void GpioDriver_Init(void);
void Gpio_io_Test(void);
#endif 

main.c

//
// Included Files
//
#include "main.h"

//
// Main
//

void main()
{

    Init_SysInit();
    GpioDriver_Init();


    //主循环
    while (1)
    {
        Gpio_io_Test();

    }
}

main.h
#ifndef _MAIN_H__
#define _MAIN_H__


#include "f28x_project.h"

//#include <math.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdint.h>

#include "driverlib.h"
#include "device.h"
#include "SystemDriver.h"
#include "GpioDriver.h"

#endif

现象

IO37每间隔1秒输出翻转电平
IO44输入高电平 IO46输入高电平
LED1 亮 LED2 亮
IO32输出高电平 IO39输出高电平
在这里插入图片描述

IO44输入高电平 IO46输入低电平
LED1 亮 LED2 灭
IO32输出高电平 IO39输出低电平

在这里插入图片描述

IO44输入低电平 IO46输入高电平
LED1 灭 LED2 亮
IO32输出低电平 IO39输出高电平

在这里插入图片描述

在这里插入图片描述

IO44输入低电平 IO46输入低电平
LED1 灭 LED2 灭
IO32输出低电平 IO39输出低电平
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值