当前位置: 首页 > news >正文

STM32 GPIO其他少见的库函数解析

一,

void GPIO_DeInit(GPIO_TypeDef* GPIOx);

先看一下这个函数,我们可以看到这个函数的参数是一个GPIO组的参数(GPIOB,GPIOC,GPIOA,,,,),

那我们进入标准外设库这个函数定义里面,可以看到

void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{/* Check the parameters */assert_param(IS_GPIO_ALL_PERIPH(GPIOx));if (GPIOx == GPIOA){RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, ENABLE);RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, DISABLE);}else if (GPIOx == GPIOB){RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, ENABLE);RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, DISABLE);}else if (GPIOx == GPIOC){RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, DISABLE);}。。。。。。。。。。。。}
}

功能说明:

这个函数的作用是:

将指定的 GPIO 端口(如 GPIOA、GPIOB…)恢复到上电默认状态。

也就是说:

  • 清除该端口之前的所有配置(输入/输出模式、上拉/下拉、复用功能、输出值等);
  • 让它的寄存器值回到复位默认值(Reset Value)

相当于“把这个 GPIO 重新初始化前清空一次”。

关键:用 RCC 外设复位功能清除配置

在 STM32 中,所有外设(包括 GPIO)都连接到 RCC(时钟控制器)。
RCC 有一个很重要的功能:

可以通过设置复位位来“软复位”任意外设。

比如:

  • RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, ENABLE)
    表示:让 GPIOA 进入复位状态
  • 然后再执行
    RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, DISABLE)
    表示:退出复位状态

这个“复位-释放”操作,就会让 GPIOA 寄存器清零,恢复成出厂默认值。

所以这个函数我们用到的很少。

void GPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);

参数是一个结构体指针参数,我们接着去标准外设库这个函数定义

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
{/* Reset GPIO init structure parameters values */GPIO_InitStruct->GPIO_Pin  = GPIO_Pin_All;GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN;GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStruct->GPIO_OType = GPIO_OType_PP;GPIO_InitStruct->GPIO_PuPd = GPIO_PuPd_NOPULL;
}

GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All;

意思是:

默认选择所有引脚(Pin0~Pin15)

也就是说,默认结构体里认为“我想配置整个端口的所有引脚”,但实际上,你可以在使用前自己修改它,比如:

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; // 只配置PA5引脚

GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN;

默认模式是:

输入模式(Input Mode)。

STM32 的 GPIO 模式主要有以下几种:

模式含义
GPIO_Mode_IN输入模式
GPIO_Mode_OUT推挽输出
GPIO_Mode_AF复用功能(如USART、SPI)
GPIO_Mode_AN模拟输入(ADC用)

默认用输入模式,是为了安全起见(防止意外输出造成短路或干扰)。



GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz;

设置默认的引脚输出速度为:

2MHz(低速模式)

这对应的是 GPIO 输出信号的切换速度。不同速度对应不同功耗和干扰水平:

参数速度特点
GPIO_Speed_2MHz低速功耗低、干扰小(默认)
GPIO_Speed_25MHz中速兼顾一般外设使用
GPIO_Speed_50MHz高速适合高速通讯口(SPI等)
GPIO_Speed_100MHz超高速用于时钟或高速外设线

GPIO_InitStruct->GPIO_OType = GPIO_OType_PP;

设置输出类型为:

推挽输出(Push-Pull)

推挽输出的特点是:

  • 能够主动输出高电平或低电平;
  • 驱动能力强。

另一种类型是开漏输出(Open-Drain),用于I²C总线等需要多设备共享线的场合。



GPIO_InitStruct->GPIO_PuPd = GPIO_PuPd_NOPULL;

设置上下拉为:

无上下拉(No Pull-up or Pull-down)

STM32 的输入引脚是“高阻态”的,如果不设置上拉或下拉,电平可能会漂浮不定(悬空)

可选项如下:

参数功能
GPIO_PuPd_NOPULL不使用内部上拉/下拉
GPIO_PuPd_UP上拉
GPIO_PuPd_DOWN下拉

使用场景举例

在实际应用中,通常这样使用:

GPIO_InitTypeDef GPIO_InitStructure;
/* 先调用结构体初始化函数,填充默认值 */
GPIO_StructInit(&GPIO_InitStructure);
/* 再根据需求修改部分字段 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/* 最后应用到具体端口 */
GPIO_Init(GPIOA, &GPIO_InitStructure);

这样可以避免忘记初始化结构体中某些字段,减少程序错误。

三,

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{__IO uint32_t tmp = 0x00010000;/* Check the parameters */assert_param(IS_GPIO_ALL_PERIPH(GPIOx));assert_param(IS_GPIO_PIN(GPIO_Pin));tmp |= GPIO_Pin;/* Set LCKK bit */GPIOx->LCKR = tmp;/* Reset LCKK bit */GPIOx->LCKR =  GPIO_Pin;/* Set LCKK bit */GPIOx->LCKR = tmp;/* Read LCKK bit*/tmp = GPIOx->LCKR;/* Read LCKK bit*/tmp = GPIOx->LCKR;

背景原理 — GPIO 锁定机制

STM32 的每个 GPIO 端口都有一个专门的寄存器:
GPIOx_LCKR(Lock Register)

作用:
当你锁定后,这个引脚的模式、上下拉、输出类型、速度等配置都会被冻结。
即使你后面再调用 GPIO_Init() 或者直接写寄存器,也无法修改
必须复位 MCU 才能重新解锁。

所以这个函数就是将某个指定的GPIO引脚锁定,用的很少

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);

一、函数作用概述

GPIO_PinAFConfig() 用于给某个 GPIO 引脚选择外设复用功能(Alternate Function)。

简单来说,STM32 的引脚都很“多才多艺”,
一个引脚既可以当普通 IO,也可以挂到各种外设上去。
比如:

引脚可选功能
PA9普通输出 / USART1_TX / TIM1_CH2 / ...
PB6GPIO / I2C1_SCL / TIM4_CH1 / USART1_TX / ...

GPIO_PinAFConfig() 就是告诉芯片:

“喂,PA9 你现在不当GPIO了,你去当USART1_TX吧!”

二、函数原型解析

voidGPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
参数说明
GPIOx要配置的端口(如 GPIOA、GPIOB...)
GPIO_PinSource引脚编号(0~15,对应 Pin0~Pin15)
GPIO_AF选择的复用功能编号(AF0 ~ AF15)

三、STM32 复用功能结构图

每个引脚的功能由寄存器控制:

GPIOx_AFRL 寄存器  → 控制 Pin0~Pin7
GPIOx_AFRH 寄存器  → 控制 Pin8~Pin15

每个引脚占 4 位(bits)来选择 AF 功能号:

AF值外设功能(不同型号略有差异)
AF0系统功能(如 MCO、RTC、SWD)
AF1TIM1 / TIM2
AF2TIM3 / TIM4 / TIM5
AF3TIM8 / TIM9 / TIM10 / TIM11
AF4I2C1 / I2C2 / I2C3
AF5SPI1 / SPI2
AF6SPI3 / I2S
AF7USART1 / USART2
AF8USART6 / UART4 / UART5
AF9CAN1 / CAN2 / TIM12 / TIM13 / TIM14
AF10OTG_FS / OTG_HS
AF11Ethernet
AF12FSMC / SDIO / OTG_HS
AF13DCMI
AF14未定义
AF15EVENTOUT


完整的复用配置流程

假设我们要用 PA9 作为 USART1_TX:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);   
// 开GPIO时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;            
// 模式改为复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF7_USART1); 

这两步缺一不可

  1. GPIO_Mode_AF —— 把口切换成复用模式;
  2. GPIO_PinAFConfig() —— 告诉它复用给谁。
http://www.dtcms.com/a/544796.html

相关文章:

  • 云栖实录|驰骋在数据洪流上:Flink+Hologres驱动零跑科技实时计算的应用与实践
  • 百度免费网站空间中国铁建股份有限公司
  • 【Git】版本更新
  • 网站建设与维护就业前景电商培训类网站模板下载
  • Android电池优化和前后台任务
  • 使用 Java 将 Excel 工作表转换为 CSV 格式
  • Kotlin基础类型扩展函数使用指南
  • 城市建设网站做印刷品去哪个网站
  • 怎么查网站到期时间php网站搭建环境
  • 汽车行业SCRM:企业微信+服务商模式破解汽车服务行业痛点的案例分析
  • 【第五章:计算机视觉-项目实战之推荐/广告系统】3.精排算法-(4)重排算法:MMR、DPP原理精讲
  • Xamarin.Forms菜鸟笔记--10.获取点击/滑动 Image位置
  • 网络环路“侦探”指南:如何快速定位与根除网络风暴
  • Android 自定义Switch
  • HBuilder 上架 iOS 应用全流程指南:从云打包到开心上架(Appuploader)上传的跨平台发布实践
  • PHP基础知识
  • Obsidian 入门教程
  • 响应式购物网站模板广州网站优化电话
  • 中山 网站建设 骏域做ag视频大全网站
  • Vue二进制数据渲染成图片
  • 未来智能网联汽车的网络安全档案建立方法
  • 防止表单重复提交功能简单实现
  • 网络安全等级保护测评高风险判定实施指引(试行)--2020与2025版对比
  • Squid 可观测性最佳实践
  • 【深度学习新浪潮】DeepSeek-OCR深度解析:视觉-文本压缩驱动的新一代OCR技术革命
  • 官方网站建设投标书网站建设包含哪些
  • 相应式手机网站建设网站建设专员一定要会网站建设吗
  • 手机云台ESD整改案例-阿赛姆电子
  • 拆解ASP.NET MVC 核心优势:松耦合、易测试、SEO 友好、RESTful 实战指南
  • 远期合约和期权合约的区别是什么?