TMS320F280025 GPIO输入输出与外部中断功能原理与应用
文章目录
- TMS320F280025 GPIO输入输出与外部中断功能原理与应用
- GPIO原理
- 输入输出模式的共同特性
- 1. 复用设置
- 2. 内部上拉设置
- 3. GPIO状态读取
- 对于输出模式
- 输出电平设置
- 开漏输出设置
- 对于输入模式
- 极性设置
- 采样类型
- 不同步(异步输入)
- 只同步到SYSCLKOUT
- 使用采样窗口进行鉴定
- 外部输入中断
- GPIO一般设置流程
- 代码
- GpioDriver.c
- GpioDriver.h
GPIO原理
GPIO原理框图如图所示
输入输出模式的共同特性
输入输出模式的共同特性:
- 复用设置
- 内部上拉设置
- GPIO状态读取
1. 复用设置
在默认下,GPIO为普通IO功能,非外设功能,如果要设置GPIO为外设功能,则需要配置相关的复用寄存器GMUX与MUX,寄存器介绍自行查看手册,复用寄存器位置如下图所示:
复用引脚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;
2. 内部上拉设置
配置寄存器GPyPUD内部上拉,如下为配置GPIO开启上拉功能
GpioCtrlRegs.GPBPUD.bit.GPIO41 = 0; // 0:开启上拉功能 默认1:表示禁止上拉
3. GPIO状态读取
读取寄存器GPyDAT即可得到GPIO的状态,如下为宏定义读取GPIO42的状态
#define GPIO41_STATUS (GpioDataRegs.GPBDAT.bit.GPIO41)
对于输出模式
输出电平设置
设置输出为电平或低电平配置寄存器GPySET、GPyCLEAR、GPyTOGGLE、GPyDAT,但最好不要用GPyDAT来修改输出电平,因为可能影响到其他的GPIO,使用前面三个寄存器来修改不干扰其他引脚输出模式
开漏输出设置
配置寄存器GPyODR来设置开漏输出模式,默认为正常输出模式,本人理解为:正常输出模式就是推挽模式
GpioCtrlRegs.GPBODR.bit.GPIO41 = 0; // 默认0:正常输出 1:开漏输出
对于输入模式
在输入模式下,输入信号可以设置极性GPyINV寄存器(如果输入为1,并设置了输入极性反转,则输入反转为0),然后输入信号可以作用域低功耗模式控制,也可以被采样,如果被采样,配置寄存器GPyCTRL,与GPyQSEL1-2可以配置采样的周期与采样类型,其中采样周期是对应的是对系统时钟进行分频设置,采样类型有4种(同步采样、3次采样、6次采样、异步采样)采样之后,输入信号才会被传输到外设模块或Input XBar模块
极性设置
配置寄存器GPyINV设置输入信号是否反转
GpioCtrlRegs.GPAINV.bit.GPIO14 = 0;
采样类型
采样时间
输入资格方案被设计得非常灵活。通过配置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)比限定窗口短,被输入限定符忽略。
外部输入中断
如果需要设置输入中断,参考下面步骤配置中断
EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句 原子操作
InputXbarRegs.INPUT6SELECT = 41; // XINT1是GPIO44
PieVectTable.XINT3_INT = &xint3ISR;
EDIS; // EDIS的意思是不允许修改被保护的寄存器
PieCtrlRegs.PIEIER12.bit.INTx1 = 1; //使能PIE组1的INT1
XintRegs.XINT3CR.bit.POLARITY = 3; //00:选择中断为负边触发 01:选择中断为正边触发 10:选择中断为负边触发 11:选择中断为正或负边触发
XintRegs.XINT3CR.bit.ENABLE = 1; // 使能中断XINT1
如中断架构图所示,GPIO输入通过Xbar模块与外部中断XINT连接,通过XINT控制与PIE连接触发中断,Xbar模块就是一个信号的桥梁,把信号从一个外设连接到另一个外设
注意:
外部中断XINT1-5对应的INPUT X-BAR的连接是固定的
对于外部中断可以配置外部中断的触发方式
注意外部中断应与pie中断表一一对应,输入XBAR也是
GPIO一般设置流程
代码
下面代码:
-
设置GPIO31--LED1、GPIO34--LED2为输出模式,正常输出,禁止上拉
-
设置GPIO32、37、39为输出模式
-
设置GPIO41、44、46为输出模式
-
配置GPIO41、44、46外部中断,上升下降沿触发
GpioDriver.c
#include "GpioDriver.h"
#include "main.h"
// Function Prototypes
//
__interrupt void xint1ISR(void);
volatile uint32_t xint1count = 0;
__interrupt void xint2ISR(void);
__interrupt void xint3ISR(void);
/**********************************************************************
* 函数名称: GpioDriver_Init
* 功能描述: GPIO初始化
* 设置GPIO31--LED1、GPIO34--LED2为输出模式,正常输出,禁止上拉
* 设置GPIO32、37、39为输出模式
* 设置GPIO41、44、46为输出模式
* 配置GPIO41、44、46外部中断,上升下降沿触发
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
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.GPIO41 = 0; //默认为0 定义GPIO复位类型的引脚 复用选择:SYSRSn
// GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 0; // GPIO的引脚Mux复用选择
GpioCtrlRegs.GPBPUD.bit.GPIO41 = 0; // 0:开启上拉功能 默认1:表示禁止上拉
// GpioCtrlRegs.GPBODR.bit.GPIO41 = 0; // 默认0:正常输出 1:开漏输出
GpioCtrlRegs.GPBDIR.bit.GPIO41 = 0; // 0:配置引脚为输入。 1:配置输出引脚。
GpioCtrlRegs.GPBQSEL1.bit.GPIO41 = 0; // 0,0 Sync ; 0,1 qualification(3个采样); 1,0 qualification(6个采样); 1,1 Async(没有Sync或qualification);
// GpioDataRegs.GPBSET.bit.GPIO41 = 1; // 写1将强制GPIO输出数据锁存为
// GpioDataRegs.GPBCLEAR.bit.GPIO41 = 1; //写1将强制GPIO0输出数据锁存为0。
// 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的意思是不允许修改被保护的寄存器
EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句 原子操作
InputXbarRegs.INPUT4SELECT = 44; // XINT1是GPIO44
PieVectTable.XINT1_INT = &xint1ISR;
EDIS; // EDIS的意思是不允许修改被保护的寄存器
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; //使能PIE组1的INT1
XintRegs.XINT1CR.bit.POLARITY = 3; //00:选择中断为负边触发 01:选择中断为正边触发 10:选择中断为负边触发 11:选择中断为正或负边触发
XintRegs.XINT1CR.bit.ENABLE = 1; // 使能中断XINT1
EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句 原子操作
InputXbarRegs.INPUT5SELECT = 46; // XINT1是GPIO44
PieVectTable.XINT2_INT = &xint2ISR;
EDIS; // EDIS的意思是不允许修改被保护的寄存器
PieCtrlRegs.PIEIER1.bit.INTx5 = 1; //使能PIE组1的INT1
XintRegs.XINT2CR.bit.POLARITY = 3; //00:选择中断为负边触发 01:选择中断为正边触发 10:选择中断为负边触发 11:选择中断为正或负边触发
XintRegs.XINT2CR.bit.ENABLE = 1; // 使能中断XINT2
EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句 原子操作
InputXbarRegs.INPUT6SELECT = 41; // XINT1是GPIO44
PieVectTable.XINT3_INT = &xint3ISR;
EDIS; // EDIS的意思是不允许修改被保护的寄存器
PieCtrlRegs.PIEIER12.bit.INTx1 = 1; //使能PIE组1的INT1
XintRegs.XINT3CR.bit.POLARITY = 3; //00:选择中断为负边触发 01:选择中断为正边触发 10:选择中断为负边触发 11:选择中断为正或负边触发
XintRegs.XINT3CR.bit.ENABLE = 1; // 使能中断XINT1
}
__interrupt void xint1ISR(void)
{
xint1count++;
LED2_TOGGLE();
//
// Acknowledge this interrupt to get more from group 1
//
//Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
PieCtrlRegs.PIEACK.bit.ACK1 = 1;
}
__interrupt void xint2ISR(void)
{
xint1count++;
// LED2_TOGGLE();
if (1 == GPIO46_STATUS)
{
CpuTimer0Regs.TCR.bit.TIE = 0;
}
else if (0 == GPIO46_STATUS)
{
CpuTimer0Regs.TCR.all = 0x4000;
}
//
// Acknowledge this interrupt to get more from group 1
//
//Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
PieCtrlRegs.PIEACK.bit.ACK2 = 1;
}
__interrupt void xint3ISR(void)
{
LED1_TOGGLE();
if (1 == GPIO41_STATUS)
{
GPIO37_HIGH();
LED2_ON();
}
else if (0 == GPIO41_STATUS)
{
GPIO37_LOW();
LED2_OFF();
}
//
// Acknowledge this interrupt to get more from group 1
//
//Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
PieCtrlRegs.PIEACK.bit.ACK12 = 1;
}
/**********************************************************************
* 函数名称: Gpio_io_Test
* 功能描述: GPIO功能测试
* 如果GPIO44输入高 GPIO46输入高 则LED1亮 LED2 亮 GPIO32输出高 GPIO39输出高
* 如果GPIO44输入高 GPIO46输入低 则LED1亮 LED2 灭 GPIO32输出高 GPIO39输出低
* 如果GPIO44输入低 GPIO46输入低 则LED1灭 LED2 亮 GPIO32输出低 GPIO39输出高
* 如果GPIO44输入低 GPIO46输入低 则LED1灭 LED2 亮 GPIO32输出低 GPIO39输出低
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
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 GPIO41_STATUS (GpioDataRegs.GPBDAT.bit.GPIO41)
#define GPIO44_STATUS (GpioDataRegs.GPBDAT.bit.GPIO44)
#define GPIO46_STATUS (GpioDataRegs.GPBDAT.bit.GPIO46)
extern volatile uint32_t xint1count;
void GpioDriver_Init(void);
void Gpio_io_Test(void);
#endif