DSP

TM4C123GLaunchPad教程二_GPIO输入输出

2019-07-13 18:23发布

class="markdown_views prism-tomorrow-night">

TM4C123GLaunchPad教程二_GPIO输入输出

前言

​ 首先先推荐两个文档,一个是TM4C123G的数据手册,一个是库函数手册,点击下面的链接可以下载。 ​ Tiva™ TM4C123GH6PM Microcontroller DATA SHEET .pdfTivaWare™ Peripheral Driver Library USER’S GUIDE .pdf ​ 数据手册中包含了各个外设的介绍以及寄存器的介绍,可以让我们了解各个外设的组成和功能,库函数手册包含了各个库函数的介绍,输入输出参数,文中讲到的函数可以翻看手册加深一下了解。

介绍

​ TM4C123G的IO口是8个一组的,PA0-PA7,PB0-PB7,等等。GPIO配置的时候可以配置它的方向(输入、输出、硬件控制),输出能力(2MA、4MA、6MA等),IO口种类(开漏、推挽、上拉、下拉等)。

代码及详解

/** * main.c * 按键为PF4,按下接地,LED为PF1,高电平点亮。 */ /*包含了例如uint8_t等的定义*/ #include /*包含了布尔型定义*/ #include /*外设和内存的基地址定义*/ #include "inc/hw_memmap.h" /*GPIO的库函数*/ #include "driverlib/gpio.h" /* 跟系统控制有关的库函数 */ #include "driverlib/sysctl.h" int main(void) { uint8_t uc_Flag = 1; /* 使能GPIOF */ SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); /* 等待GPIOF准备完毕 */ while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)) { } /* PF1 IO口配置为输出模式 */ GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1); /* PF4 IO口配置为输入模式 */ GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4); /* 配置上拉电阻 */ GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); /* PF1置高 */ GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1); while(1) { /* 检测IO口电平,如果为0,即为按键按下 */ if(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4) == 0) { /* 根据当前状态,反转电平 */ if(uc_Flag == 1) { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1); uc_Flag = 0; } else if(uc_Flag == 0) { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0); uc_Flag = 1; } } } return 0; } 下面逐部分进行一下讲解: /*包含了例如uint8_t等的定义*/ #include /*包含了布尔型定义*/ #include /*外设和内存的基地址定义*/ #include "inc/hw_memmap.h" /*GPIO的库函数*/ #include "driverlib/gpio.h" /* 跟系统控制有关的库函数 */ #include "driverlib/sysctl.h" ​ 这部分是需要包含的头文件,用空行分成了两部分这,stdint.h,stdbool.h,inc/hw_memmap.h,这三个文件是必须要包含的,下面两个是库函数的头文件,可以根据需要包含不同的,这里包含了这两个。这里要吐槽一下,库函数的整个编写用到了上面的三个头文件,我就想为啥不把这几个文件直接包含到库函数里呢,翻看了库函数后发现,这三个文件是包含在库函数的.c里的而不是在.h里,而包含库函数的时候是包含的.c,因此还需要写上前三个头文件,不理解为啥要这么编写。 /* 使能GPIOF */ SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); /* 等待GPIOF准备完毕 */ while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)) { } ​ 这里是GPIOF的使能,TM4C123G的每个外设使用的时候都需要先使能,利用SysCtlPeripheralEnable()函数进行使能,然后循环调用SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)直到返回非零值,外设准备完毕。 /* PF1 IO口配置为输出模式 */ GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1); /* PF4 IO口配置为输入模式 */ GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4); /* 配置上拉电阻 */ GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); ​ 这里就是IO口的配置部分了,IO口的模式配置库函数中给出了三个函数,分别是输入,输出,开漏输出。 void GPIOPinTypeGPIOInput(uint32_t ui32Port, uint8_t ui8Pins); void GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins); void GPIOPinTypeGPIOOutputOD(uint32_t ui32Port, uint8_t ui8Pins); ​ 这三个函数的内部其实是调用了同样的两个函数, void GPIODirModeSet(uint32_t ui32Port, uint8_t ui8Pins, uint32_t ui32PinIO); void GPIOPadConfigSet(uint32_t ui32Port, uint8_t ui8Pins, uint32_t ui32Strength, uint32_t ui32PadType); GPIODirModeSet是用来配置IO口的方向的,有三个可选参数,输入,输出和硬件控制,硬件控制在用到了TM4C的各种外设的时候需要这样配置,GPIOPadConfigSet用来配置IO口的驱动能力和模式的。 ​ 进行GPIO的配置的时候有两种方式,第一个就是用那三个现成的函数进行配置,第二种就是调用下面的两个函数来进行配置,第一种方式较为简单,但是像我们配置PF4的时候要配置为上拉输入模式,而GPIOPinTypeGPIOInput配置的时候是浮空的,因此还需要调用GPIOPadConfigSet配置为上拉模式,这时完全可以直接用GPIODirModeSetGPIOPadConfigSet来进行配置。 ​ 下面到了输入输出函数的介绍了 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1); GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4); ​ 这两个函数有一个要注意的点,关于IO口状态的部分,IO口写低电平的时候输入参数为0,而当写高电平的时候,输入参数取决于当前的端口,当前是GPIO_PIN_1,输入参数就是GPIO_PIN_1,是GPIO_PIN_4,输入参数就是GPIO_PIN_4,使用的时候不要搞错,从IO口读取的时候同理,返回值为0或当前的端口,具体原因可以参考上面提到的数据手册的10.2.1.2 Data Register Operation 这一节。