一、实验简介
简单的GPIO点灯实验,控制板载LED翻转
二、硬件连接
查看电路图
可见控制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)
- 功能:引脚配置为输出模式
- 参数:
- ui32Port GPIO口的基地址
- ui8Pins bit-packed格式表示的引脚
- 说明:要使GPIO引脚做为GPIO输出,必须正确地配置引脚。本函数提供这些引脚的典型配置。引脚使用bit-packed 字节格式表示,每一位表示一个要访问的引脚,位0表示引脚0,位1表示引脚1,以此类推。
- 底层:
- void GPIOPadConfigSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32Strength, uint32_t ui32PinType)设置输出类型和强度
- void GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_OUT);设置方向(输入or输出)
(3)void GPIOPinWrite(uint32_t ui32Port, uint8_t ui8Pins, uint8_t ui8Val)
- 功能:写值到指定引脚.
- 参数:
- ui32Port GPIO口的基地制作.
- ui8Pins bit-packed 格式表示的引脚
- 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;
}
}