TM4C123系列(一)————GPIO

本文介绍如何使用TM4C123微控制器点亮板载LED。包括配置时钟、使能GPIO外设、设置GPIO为输出模式及控制LED亮灭的方法。文章详细解释了关键函数的作用及参数,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

电赛准备搞飞机,特地学了下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);
	}
}

### TM4C123G 单片机自锁功能实现 对于TM4C123G单片机而言,自锁功能通常指的是防止意外更改某些重要配置的功能。这种机制可以通过设置特定的寄存器位来激活或禁用,从而保护关键外设免受误操作的影响。 #### GPIO 锁定 (GPIOLOCK 和 GPIOCR) 为了确保端口的安全性和稳定性,在修改些特殊用途的引脚之前,必须先执行解锁序列。具体来说: - 当尝试改变被锁定引脚的状态时,需要向 `GPIOLOCK` 寄存器写入键值 (`0x4C4F434B`) 来解除锁定状态[^2]。 ```c // 解除PF0引脚锁定 HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0x4C4F434B; ``` - 接着可以利用 `GPIOCR` 寄存器允许对这些引脚的操作权限。这步骤是为了进步确认只有经过授权后的代码才能访问并调整选定引脚的行为模式。 ```c // 启用 PF0 的控制权 HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= 0x01; ``` 以上两步完成后即可安全地配置原本处于锁定状态下的引脚属性而不会引发异常情况发生。 #### 软件层面的互斥锁/临界区处理 除了硬件级别的防护措施之外,还可以采用软件手段增强系统的可靠性。例如,在多任务环境中引入互斥量(mutex),当个进程正在占用资源期间阻止其他任何试图获取相同资源的任务继续运行直到前者释放为止;或者定义临界区域(critical section),在此范围内关闭中断服务程序(ISRs)以避免并发冲突带来的不确定性影响系统正常工作流程。 通过上述两种方式——即硬件级别的引脚锁定以及软件层面上针对共享资源管理所采取的方法相结合,能够有效地保障TM4C123G单片机应用程序中的自锁需求得到满足。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值