8361|21

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

st固件库中的一个奇怪问题 [复制链接]



  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)

这个条件是假。

这个非常奇怪。

此帖出自stm32/stm8论坛

最新回复

这里可能就是所谓的“题眼”,枚举类型的数值是离散的整数值,跟逻辑判断的零与非零值是不一样地。   详情 回复 发表于 2021-3-3 11:48
点赞 关注
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

29

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
坐等答案
此帖出自stm32/stm8论坛
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

板凳
 

回复 沙发 yfh521088 的帖子

...汗~~~
此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

4
 
Status = SET;
if(Status == (BitVar)4)
SET为非零,这里不知道能把BitVar算作强制转换类型吗??
此帖出自stm32/stm8论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

5
 

回复 4楼 tinaliang 的帖子

是啊,我心想,强制转换总该起点作用呀....

PS:固件库里也是这么干的,类似的。
此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

38

帖子

0

TA的资源

一粒金砂(中级)

6
 
枚举类型就是u32吧,我觉得是数据类型的问题(BitVar)1不等于(BitVar)4吧
此帖出自stm32/stm8论坛
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

7
 
围观下了
此帖出自stm32/stm8论坛
 
个人签名邮件:mrguang@qq.com
tb:http://mrguang.taobao.com
 
 

回复

82

帖子

0

TA的资源

一粒金砂(中级)

8
 
那个枚举里边只有SET = 1, RESET = 0,没有你条件中给定的4,所以,那个条件永远也不会成立,只能和0或1比较。
此帖出自stm32/stm8论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

9
 

回复 8楼 gan_xiaofei 的帖子

我知道啊,所以我才来个强制转换的
此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

10
 

回复 9楼 辛昕 的帖子

typedef enum {
  RESET = 0,
  SET = !RESET
}FlagStatus, ITStatus, BitStatus;
此帖出自stm32/stm8论坛
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

11
 

回复 10楼 lyzhangxiang 的帖子

what's the value of SET?
此帖出自stm32/stm8论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

12
 

富士通FM3——强抗电磁干扰性、宽电压 2.7V-5.5V

富士通推出144MHZ的CORTEX-M3产品,VCC:2.7V-5.5V,FLASH 60MHZ,以太网,CAN,USB,8路UART,资源丰富,管脚上下兼容!——创兴电子 (授权代理商)_sunny
此帖出自stm32/stm8论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

13
 

回复 11楼 lyzhangxiang 的帖子

那应该就是1啊
SET = 1
此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

199

帖子

0

TA的资源

纯净的硅(初级)

14
 

回复 13楼 辛昕 的帖子

你的那个强制转换是不行啊。

枚举类型里的东东也是有数值的,两个要相等才行吧。
此帖出自stm32/stm8论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

15
 

回复 14楼 老阮 的帖子

具体啥意思,那这个数据类型没法强转咯?
那该怎么弄才可以实现强转?
此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

104

帖子

0

TA的资源

一粒金砂(高级)

16
 

回复 楼主 辛昕 的帖子

楼猪啊,我不明白你的问题,是判断错了吗??“不起作用”这样说,可是很有歧义的
此帖出自stm32/stm8论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

17
 

回复 16楼 zzhere2007 的帖子

你这么说也是对的。
我的意思正是
它似乎不能起到我想象中的 强制转换的作用。
比如说,,对于4,我原以为经过它强转,可以变成1,

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

但实际上没有。
此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

18
 

明白了,其实是两个问题

1.对于enum定义的数据类型——如果它真的叫数据类型的话,它能起到一个数据类型的作用么?

2.接上面这个问题,如果用这个enum类型来强制转换,它会起作用么?

比方说,按照我当时的理解,我以为是,既然这个enum定义的类型,只有两个可选数值0 和 1,那么,既然我强转了,遇0则0,遇非0就该是1.

 

但显然,我犯了一个错误,那就是,这个强制转换应该是不对的,它是什么数值就是什么数值。

 

今天我先不去确认这个事情,先在这里写,省的我忘了我曾经是这么想的。

此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

19
 

刚简单写了个console测了测,确实如此。

其实对于enum类型,我一直挺不明白的。

那这个枚举有何意义呢?

 

此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1411

帖子

3

TA的资源

版主

20
 

我个人觉得是你的类型设置有问题。

此帖出自stm32/stm8论坛
 
个人签名

没有什么不可以,我就是我,不一样的烟火! 

 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表