STVD搭配Cosmic编译STM8时GPIO输入if条件判断异常咨询
STM8 GPIO输入判断异常:高电平时
== SET不成立但!= RESET正常的原因分析 问题现象
使用STVD IDE + Cosmic STM8 C编译器 + STM8标准外设库开发时,出现以下GPIO输入判断异常:
- 实际引脚测得3.3V高电平,但以下条件判断始终不成立:
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2) == SET) if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2) == 1) - 低电平判断语句可正常工作:
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2) == RESET) if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2) == 0) - 使用非零判断高电平则正常:
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2) != RESET) if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2) != 0)
核心原因分析
问题本质是STM8标准外设库中GPIO_ReadInputPin函数的返回值定义,与Cosmic编译器本身无关:
函数返回值逻辑:
GPIO_ReadInputPin的实现是读取GPIO输入寄存器(IDR)中对应引脚的位,返回的是该引脚的位掩码值,而非布尔值1/0。例如读取GPIOC_PIN_2时,函数返回GPIOC->IDR & GPIO_PIN_2——引脚高电平时返回GPIO_PIN_2的定义值(通常为0x04,对应二进制第2位为1);低电平时返回0。宏定义不匹配:
库中SET的宏定义通常为((uint8_t)0x01),RESET为((uint8_t)0x00)。高电平时函数返回的0x04与SET(0x01)不相等,导致== SET判断失败;低电平时返回0,与RESET(0)匹配,判断正常。非零判断的合理性:
!= RESET(即!=0)的逻辑是只要返回值非0就成立,高电平返回的0x04满足非零条件,因此判断正常。
正确的判断方式
推荐以下两种高电平判断方法:
- 符合库规范的写法:
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2) != RESET) - 直接与引脚掩码比较:
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2) == GPIO_PIN_2)
内容的提问来源于stack exchange,提问作者Amgad Bassam
相关产品推荐
相关产品推荐

