一、问题:while((GPIO_ISTAT(HC_SR04_Echo_GPIO)&(HC_SR04_Echo_PIN)) == SET)
-----发生了一间很诡异的事,使用寄存器操作,比值是出现很诡异的不同。???不清楚为什么,还需要进一步查询
提示1: typedef enum {RESET = 0, SET = !RESET} FlagStatus;
提示2:HC_SR04_Echo_GPIOB表示GPIOA;HC_SR04_Echo_PIN表示GPIO_PIN_1
结论是:自己学艺不精,此语句本身就有问题。
二、解释:
1.首先需要确认逻辑运算符‘!’的功能;例如:RESET = 0,则!RESET=1,即结果SET=1;
2.GPIO_ISTAT(HC_SR04_Echo_GPIO)&(HC_SR04_Echo_PIN)是直接操作寄存器的语句;
----1).这里需要解释一下引脚输入寄存器是如何表示相应引脚状态的;
----2).语句中的GPIO_ISTAT(HC_SR04_Echo_GPIO)和(HC_SR04_Echo_PIN)分别表示什么;
----3).再之后GPIO_ISTAT(HC_SR04_Echo_GPIO)&(HC_SR04_Echo_PIN)整个语句的结果是什么;
----4).之后再跟SET(1)进行比较;
3.回答
----1).不管是ST还是GD的引脚输入引脚电平状态,都是用一个寄存器的低16位来分别表示GPIOx(A-F)的引脚电平,每一位代表一个引脚;
----2).GPIO_ISTAT(HC_SR04_Echo_GPIO)语句的意思:GPIO_ISTAT表示引脚输入寄存器的基准地址,HC_SR04_Echo_GPIO这里表示的是GPIOA,也就是哪组引脚,所以GPIO_ISTAT(HC_SR04_Echo_GPIO)语句代表的是GPIOA组引脚的所有电平值; (HC_SR04_Echo_PIN)这里是GPIO_PIN_1,表示的是GPIOx(A-F)中引脚1所在寄存器的位数;
----3).GPIO_ISTAT(HC_SR04_Echo_GPIO)&(HC_SR04_Echo_PIN)语句的意思是,读取相应的GPIOA的1引脚的电平;高电平在数值上可以表示为:0x00000002,低电平在数值上可以表示为:0x00000000
----4).由typedef enum {RESET = 0, SET = !RESET} FlagStatus;可知,SET的数值是0x00000001,所以在数值上并不与高电平时的0x00000002相等,所以出错;
4.总结出错原因:当时我就认为(GPIO_ISTAT(HC_SR04_Echo_GPIO)&(HC_SR04_Echo_PIN)) 语句得到的值就是0(低电平)、1(高电平),自己犯了固定思维的影响;其实自己知道这个语句的意思,但在当时就是固执的认为得到的数据不是0(低电平)就是1(高电平),犯了经验主义教训。
---------要引以为戒