TM4C123系列GPIO引脚详解
电赛准备搞飞机,特地学了下TM4,准备用TM4搞飞控。
一.实验介绍
点亮TM4C123板载LED
二.原理图
三.所需函数
1.SysCtlClockSet(uint32_t ui32Config)
参数:ui32config 是需要配置设备的时钟。
共分四个参数,系统时钟分频值,使用OSC还是PLL倍频,OSC时钟源选择,外接晶振频率。1~3分频不可以用于PLL分频,4~5分频可以用于PLL分频,4分频之后是50MHz,5分频之后是40Mhz。
一般用(SYSCTL_SYSDIV_5 | SYSCTL_XTAL_16MHZ | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN)来将时钟配置为40Mhz。
作用:设置外设时钟
2.SysCtlPeripheralEnable(uint32_t ui32Peripheral)
参数:uint32_t ui32Peripheral为需要使能的外设。
作用:使能外设。
3.GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins)
参数:uint32_t ui32Port为外设基地址,uint8_t ui8Pins为外设的引脚
作用:设置GPIO口为输出
**3的作用相当于4和5一起使用,所以要么用3,要么4和5一起用
4.GPIODirModeSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32PinIO);
参数:uint32_t ui32Port为外设基地址,uint8_t ui8Pins为外设引脚,uint32_t ui32PinIO为对应外设需要设置的模式,一般设置为输出或者输入
#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
作用: 设置引脚的方向和模式
5.GPIOPadConfigSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32Strength, uint32_t ui32PadType);
参数:uint32_t ui32Port为外设基地址,uint8_t ui8Pins为外设引脚,uint32_t ui32Strength为输出驱动强度,uint32_t ui32PadType为具体的输出或者输入模式
//输出驱动强度
//! - \b GPIO_STRENGTH_2MA
//! - \b GPIO_STRENGTH_4MA
//! - \b GPIO_STRENGTH_8MA
//! - \b GPIO_STRENGTH_8MA_SC
//! - \b GPIO_STRENGTH_6MA
//! - \b GPIO_STRENGTH_10MA
//! - \b GPIO_STRENGTH_12MA
//模式
//! - \b GPIO_PIN_TYPE_STD 推挽
//! - \b GPIO_PIN_TYPE_STD_WPU 弱上拉
//! - \b GPIO_PIN_TYPE_STD_WPD 弱下拉
//! - \b GPIO_PIN_TYPE_OD 开漏
//! - \b GPIO_PIN_TYPE_ANALOG 模拟
//! - \b GPIO_PIN_TYPE_WAKE_HIGH
//! - \b GPIO_PIN_TYPE_WAKE_LOW
作用:为引脚设置PAD
6.GPIOPinWrite(uint32_t ui32Port, uint8_t ui8Pins, uint8_t ui8Val)
参数:uint32_t ui32Port为外设基地址,uint8_t ui8Pins为外设引脚,uint8_t ui8Val为写入的值(低电平为0,高电平为引脚名)
作用:输出高低电平
7,SysCtlDelay(uint32_t ui32Count)
参数:要执行的延迟循环迭代次数
作用:延时ui32Count * 三个指令周期的时间
8.SysCtlClockGet(void)
作用:获得时钟频率
四.代码
led.c
#include "inc/tm4c123gh6pm.h"
#include "led.h"
#include "inc/hw_gpio.h"
#include "inc/hw_sysctl.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
void LED_Config(void)
{
//设置时钟频率为40MHz
SysCtlClockSet( SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
//使能外设GPIOF
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF);
//设置GPIOF_PIn1,GPIOF_PIn2,GPIOF_PIn3为输出模式
GPIOPinTypeGPIOOutput( GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
// GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_DIR_MODE_OUT);
// GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
}
led.h
#ifndef __LED_H
#define __LED_H
void LED_Config(void);
#endif
main.c
#include "tm4c123gh6pm.h"
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_sysctl.h"
#include "inc/hw_gpio.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
void main(void)
{
LED_Config();
while(1)
{
//点亮红灯
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 2);
/*延时 SysCtlClockGet()*1/3*三个指令周期的时间(s),一个指令周期为1/40MHz,所以是
SysCtlClockGet()*1/3*3/40MHz(s),通过SysCtlClockGet()可以得到时钟频率也是40MHz,所以就
是延时1s*/
SysCtlDelay( SysCtlClockGet()*1/3);
//点亮蓝灯
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 4);
SysCtlDelay( SysCtlClockGet()*1/3);
//点亮绿灯
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 8);
SysCtlDelay( SysCtlClockGet()*1/3);
}
}