STM8L库函数修正--GPIO_ReadInputDataBit

使用的库: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;}
}

你可能感兴趣的:(#,STM8,STM8L,库函数)