TM4之GPIO的输入输出

TM4C123G单片机之GPIO

1、输出:点亮LED

TM4的LED
原理图

IO口输出高电平点亮LED,下面我们学习如何控制IO口的高低电平。

  • 方式一:
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);			//端口F外设使能
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);		//PF1设置为输出
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);	//PF1输出高电平

相应的PF1置低:

GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);//PF1输出低电平

  • 方式二:
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_1,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_DIR_MODE_OUT);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);

这两种方式其实是一样的,因为这个GPIOPinTypeGPIOOutput函数是又被封装了一次,可以看看其定义:

void
GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins)
{
    //
    // Check the arguments.
    //
    ASSERT(_GPIOBaseValid(ui32Port));

    //
    // Set the pad(s) for standard push-pull operation.
    //
    GPIOPadConfigSet(ui32Port, ui8Pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);

    //
    // Make the pin(s) be outputs.
    //
    GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_OUT);
}

可以看出里面包含了GPIOPadConfigSetGPIODirModeSet两个函数。关于这两个函数的详细使用在学习GPIO输入时详细讲解。

2、输入:按键检测

TM4按键
原理图

首先初始化IO口为输入模式:

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);

这里说一下GPIODirModeSetGPIOPadConfigSet两个函数

1、GPIODirModeSet主要是设置某个端口的方向,这里主要看第三个参数,有以下几种选择:

#define GPIO_DIR_MODE_IN        0x00000000  // Pin is a GPIO input
#define GPIO_DIR_MODE_OUT       0x00000001  // Pin is a GPIO output
#define GPIO_DIR_MODE_HW        0x00000002  // Pin is a peripheral function

一看名字便知其意思。

2、GPIOPadConfigSet设置IO口

看第三个参数的选择:

#define GPIO_STRENGTH_2MA       0x00000001  // 2mA drive strength
#define GPIO_STRENGTH_4MA       0x00000002  // 4mA drive strength
#define GPIO_STRENGTH_6MA       0x00000065  // 6mA drive strength
#define GPIO_STRENGTH_8MA       0x00000066  // 8mA drive strength
#define GPIO_STRENGTH_8MA_SC    0x0000006E  // 8mA drive with slew rate control
#define GPIO_STRENGTH_10MA      0x00000075  // 10mA drive strength
#define GPIO_STRENGTH_12MA      0x00000077  // 12mA drive strength

即设置电流强度

看第四个参数的选择:

#define GPIO_PIN_TYPE_STD       0x00000008  // Push-pull
#define GPIO_PIN_TYPE_STD_WPU   0x0000000A  // Push-pull with weak pull-up
#define GPIO_PIN_TYPE_STD_WPD   0x0000000C  // Push-pull with weak pull-down
#define GPIO_PIN_TYPE_OD        0x00000009  // Open-drain
#define GPIO_PIN_TYPE_ANALOG    0x00000000  // Analog comparator
#define GPIO_PIN_TYPE_WAKE_HIGH 0x00000208  // Hibernate wake, high
#define GPIO_PIN_TYPE_WAKE_LOW  0x00000108  // Hibernate wake, low

即设置推挽,上下拉这种,作为输出时一般用推挽(GPIO_PIN_TYPE_STD),作为输入时一般用上拉(GPIO_PIN_TYPE_STD_WPU)或下拉(GPIO_PIN_TYPE_STD_WPD)。

初始化IO口为输入模式后便可以读取其电平状态了:

GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4)

此函数的返回值,以PF4为例,当PF4为高电平时返回值的低8位:00010000,即16。当PF4位低电平时返回0。

示例代码

功能:按下按键灯亮,松开灯灭。

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"

int main()
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    //设置PF4为上拉输入模式
    GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
    GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
    
    //设置PF1为输出模式
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);
    GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);
    
    //进行按键检测
    while(1)
    {
        //没有被按下,为高电平
        if(GPIO_PIN_4 == GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4))
            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);
        //被按下
        else
            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
    }
}

猜你喜欢

转载自blog.csdn.net/D_XingGuang/article/details/89320525
今日推荐