• 为了准备电赛临时学一下TM4C123G,简单记录学习内容
  • 大家可以在​​这里​​下载我收集的资源,非常全面,花了很大功夫收集来的,还有书籍、例程代码等
  • 还可以在TI官网下载相关文档​​TI官网​

一、实验简介

简单的GPIO点灯实验,控制板载LED翻转

二、硬件连接

查看电路图

TM4C123G学习记录(2)--GPIO_#include


TM4C123G学习记录(2)--GPIO_#include_02


可见控制LED是一个三极管开关电路,单片机PF1/PF2/PF3连接到LED_R/LED_B/LED_G,GPIO输出高电平即可点亮二极管

三、相关库函数

(1)void SysCtlPeripheralEnable(uint32_t ui32Peripheral)
  • 功能:使能外设时钟
  • 参数:uint32_t ui32Peripheral 要使能的外设
  • 说明:从写外设使能操作完成到实际上的外设使能间有5个时钟周期的延迟,这期间内访问外设将导致一个总线错误。应注 意确保在这段时间内不访问该外设。
(2)void GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins)
  • 功能:引脚配置为输出模式
  • 参数:
  1. ui32Port GPIO口的基地址
  2. ui8Pins bit-packed格式表示的引脚
  • 说明:要使GPIO引脚做为GPIO输出,必须正确地配置引脚。本函数提供这些引脚的典型配置。引脚使用bit-packed 字节格式表示每一位表示一个要访问的引脚,位0表示引脚0,位1表示引脚1,以此类推。
  • 底层:
  1. void GPIOPadConfigSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32Strength, uint32_t ui32PinType)设置输出类型和强度
  2. void GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_OUT);设置方向(输入or输出)
(3)void GPIOPinWrite(uint32_t ui32Port, uint8_t ui8Pins, uint8_t ui8Val)
  • 功能:写值到指定引脚.
  • 参数:
  1. ui32Port GPIO口的基地制作.
  2. ui8Pins bit-packed 格式表示的引脚
  3. ui8Val 将要写入引脚的值.
  • 说明:写相应位的数值到ui8Pins参数指定的引脚,写数值时不影响配置为输入的引脚状态。引脚用 bit-packed 字节格式表示, 每一个位代表一个引脚,位0表示GPIO口的引脚0,位1表示GPIO口的引脚1,以此类推。
(4)不受频率影响的延时函数
  • SysCtlDelay(100*(SysCtlClockGet()/3000));
  • 见我上一篇文章​​TM4C123G学习记录(1)–时钟​​

四、示例代码

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_types.h" //通用类型和宏
#include "inc/hw_memmap.h" //外设和存储器的基地址
#include "driverlib/sysctl.h" //API函数中外设、状态等的标志
#include "driverlib/gpio.h"

int main(void)
{
uint8_t ui8LED = 2; //2 = 0010
//系统时钟分频器系数|选择外部晶振频率|使用PLL锁相环作为系统时钟源
SysCtlClockSet(SYSCTL_SYSDIV_6|SYSCTL_XTAL_16MHZ|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN);
//使能PF时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
//配置引脚为GPIO输出,底层是GPIOPadConfigSet和GPIODirModeSet
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

while(1)
{
// Turn on the LED :PF1(R),PF2(B),PF3(G)
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, ui8LED);

// Delay for a bit
SysCtlDelay(100*(SysCtlClockGet()/3000));

// Cycle through Red, Green and Blue LEDs
//写入2->4->8(0010->0100->1000)(R->B->G)
if (ui8LED == 8)
ui8LED = 2;
else
ui8LED = ui8LED*2;
}
}