作为嵌入式软件工程师在项目开发时关于GPIO寄存器的读取-02

4 篇文章 0 订阅
3 篇文章 0 订阅

一、问题: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(高电平),犯了经验主义教训。
            ---------要引以为戒

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值