单片机中的基础外设GPIO的知识和应用—(6)

GPIO(通用输入输出)是单片机与外部世界交互的重要接口。单片机的GPIO引脚可以灵活配置为输入、输出、中断或复用功能,广泛应用于LED控制、按键读取、传感器通信等场景。下文以STM32F103C8T6的GPIO为例。有些51单片机IO功能有的稍微有不同,具体要以规格书为准。

一、GPIO的基本功能与特性

1.1 GPIO引脚概述

STM32F103C8T6的GPIO引脚分布在多个端口(如PA、PB、PC、PD),每个引脚可以独立配置为以下模式:

输入模式:浮空输入、上拉输入、下拉输入。

输出模式:推挽输出、开漏输出。

复用功能:连接内部外设(如USART、I²C、SPI)。

模拟模式:用于ADC或DAC。

1.2 电气特性

输入电平:支持5V输入,但输出电平为3.3V。

输出能力:支持20mA电流输出,适用于驱动小型LED。

速度设置:提供2MHz、10MHz、50MHz三种速度选项。

二、GPIO的配置方法

2.1 初始化GPIO

在使用GPIO之前,需要通过以下步骤进行初始化:

1.使能时钟:通过RCC_APB2PeriphClockCmd()函数启用GPIO端口的时钟。

2.配置引脚模式:通过GPIO_InitTypeDef结构体设置引脚模式、速度、上拉/下拉电阻等参数。

3.应用配置:调用GPIO_Init()函数应用配置。

例:

c 复制代码
#include "stm32f10x.h"

void GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOC时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    // 配置PC13为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

2.2 GPIO操作

设置引脚电平:

c 复制代码
GPIO_SetBits(GPIOC, GPIO_Pin_13);  // 设置PC13为高电平
GPIO_ResetBits(GPIOC, GPIO_Pin_13);  // 设置PC13为低电平

读取引脚状态:

c 复制代码
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) {
    // 检测到高电平
}

三、GPIO的应用实例

3.1 LED控制

通过配置为输出功能,阔以控制外部LED的亮灭,是很常用的功能

c 复制代码
int main(void) {
    GPIO_Init();  // 初始化GPIO

    while (1) {
        GPIO_SetBits(GPIOC, GPIO_Pin_13);  // 点亮LED
        for (volatile int i = 0; i < 500000; i++);
        GPIO_ResetBits(GPIOC, GPIO_Pin_13);  // 熄灭LED
        for (volatile int i = 0; i < 500000; i++);
    }
}

3.2 按键/开关读取

将GPIO配置为输入模式,用于读取按键或开关状态

c 复制代码
void GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int main(void) {
    GPIO_Init();

    while (1) {
        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {
            // 按键按下
        }
    }
}

3.3 复用功能

有的GPIO除开基本的输入输出功能外,还有其他复用功能,比如通讯、定时器PWM输出,PWM输入捕获等

c 复制代码
void UART_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 使能USART1和GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA9为USART1_TX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置PA10为USART1_RX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置USART1
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);

    USART_Cmd(USART1, ENABLE);
}

四、性能优化与注意事项

4.1 时钟管理

在配置GPIO之前,必须启用对应的时钟。

合理选择时钟源和分频因子,以平衡性能和功耗。

4.2 中断配置

GPIO支持中断功能,可用于检测按键按下、外部信号触发等。

配置GPIO中断需要设置中断优先级和中断处理函数。

4.3 功耗管理

在不需要GPIO功能时,可以将其配置为浮空输入模式。

使用低功耗模式(如睡眠模式)减少系统功耗。

4.4 软件配置

不使用的IO 软件上不要去配置功能,或者如果配置功能了,硬件没用上的IO记得加上 下拉/上拉电阻,以免出错。

相关推荐
inputA34 分钟前
【LwIP源码学习6】UDP部分源码分析
c语言·stm32·单片机·嵌入式硬件·网络协议·学习·udp
思考的味道1 小时前
SVM在医疗设备故障维修服务决策中的应用:策略、技术与实践
嵌入式硬件
真的想上岸啊2 小时前
学习51单片机01(安装开发环境)
嵌入式硬件·学习·51单片机
sz66cm2 小时前
Linux基础 -- SSH 流式烧录与压缩传输笔记
linux·笔记·ssh
7yewh3 小时前
MCU程序加密保护(二)ID 验证法 加密与解密
单片机·嵌入式硬件·安全
YOYO--小天3 小时前
RS485和RS232 通信配置
linux·嵌入式硬件
小_楠_天_问3 小时前
第二课:ESP32 使用 PWM 渐变控制——实现模拟呼吸灯或音调变化
c语言·嵌入式硬件·mcu·esp32·arduino·pwm·esp32-s3
开发游戏的老王4 小时前
[虚幻官方教程学习笔记]深入理解实时渲染(An In-Depth Look at Real-Time Rendering)
笔记·学习·虚幻
欢乐熊嵌入式编程4 小时前
智能手表项目风险评估与应对计划书
嵌入式硬件·物联网·目标跟踪·智能手表
JANYI20184 小时前
TTL、RS-232、RS-485电平转换详解
单片机·嵌入式硬件