看看这条万恶的带参宏定义

今天测试系统功耗,发现有200uA来历不明,经过分析和排查,最后锁定在RF模块。经测试发现RF模块所有管脚中  CSD 为高,CE 为高,MOSI 为高, IRQ 为高。
昨天发现RF模块(包含24L01和PA芯片)在关闭的情况下还有15uA的电流,经过尝试发现是SPI接口的CSN脚在空闲时输出了高电平导致,通过修改SPI底层读写代码解决。
    来说今天的这个问题,这里的CSD是PA的一个控制脚,该脚和CPS、CTX脚控制PA的工作状态,当CSD=H,CPS=CTX=L时,PA处于bypass mode ,最大电流为300uA。程序中执行了如下语句:

SetLo(P2OUT,RF_PA_CPS|RF_PA_CSD|RF_PA_CTX);

该语句的本意是将CPS、CSD、CTX管脚设置为低,但执行的结果却并没有吧CSD脚置为低。其中CPS为BIT0,CSD为BIT1,CTX为BIT2。为什么执行的结果不对?来看看这条宏语句:

#define   SetLo(x,y)      x&=~y

很显然,这是一个带参宏定义,两个参数分别为x,y。在写带参宏定义时有一个要求,那就是参数必须加括号,而这条宏定义没有遵循这个要求,从而导致了噩梦。分析下执行的结果:P2OUT &= ~BIT0|BIT1|BIT2 ,~ 运算符优先级为2,| 运算符优先级为10,&= 运算符优先级为14,所以,该式等价于 P2OUT &= 0xFE ,即该式只能将 P2_0 置低。正确的写法应该如下:

#define SetLo(x,y) (x)&=~(y)

由于我们常常是把宏定义放在最底层的代码中,如果宏定义出错,可能会有比较大的影响。例如我遇到的这个问题,底层软件是同事已经写好的,并且已经使用了很久,如果不是我为了查找这200uA,根本不会发现这个错误,当然,在这个地方并没有产生多大影响,只是200uA而已,但并不是每次都会这么幸运的。

分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/%e7%9c%8b%e7%9c%8b%e8%bf%99%e6%9d%a1%e4%b8%87%e6%81%b6%e7%9a%84%e5%b8%a6%e5%8f%82%e5%ae%8f%e5%ae%9a%e4%b9%89/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论?

3 条评论。

  1. 博主想请教下关于msp430的2系列内部上拉电阻的问题,可否提供下邮箱?现在困在这个问题上好久了,拖不下去了

    • @buptzym
      IO口设置上拉下拉的问题,如果要检测低有效,就应该设置为上拉,如果要检测高有效,就设置为下拉。在IIC中,如果你使用软件模拟,SDA应该不设置上拉使能。而且要注意切换方向。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名