当前位置: 首页 > 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.dtcms.com/a/316959.html

相关文章:

  • P1103《书本整理》精讲
  • CubeMX安装芯片包
  • Go语言 反射
  • golang的切片
  • Vue.js之核心语法与指令
  • 每日五个pyecharts可视化图表-bars(4)
  • mac colima解决容器化部署权限问题 :Permission denied
  • 三款好用的PDF阅读器
  • PLC学习之路-基础知识-(一)
  • 无刷电机控制 - STM32F405+CubeMX+HAL库+SimpleFOC05,完成霍尔传感器的校准
  • leetcode-python-删除链表的倒数第 N 个结点
  • 初始化列表,变量存储区域和友元变量
  • AcWing 3690:求交点 ← 复旦大学考研机试题 + 克莱姆法则
  • zyh贪心类题目补题报告
  • Spring配置JDBC,使用JdbcTemplate套件和Druid套件
  • IDEA JAVA工程入门
  • CVPR优秀论文 | DashGaussian:在200秒内优化三维高斯点绘制
  • Redis Windows迁移方案与测试
  • 嵌入式学习 双向链表 循坏链表 内核链表
  • Reading Books(Sorting and Searching)
  • Redis备份方案:持久化与外部工具全解析
  • G1系统概括
  • 电脑搜索不到公司无线网络
  • 【C# Winform】 Action事件驱动的多层数据传递
  • 【运维部署篇】OpenShift:企业级容器应用平台全面解析
  • 跑yolov5的train.py时,ImportError: Failed to initialize: Bad git executable.
  • Android 之 Kotlin中的kapt
  • io_uring系统调用及示例
  • Houdini Pyro学习笔记
  • [数组]977.有序数组的平方;209.长度最小的子数组