今天碰到检测管脚电平的时候需要使用这个函数,不过对于
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
这两个函数有点分不清楚,后来理解了才知道
> uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
> //一次读取一组IO口中一个或几个管脚的输入状态
> //读取几个管脚的输入状态时,如果一个为1,则输出为1
返回的是引脚的高低电平状态(0或1)
> uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
一次读取一组IO口中所有管脚的输入状态
也就是函数返回的是寄存器GPIOx->IDR的值
这里只需要看函数就可以了解
GPIO_ReadInputDataBit
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
uint8_t bitstatus = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
{
bitstatus = (uint8_t)Bit_SET;
}
else
{
bitstatus = (uint8_t)Bit_RESET;
}
return bitstatus;
}
(GPIOx->IDR & GPIO_Pin) 如果为真,代表就是有高电平输入
所以整句话意思就是如果有高电平输入,
则输出 bitstatus = (uint8_t)Bit_SET;
否则输出bitstatus = (uint8_t)Bit_RESET;
结合下边枚举可知
typedef enum
{
Bit_RESET = 0,
Bit_SET
}BitAction;
有高电平输入,
则输出 bitstatus = (uint8_t)Bit_SET=1;
否则输出 (uint8_t)Bit_RESET=0;
GPIO_ReadInputData
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
return ((uint16_t)GPIOx->IDR);
}
return ((uint16_t)GPIOx->IDR);
读取所有管脚的输入状态
返回的是寄存器GPIOx->IDR的值
关于引脚的输出电平状态也是一样的
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
第一个检测一组IO口中一个或多个输出状态
第二个检测一组IO口中所有输出状态
本文介绍了在STM32中如何使用GPIO_ReadInputDataBit和GPIO_ReadInputData两个函数来检测管脚的输入电平状态。GPIO_ReadInputDataBit用于读取一组IO口中一个特定管脚的状态,而GPIO_ReadInputData则用于获取所有管脚的输入状态。函数通过与运算判断GPIO_Pin是否有高电平输入,返回Bit_SET或Bit_RESET以表示电平状态。
873

被折叠的 条评论
为什么被折叠?



