我是靠谱客的博主 风趣马里奥,这篇文章主要介绍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);
}

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

最后

以上就是风趣马里奥最近收集整理的关于STM32的GPIO为输出模式时获取其输出状态的全部内容,更多相关STM32内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部