st固件库中的一个奇怪问题

2019-03-23 19:43发布



  1. //固件库
    typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, BitStatus, BitAction;

    //为了封装我重新定义的
    /*typedef basic data-type*/
    typedef GPIO_TypeDef GPIO_PORT;
    typedef GPIO_Pin_TypeDef GPIO_PIN;
    typedef BitStatus BitVar;

    //如果我没理解错typedef的话,从此,BitVar和BitStatus应该是一模一样的。

复制代码


以下是我的一段测试代码、
  1. int main(void)
    {
    BitVar Result;

    SetGpioMode(GREEN_LED,OUT_PP);
    SetGpioMode(KEY,IN_PU);


    while(1)
    {
    // things very strange,i couldn't use SET as a logical-result as i want.
    // but RESET ! or just ' ' works well.
    //but also with the function re-package by myself.
    //(so they are right,but because of the same reason as above...)
    // set could be only 1.
    // but why (BitStatus couldn't force to change it?)

    Result = Gpio_ReadPin(KEY);

    if(Result)
    WriteGpioPin(GREEN_LED,SET);
    else
    WriteGpioPin(GREEN_LED,RESET);
    }


    //------------------------
      BitVar Gpio_ReadPin(U8 pin)
        {  
            U8 RealPort;
            U8 RealPin;
           
            RealPort = GetPort(pin);
            RealPin =  GetPin(pin);
           
            switch(RealPort)
            {
                case PA:
                  return ((BitVar)( GPIOA->IDR & (GPIO_PIN)(1<<RealPin) ));
                  break;
                case PB:
                  return ((BitVar)(GPIOB->IDR & (GPIO_PIN)(1<<RealPin)));
                  break;
                case PC:
                  return ((BitVar)(GPIOC->IDR & (GPIO_PIN)(1<<RealPin)));
                  break;
                case PD:
                  return ((BitVar)(GPIOD->IDR & (GPIO_PIN)(1<<RealPin)));
                  break;
                case PE:
                  return ((BitVar)(GPIOE->IDR & (GPIO_PIN)(1<<RealPin)));
                  break;
                case PF:
                  return ((BitVar)(GPIOF->IDR & (GPIO_PIN)(1<<RealPin)));
                  break;
                default:
                  return SET;
                  break;
            }
        }

    //-------------------------
    }
复制代码

这段代码不完全是使用的原始的固件库。不过我已经测试过了。效果和使用原始固件库是一样的。

只是有一个奇怪的问题(这个问题换成 就是直接调用原始固件库还是一样的现象。很奇怪)


当我写成
  1. if(Result == SET)
    WriteGpioPin(GREEN_LED,SET);
    else
    WriteGpioPin(GREEN_LED,RESET);
复制代码

这段代码却没有起到应该起的作用。

但是。如果我把SET 换成RESET 或者 逻辑反 !或者啥都没有(就是判断为零还是非零)。它就完全正常。

我心想。
这个 typedef enum{}BitStatus 应该是定义一个 枚举型数据类型吧。
既然如此。为什么强制转换对它不起作用呢?

我试过如下测试

Status = SET;
if(Status == (BitVar)4)

这个条件是假。

这个非常奇怪。

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
yfh521088
1楼-- · 2019-03-23 23:22
/ 坐等答案
辛昕
2楼-- · 2019-03-24 05:08
 精彩回答 2  元偷偷看……
tinaliang
3楼-- · 2019-03-24 09:02
Status = SET;
if(Status == (BitVar)4)
SET为非零,这里不知道能把BitVar算作强制转换类型吗??
辛昕
4楼-- · 2019-03-24 09:16
是啊,我心想,强制转换总该起点作用呀....

PS:固件库里也是这么干的,类似的。
huzi2099
5楼-- · 2019-03-24 13:58
 精彩回答 2  元偷偷看……
568581185
6楼-- · 2019-03-24 18:06
围观下了

一周热门 更多>