STM32中GPIO_ReadOutputDataBit及GPIO_ReadInputDataBit区别;上拉输入_IPU,下拉输入_IPD,模拟输入_AIN ;开漏输出_Out_OD, 推挽输出_Out_PP ,复用功能的推挽输出_AF_PP,复用功能的开漏输出_AF_OD。
一,GPIO_ReadOutputDataBit及GPIO_ReadInputDataBit区别
简单来讲:GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读的是GPIOx_IDR,读的是当IO口设置为输入状态时候的IO口值
GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读的是GPIOx_ODR,读的是当IO口设置为输出状态时候的IO口值
如果你想详细一点了解这两个函数的区别的话,你可以这样试试,
就拿那个按键控制LED灯的实验来说吧,
(1)当你设置KEY为上拉输入,你用GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
去读IO口状态的时候,若你没有按下按键,你读出来的IO值是1,(因为上拉输入把IO口拉高),当你按下按键的时候,你读出来的IO值是0,(因为按下按键把IO拉低) 。
当你设置KEY为下拉输入, 去读IO口状态的时候,若你没有按下按键,你读出来的IO值是1,(因为上拉输入把IO口拉高),当你按下按键的时候,你读出来的IO值是0,(因为按下按键把IO拉低) 。下拉输入,GPIO_ReadInputDataBit,按键没按下来读的是高电平,按下读的是低电平。
(2)当你设置KEY为上拉输入,你用 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 去读IO口状态的时候, 无论你按不按下按键,你读出来的值都是1,因为用GPIO_ReadOutputDataBit去读IO口,它是可以忽略外部操作(按下按键)对它的影响 它只认可内部的操作(上拉电阻的影响)。
我用实际实验证明过上面的实验现象,我的理解就是这样,可能有错误,希望对你有帮助。
总结:
(1)如果是端口设置成下拉输入GPIO_ReadInputDataBit,GPIO_ReadOutputDataBit,可以区分高低电平。
(2)如果是端口设置成开漏输出GPIO_ReadInputDataBit,GPIO_ReadOutputDataBit,可以区分高低电平。GPIO_ReadInputDataBit, GPIO_ReadOutputDataBit,可以区分高低电平。
(3)如果是端口设置成上拉输入GPIO_ReadOutputDataBit只能读出高电平。按键没按或者按下读的都是高电平。