[STM32F1] 一个IO口同时配置为输入输出功能,这样对不?

[复制链接]
 楼主| lvluoo 发表于 2025-3-3 22:13 | 显示全部楼层 |阅读模式
想要在stm32f103中配置一个引脚同时具备输入和输出功能,这种功能能否实现?输出时配置为输出,
用作输入时再配置回输入,这样循环往复。
有没有可以参考的例程?
以下是我自己写的,
用作输出时这样配置
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOE, &GPIO_InitStruct);
用作输入时这样配置
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // so change the strut to from Alt funct to GPIO (in)
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOE, &GPIO_InitStruct);

公羊子丹 发表于 2025-3-4 07:40 | 显示全部楼层
这种方法是可行的,我之前也用过类似的方式来切换输入输出,但频繁修改寄存器会不会影响性能?
周半梅 发表于 2025-3-4 07:43 | 显示全部楼层
你这种方式可以实现输入输出切换,不过每次都要重新初始化 GPIO,有没有考虑直接用寄存器操作?
帛灿灿 发表于 2025-3-4 07:45 | 显示全部楼层
STM32F1 这种切换方式没问题,但如果对时序要求比较高,可能要注意切换时的延迟问题。
童雨竹 发表于 2025-3-4 07:47 | 显示全部楼层
这个方法适用于简单的应用,但如果想更高效,可以试试开漏模式 + 外部上拉,这样可以减少配置 GPIO 的次数。
万图 发表于 2025-3-4 07:49 | 显示全部楼层
你测试过这段代码在高频率切换时的效果吗?会不会因为 GPIO 复位导致短暂的不稳定?
Wordsworth 发表于 2025-3-4 07:51 | 显示全部楼层
其实可以用 GPIO 模式切换的方法,但如果是双向数据通信,考虑下 I2C 或者 USART 可能更合适。
Bblythe 发表于 2025-3-4 07:53 | 显示全部楼层
我也遇到过类似的需求,但后来发现直接用两个引脚分别做输入和输出,逻辑上控制,反而更稳定。
Pulitzer 发表于 2025-3-4 07:57 | 显示全部楼层
你有没有试过直接用寄存器修改 GPIO 模式,而不是用 HAL 库?可能速度会快一些。
Uriah 发表于 2025-3-4 08:00 | 显示全部楼层
如果只是简单的状态检测和输出,考虑用开漏模式结合外部上拉,可能更方便一点。
Clyde011 发表于 2025-3-4 08:02 | 显示全部楼层
你的代码是可以工作的,但如果频繁切换,建议看看是否有更优的方法,比如利用 EXTI 中断处理输入状态。
香水城 发表于 2025-4-22 10:33 | 显示全部楼层
其实配置为OD模式即可。
温室雏菊 发表于 2025-4-23 01:24 | 显示全部楼层
一般是可以的,但是切换会有个时间,你要注意

失物招領 发表于 2025-4-23 02:27 | 显示全部楼层
这是什么个应用模式啊?还输入输出的

她已醉 发表于 2025-4-23 03:24 | 显示全部楼层
一般I2C不就这么配置吗

将爱藏于深海 发表于 2025-4-23 04:46 | 显示全部楼层
STM32F103 中,一个引脚不能同时具备输入和输出功能(即不能同时作为输入和输出引脚使用)。这是因为 GPIO 引脚在硬件层面只能被配置为一种模式(输入、输出、复用功能或模拟模式)。不过,你可以通过软件动态切换引脚模式,在需要输出时配置为输出模式,在需要输入时配置为输入模式。这种方法可以实现引脚在不同功能之间的切换

捧一束彼岸花 发表于 2025-4-23 05:21 | 显示全部楼层
STM32F103 GPIO 引脚模式由寄存器 GPIOx_CRL GPIOx_CRH 配置,每个引脚的模式由 4 位寄存器值决定。硬件上,引脚只能处于一种模式,无法同时处于输入和输出模式

故意相遇 发表于 2025-4-23 06:36 | 显示全部楼层
虽然不能同时具备输入和输出功能,但你可以通过动态切换在需要时,通过修改 GPIOx_CRL GPIOx_CRH 寄存器,动态切换引脚模式

春日负喧 发表于 2025-4-23 07:27 | 显示全部楼层
每次切换模式都需要重新配置寄存器,可能会引入一定的开销。如果需要频繁切换,建议优化代码逻辑,减少不必要的切换

白马过平川 发表于 2025-4-23 08:37 | 显示全部楼层
在切换模式前,确保引脚状态不会影响系统功能。例如,在切换为输入模式前,确保引脚未被驱动为高阻态或悬空状态

您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

71

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

45

主题

71

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部