TI DSP TMS320F280025 Note9:GPIO输入输出与外部中断功能原理与应用

news2024/9/24 7:26:17

TMS320F280025 GPIO输入输出与外部中断功能原理与应用


文章目录

  • TMS320F280025 GPIO输入输出与外部中断功能原理与应用
  • GPIO原理
    • 输入输出模式的共同特性
      • 1. 复用设置
      • 2. 内部上拉设置
      • 3. GPIO状态读取
    • 对于输出模式
      • 输出电平设置
      • 开漏输出设置
    • 对于输入模式
      • 极性设置
      • 采样类型
        • 不同步(异步输入)
        • 只同步到SYSCLKOUT
        • 使用采样窗口进行鉴定
  • 外部输入中断
  • GPIO一般设置流程
  • 代码
    • GpioDriver.c
    • GpioDriver.h


GPIO原理

GPIO原理框图如图所示
在这里插入图片描述

输入输出模式的共同特性

在这里插入图片描述

输入输出模式的共同特性:

  1. 复用设置
  2. 内部上拉设置
  3. 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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2093681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS3换装达人原理

引言 换装或者是换皮肤是常见的行为&#xff0c;我们可以先看下效果&#xff1a; 选择不同的颜色&#xff0c;就可以秒变人物服装的颜色&#xff0c;原理其实非常简单 实现步骤 主要分为三步&#xff0c;即素材的提供、布局样式、动态控制 图片提供 提供两张图片&#xff…

每日OJ_牛客_红与黑(简单dfs)

目录 牛客_红与黑&#xff08;简单dfs&#xff09; 解析代码 牛客_红与黑&#xff08;简单dfs&#xff09; 红与黑__牛客网 解析代码 循环接收每组用例&#xff0c;对于每组用例进行如下操作&#xff1a; 1. 找到‘’所在的位置&#xff0c;即起始搜索的点 2. 使用DFS搜索地…

20240831-PostgreSQL小课持续更新

PostgreSQL 小课专栏介绍 PostgreSQL 小课目前已累积了近 21 万字。小课最新的大纲&#xff1a; 目前已完成大概 95% 的进度&#xff1a; (venv312) ➜ mypostgres git:(dev) sh scripts/word_statistics_pg_style.shFilename …

【微服务】限流、熔断和降级(持续更新中~)

1、限流 1.1 什么是限流 限流&#xff08;Rate Limiting&#xff09;是一种常用的技术手段&#xff0c;用于控制系统对资源的访问速率&#xff0c;确保系统的稳定性和可靠性。在分布式系统、Web服务、API接口等场景中&#xff0c;限流尤为重要。通过限制请求的频率或数量&…

uniapp u--input实现select下拉列表 input点击事件

背景&#xff1a; 技术框架&#xff1a; uniapp框架(vue2语法)uView组件库。 通过form表单实现数据列表的“查询”功能。注意&#xff1a; 1、<u--form>内部嵌套<u-form-item>&#xff0c;<u-form-item>内部嵌套<u--input>表单组件。 2、H5浏览器端&am…

华为 HCIP-Datacom H12-821 题库

有需要题库的可以看主页置顶 1.MSTP 有不同的端口角色&#xff0c;对此说法不正确的是&#xff1a; A、MSTP 中除边缘端口外&#xff0c;其他端口角色都参与 MSTP 的计算过程 B、MSTP 同一端口在不同的生成树实例中可以担任不同的角色。 C、MSTP 域边缘端口是指位于 MST 域的边…

QT实战项目之音乐播放器

项目效果演示 myMusicShow 项目概述 在本QT音乐播放器实战项目中&#xff0c;开发环境使用的是QT Creator5.14版本。该项目实现了音乐播放器的基本功能&#xff0c;例如开始播放、停止播放、下一首播放、上一首播放、调节音量、调节倍速、设置音乐播放模式等。同时还具备搜索功…

SPR系列单点激光测距传感器|模组之RS485串口调试说明

SPR系列单点激光测距传感器|模组是一款近程红外测距传感器&#xff0c;测距距离可达0-10米&#xff0c;可用于对物体进行非接触式距离测量&#xff0c;其应用场景十分广泛工业自动化&#xff1a;在生产线、传送带等工业自动化场景中&#xff0c;可以使用红外测距传感器进行物体…

Git安装及配置

Git安装 在你开始使用 Git 前,需要将它安装在你的计算机上。 即便已经安装,最好将它升级到最新的版本。 你可以通过软件包或者其它安装程序来安装,或者下载源码编译安装。 下面,我们将会介绍不同操作系统上 Git 的安装方法。 在 Windows 上安装 在 Windows 上安装 Git 的…

LangChain基础知识

这篇文档介绍了LangChain大模型应用开发框架的入门知识和核心内容&#xff0c;包括LangChain是什么、为什么需要它、典型使用场景、基础概念与模块化设计等。同时&#xff0c;还详细阐述了该框架的核心模块如标准化的大模型抽象、大模型应用的最佳实践、赋予应用记忆的能力、框…

JDBC |封装JDBCUtils|PreparedStatement|事务|批处理|数据库连接池| Blob类型数据的读写|Apache—DBUtils简介

一.概述 在Java中&#xff0c;数据库存取技术可分为如下几类&#xff1a; JDBC直接访问数据库JDO技术&#xff08;Java Data Object&#xff09;第三方O/R工具&#xff0c;如Hibernate, Mybatis 等 JDBC是java访问数据库的基石&#xff0c;JDO, Hibernate等只是更好的封装了J…

计算多图的等价无向图的邻接链表表示

计算多图的等价无向图的邻接链表表示 摘要:一、引言二、算法思路三、伪代码实现四、C代码实现五、算法分析六、结论摘要: 在图论中,多图(Multigraph)是一种允许边重复以及存在自循环边(即一个顶点到其自身的边)的图。给定一个多图的邻接链表表示,本文旨在探讨如何构造…

用EA和SysML一步步建模(03)创建包图和包的关系

用EA和SysML一步步建模的操作指南&#xff08;01&#xff09; 用EA和SysML一步步建模&#xff08;02&#xff09;导入ISO-80000 接下来&#xff0c;按照下图添加上其他的包&#xff1a; 步骤 2.2 选中Browser中的“蒸馏器项目”&#xff0c;点击New Package&#xff08;Br…

windows C++ 并行编程-C++ AMP 图形(二)

文中的"显存"还没有找到合适的中文翻译&#xff0c;它的英文名称是texture&#xff0c; 在应用开发者来看,texture是一个名词,在物理上指的是 GPU显存中一段连续的空间。 读取显存对象 可以使用 texture::operator[]、texture::operator() 运算符或 texture::get 方…

物流需求回复势头稳定,目前全国社会物流总额达197.7万亿元

中国物流与采购联合会29日公布今年1-7月份物流运行数据。数据显示&#xff0c;物流需求恢复势头基本稳定&#xff0c;7月份虽受部分地区高温多雨等短期因素扰动&#xff0c;但物流总额增速环比有所提升&#xff0c;呈现温和回升态势。 今年1-7月份&#xff0c;全国社会物流总额…

数据仓库系列17:元数据管理在数据仓库中的作用是什么?

想象一下,你正在管理一个巨大的图书馆,里面存放着数以万计的书籍。但是,这个图书馆没有任何目录、索引或分类系统。你能想象找到特定的一本书会有多困难吗?这就是没有元数据管理的数据仓库的真实写照。 目录 什么是元数据?元数据管理的重要性元数据在数据仓库中的类型1. 技术…

Open3D mesh Taubin滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 参数详解 返回值 2.2完整代码 三、实现效果 3.1加入噪声的mesh 3.2Taubin迭代10次 3.3Taubin迭代100次 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云…

【学习笔记】卫星通信发展趋势

卫星通信系统是融合现代通信技术、航天技术与计算机技术的综合应用&#xff0c;已成为国际与国内通信、国防、移动通信及广播电视领域的关键基础设施。基于其频带宽度大、通信容量高、业务兼容性强、覆盖范围广、性能稳定、地理条件适应性高及成本与距离无关等特性&#xff0c;…

猫咪浮毛不再乱飞 希喂、霍尼韦尔、352宠物空气净化器功能实测

“你真的养猫了吗&#xff1f;为什么一点也看不出来&#xff1f;”养宠以来我经常收到这样的提问&#xff0c;原因是另一位铲屎官身上总会时不时出现猫咪毛发&#xff0c;标记着他的身份。哪有不会掉毛的猫咪呢&#xff0c;何况到了夏天&#xff0c;换毛季的掉毛量更是惊人。其…

KTV开台源码--SAAS本地化及未来之窗行业应用跨平台架构

一、ktv开台源码 function 未来之窗_人工智能_KTV开台(title,桌台id,类型id,类型名称){var 未来之窗app_通用ID"未来之城激光加工机";var 未来之窗_人工智能_内容 tpl_未来之窗_模板_KTV开单;CyberWin_Dialog.layer(未来之窗_人工智能_内容,{type:"frame",…