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

STM32设置GPIO模式

1. 宏定义功能

I2C软件模拟驱动(Bit-Banging),寄存器方式设置GPIO:

#define SDA_IN() {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=(u32)3<<28;}

此代码常见于I2C通过快速切换引脚方向实现双向数据传输:

函数引脚功能配置寄存器值应用场景
SDA_IN浮空输入CNF15=10, MODE15=00读取从设备数据
SDA_OUT推挽输出,速度50MHzCNF15=00, MODE15=11主机发送数据
  • 优点:直接操作寄存器,切换速度快,适合实时性要求高的场景(如I2C位翻转)。

  • 缺点:可读性较差,需熟悉寄存器位域定义。

2. 代码解析

(1) 基本概念
  • 操作寄存器GPIOB->CRH(控制GPIOB的Pin8~Pin15)。

  • 移位操作:  x << n, 将x向左移动n位

  • 引脚确定:操作的是 Pin15(因为每引脚占4位,28 = 7×4,对应Pin15的配置位)。

(2) 寄存器操作逻辑
  • GPIOB->CRH &= 0X0FFFFFFF0x0FFFFFFF = 0000 1111 1111 1111 1111 1111 1111 1111

将CRH寄存器的[31:28]位(Pin15的CNF15和MODE15)清零,保留其他引脚配置

  • GPIOB->CRH |= (u32)8<<28: 8<<28 = 1000 0000 0000 0000 0000 0000 0000 0000

CNF15[1:0] = 10:浮空输入模式; MODE15[1:0] = 00:输入无需速度配置。

  • GPIOB->CRH |= (u32)3<<28:3<<28 = 0011 0000 0000 0000 0000 0000 0000 0000

CNF15[1:0] = 00:推挽输出模式; MODE15[1:0] = 11:输出速度50MHz

(3) HAL库等效代码

若使用STM32 HAL库,等效代码如下:

// SDA_IN(): 浮空输入
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  // 浮空输入
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);// SDA_OUT(): 推挽输出,50MHz
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_50MHz;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


注意事项

  1. 时钟使能:操作前需确保GPIOB时钟已启用(RCC->APB2ENR |= RCC_APB2ENR_IOPBEN)。

  2. 引脚冲突:避免与其他外设(如SPI、TIM)复用引脚时配置冲突。

  3. 位域安全:在多任务环境中,操作寄存器需加锁或关中断防止竞态条件。

http://www.lryc.cn/news/611183.html

相关文章:

  • Dify工作流三剑客:参数提取、变量赋值与聚合详解
  • Starrocks中的 Query Profile以及explain analyze及trace命令中的区别
  • Linux系统:基础I/O
  • 基于python的二手车价格预测及可视化系统,采用集成学习算法和diango框架
  • [按键精灵]
  • Pytorch基础入门2
  • AlmaLinux8 平替 manylinux_2_28-python 的 GPG密钥管理、安装 cuda sdk
  • gRPC Keepalive 机制详解与最佳实践
  • 微软Dragon Ambient eXperience (DAX) 深度解析
  • Linux 调度器函数sched_*系统调用及示例
  • Java JDBC连接池深度解析与实战指南
  • Transformer的并行计算与长序列处理瓶颈
  • Linux lvm逻辑卷管理
  • 猜数字游戏 Java
  • 【C++】模板深入进阶
  • Java技术栈/面试题合集(13)-网络篇
  • [Linux]学习笔记系列 -- [arm]boot
  • Android 之 Kotlin 和 MVVM 架构的 Android 登录示例
  • 腾讯云对象存储服务COS
  • QtPromise第三方库的介绍和使用
  • 人工智能领域、图欧科技、IMYAI智能助手2025年1月更新月报
  • ubuntu24中部署k8s 1.30.x-底层用docker
  • 相机拍摄的DNG格式照片日期如何修改?你可以用这款工具修改
  • Android异常信号处理详解
  • 【网络运维】Linux:系统启动原理与配置
  • Coze开源了!意味着什么?
  • 在Linux上部署RabbitMQ、Redis、ElasticSearch
  • 无监督学习聚类方法——K-means 聚类及应用
  • NFS CENTOS系统 安装配置
  • 走进“Mesh无线自组网”:开启智能家居和智慧工厂