使用的库:STM8L15x_StdPeriph_Driver
库函数:GPIO_ReadInputDataBit
函数原型:
BitStatus GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
return ((BitStatus)(GPIOx->IDR & (uint8_t)GPIO_Pin));
}
作用:读取GPIO脚的电平,被读取的IO口为低电平时返回RESET,高电平返回SET。
SET\RESET的定义:
typedef enum {RESET = 0, SET = !RESET} BitStatus,;
GPIO_ReadInputDataBit()函数的返回值是将(GPIOx->IDR & (uint8_t)GPIO_Pin)强制转换为BitStatus变量,按理说值只能是0或者1,而实际上高电平脚位可能是0x10,0x20,0x40,0x80这些值。
当(GPIOx->IDR & (uint8_t)GPIO_Pin)的结果是0或1以外的值时,函数的结果表达式的值超出了枚举范围,无法在枚举定义的元素值里找到对应的数据。再检查是否等于SET就会出错。
修改后:
BitStatus GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
if( (GPIOx->IDR & (uint8_t)GPIO_Pin) ==0)
{return RESET;}
else
{return SET;}
}