- /**
- * @brief Reads the specified GPIO input data pin.
- * @param GPIOx : Select the GPIO peripheral number (x = A to I).
- * @param GPIO_Pin : Specifies the pin number.
- * @retval BitStatus : GPIO input pin status.
- */
- BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
- {
- return ((BitStatus)(GPIOx->IDR & (uint8_t)GPIO_Pin));
- }
- 这个代码是来STm8的固件库V2.2.0版
- 这个代码存在一个问题当使用
if(GPIO_ReadInputPin(GPIOA, GPIO_PIN_1) == SET)是存在问题的
- 【分析】
- 而BitStatus的原型是
typedef enum {
RESET = 0,
SET = !RESET
}
BitStatus;
可见该枚举型常量中定义了2个数值:RESET为0,SET为1 - 如果GPIOA 的Pin1输入电平为高的话,GPIO_ReadInputPin(GPIOA, GPIO_PIN_1)结果为0x02,
- 在GPIO_ReadInputPin()函数定义中,将结果进行了(BitStatus)的强制转换,但是返回结果依然是0x02,也就是说其强制转换是失败的,如果你判断该引脚的高电平用if(GPIO_ReadInputPin(GPIOA, GPIO_PIN_1) == SET)的话,永远得不到正确的结果
- 或者使用if(GPIO_ReadInputPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_1),这样而这样可以达到预期的结果,但是与
- BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin) 定义的函数类型不符。
- 或者使用if(GPIO_ReadInputPin(GPIOA, GPIO_PIN_1) != RESET)来实现。
- 但是这样在一些没有深入了解该函数的开发人员带来一些设计上隐患。在STM32的固件库的也有类似功能的代码具体如下
- 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;
} - 就不存在ST8这样的问题
- 希望st的工作人员能够及时的处理好该问题。
|