抛出一个问题,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内容请搜索靠谱客的其他文章。
发表评论 取消回复