最近在学STM8S,在使用模拟I2C方式读取外部的E2PROM芯片时发现怎么也读不出数据,代码都是从STM32上移植过来的,理论上逻辑方面不存在错误,后来一步步调试,终于发现罪魁祸首:
在我的程序中使用了固件库中库函数BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)来读取SDA引脚的数据,此函数就一条语句return ((BitStatus)(GPIOx->IDR & (uint8_t)GPIO_Pin));其中BitStatus是一个枚举类型typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, BitStatus, BitAction。
理论上GPIO_ReadInputPin的返回值不是RESET就是SET,但是我调试时发现IAR把RESET = 0;SET = 1;如果
GPIOx->IDR & (uint8_t)GPIO_Pin的值是0x02、0x04之类的是不会被转换成BitStatus类型的,也就是说GPIO_ReadInputPin的返回值不是BitStatus类型,而是0x00、0x01、0x02、0x04、0x08之类的,而我又在程序中使用了if(SET == GPIO_ReadInputPin)来判断SDA引脚是否为高电平,从而导致错误。
不知道有谁可以解答一下我的疑虑,看下是我哪里理解错了,还是固件库这个函数写得有问题,万分感谢。
PS:固件库版本V2.2.0,IAR版本2.10.4
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
嗯,看来应该是强制转换时超出了枚举类的范围,加了强制转换只是骗过了编译器,
对于这个函数的返回值只需要判断零还是非零的情况,所以应该当是bool类型判断或者与零做对比~~
在百度知道上也有人做过测试
http://zhidao.baidu.com/question/1733494898608181827.html
一周热门 更多>