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条回答
老阮
1楼-- · 2019-03-25 11:54
你的那个强制转换是不行啊。

枚举类型里的东东也是有数值的,两个要相等才行吧。
辛昕
2楼-- · 2019-03-25 16:47
 精彩回答 2  元偷偷看……
zzhere2007
3楼-- · 2019-03-25 20:41
楼猪啊,我不明白你的问题,是判断错了吗??“不起作用”这样说,可是很有歧义的
辛昕
4楼-- · 2019-03-25 20:52
你这么说也是对的。
我的意思正是
它似乎不能起到我想象中的 强制转换的作用。
比如说,,对于4,我原以为经过它强转,可以变成1,

因为这个数据类型的值只能取0或者1。

但实际上没有。

一周热门 更多>