STM32的GPIO为输出模式时获取其输出状态

抛出一个问题,STM32的GPIO能否在不改变模式的情况下同时做输入和输出呢?答案是可以

STM32F103 的参考手册GPIO章节摘录:
在这里插入图片描述
第5点,在开漏模式时,对输入数据寄存器的读访问可得到I/O状态。从这一点我们可以看出,STM32的GPIO设置为开漏输出模式时,改变输出电平可以生效(但输出1时受外部上拉电阻影响),同时可以通过输入数据寄存器即GPIOx_IDR读取该IO口的状态。(开漏输出加外部上拉电阻,实际上就是相当于51单片机的准双向IO了。)

这里还要注意第6点,在推挽输出模式下,读取输出数据寄存器即GPIOx_ODR只能读到该IO口最后一次设定的输出电平状态,而不一定是实际的IO口状态。比如说,写寄存器使IO输出低,但外部电路使其强拉到高,这时读GPIOx_ODR只能读到低,因为最后一次写操作就是低。
注意:读最后一次设定的输出电平状态,在推挽输出模式时,除了GPIOx_ODR,读GPIOx_IDR也是一样的(假定外部电路不影响其输出电平)。(读GPIOx_ODR寄存器用的是GPIO_ReadOutputDataBit函数,读GPIOx_IDR寄存器用的是GPIO_ReadInputDataBit函数)

读最后一次设定的输出电平状态在一些特定应用场合非常有用,比如

uint8_t pwr_state=0;
void pwr_on(void)
{
	pwr_state = 1;
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
void pwr_off(void)
{
	pwr_state = 0;
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
uint8_t get_pwr_state(void)
{
	return pwr_state;
}

上述代码为了便于判断当前电源的开关状态,用了一个变量pwr_state作为指示电源开关状态,实际上可以将GPIOx_ODR用起来,这个寄存器就可以反映最后一次对该IO的操作。举例如下:

void pwr_on(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
void pwr_off(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
uint8_t get_pwr_state(void)
{
	return GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1);
}

这样省略了一个变量的操作。

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32 GPIO的复用模式是指将GPIO引脚用于连接内置外设或模块的功能。每个GPIO引脚都有一个复用器,该复用器一次只允许一个外设的复用功能(AF)连接到对应的IO口,以确保共用同一个IO引脚的外设之间不会发生冲突。复用功能通过GPIOx_AFRL(针对引脚0-7)和GPIOx_AFRH(针对引脚8-15)寄存器进行配置,每四位控制一路复用。在复位后,所有IO都会连接到系统的复用功能0(AF0),外设的复用功能映射到AF1到AF13,而Cortex-M4 EVENTOUT映射到AF15。\[3\]复用模式中,输出使能和输出速度可配置,可以工作在开漏及推挽模式,但是输出信号是源于其他外设的,因此输出数据寄存器GPIOx_ODR是无效的。输入可用,可以通过输入数据寄存器获取IO实际状态,但一般直接使用外设的寄存器来获取该数据信号。\[2\]具体的GPIO引脚可以复用为哪些内置外设的功能可以在《STM32F4 中文参考手册》第七章和芯片数据手册中找到详细的讲解。\[1\] #### 引用[.reference_title] - *1* *3* [【STM32STM32F4 GPIO口映射与复用](https://blog.csdn.net/weixin_46324172/article/details/129150250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32 GPIO推挽复用模式](https://blog.csdn.net/mzldxf/article/details/115255274)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾爱技术圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值