22029|15

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Warning[Pe188]:enumeratedtypemixedwithanothertype [复制链接]

STM8的编译错误,由以下代买引起:
GPIO_Init(GPIOA, GPIO_PIN_1 | GPIO_PIN_2, GPIO_MODE_OUT_PP_HIGH_FAST);

这怎么可能呢?
此帖出自stm32/stm8论坛

最新回复

请问一下这个方法是为什么啊?  详情 回复 发表于 2017-7-17 11:39
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 LZ用的是IAR EWSTM8吗?看样子它还不够成熟。
此帖出自stm32/stm8论坛
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 


IAR STM8警告没有任何问题。
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
呵呵,
void GPIO_Init(GPIO_TypeDef* GPIOx,
? ?? ?? ?? ?? ?GPIO_Pin_TypeDef GPIO_Pin,
? ?? ?? ?? ?? ?GPIO_Mode_TypeDef GPIO_Mode)
GPIO_Pin_TypeDef enmu类型的定义中,没有(GPIO_PIN_1 | GPIO_PIN_2)这个数据,IAR报的warning是正确的。若想不要这个Warning,可以分开两句分别定义。当然若觉得烦就直接拿寄存器来操作。
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

5
 
分开定义肯定是没错误的,我定义一个单独的引脚的时候就OK,但IAR EWSTM32里初始化语句全是这么写的,很多引脚用 | 连在一起,也没出现警告,而且STM8S库里带的例程里面也这样写:
GPIO_Init(LEDS_PORT, (LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN), GPIO_MODE_OUT_PP_LOW_FAST);
这显然是应该被通过的,但为何IAR EWSTM8提示警告,但IAR EWSTM32里就不提示,同样的两口子,差距怎么就这么大呢?
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 同样的语句,在STM8如果用COSMIC C来进行编译也没有警告,所以归根结底还是IAR EWSTM8不够成熟。
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
分开定义肯定是没错误的,我定义一个单独的引脚的时候就OK,但IAR EWSTM32里初始化语句全是这么写的,很多引脚用 | 连在一起,也没出现警告,而且STM8S库里带的例程里面也这样写:
GPIO_Init(LEDS_PORT, (LED1_PIN | ...
因为IARSTM32用的是
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /* Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /* Pin 1 selected */

而iarstm8用的是
typedef enum
{
  GPIO_PIN_0    = ((u8)0x01),  /*!< Pin 0 selected */
  GPIO_PIN_1    = ((u8)0x02),  /*!< Pin 1 selected */
  GPIO_PIN_2    = ((u8)0x04),  /*!< Pin 2 selected */
  GPIO_PIN_3    = ((u8)0x08),   /*!< Pin 3 selected */
  GPIO_PIN_4    = ((u8)0x10),  /*!< Pin 4 selected */
  GPIO_PIN_5    = ((u8)0x20),  /*!< Pin 5 selected */
  GPIO_PIN_6    = ((u8)0x40),  /*!< Pin 6 selected */
  GPIO_PIN_7    = ((u8)0x80),  /*!< Pin 7 selected */
  GPIO_PIN_LNIB = ((u8)0x0F),  /*!< Low nibble pins selected */
  GPIO_PIN_HNIB = ((u8)0xF0),  /*!< High nibble pins selected */
  GPIO_PIN_ALL  = ((u8)0xFF)   /*!< All pins selected */
}GPIO_Pin_TypeDef;

两者定义的方法不一样。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
iarstm8 警告的对的。

函数传递参数,如果实参超过了形参的范围,那么应该产生警告。
GPIO_Init 传递的参数类型是:GPIO_Pin_TypeDef
实际传递的参数是GPIO_PIN_1 | GPIO_PIN_2,
而GPIO_PIN_1 | GPIO_PIN_2并不在GPIO_Pin_TypeDef表示的错范围内,
产生警告没有任何问题。

楼上你换IAR STM32一样有警告。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 


一个简单例子:

typedef enum
{
    value_1=1,
    value_2=2,

}my_enum_t;

void test_enum(my_enum_t my_enum)
{
}

int main()
{
   test_enum(value_1|value_2);
   while(1);
   return 0;
}


IAR STM8,IARSTM32会出个警告:enumerated type mixed with another type

C++Builder 2010 警告:[BCC32 Warning] File1.cpp(31): W8006 Initializing my_enum_t with int

VC6.0 错误:2664: 'test_enum' : cannot convert parameter 1 from 'const int' to 'my_enum_t'
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 问题是STM8官方例程里也用 “|”这么写,这怎么解释
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

11
 
问题是STM8官方例程里也用 “|”这么写,这怎么解释
那你要问ST的人了为啥偏要怎么写了。

说一下去除警告的方法:
1.采用强制转换,如上面例子里test_enum(value_1|value_2);
改成  test_enum((my_enum_t)(value_1|value_2));

2.编译选项里Diagnostiscs/Suppress these diagnostics加上:
pe188,pa089
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

12
 
因为IARSTM32用的是
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /* Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /* Pin 1 selected */

而iarstm8用的是
typedef en ...
原来如此,学习了。
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
问题是STM8官方例程里也用 “|”这么写,这怎么解释
这不难解释,估计ST的人没有用IAR EWSTM8来编译过STM8的官方例程。
此帖出自stm32/stm8论坛
 
 
 

回复

3

帖子

1

TA的资源

一粒金砂(初级)

14
 
GPIO_Init(GPIOA, GPIO_Pin_1 | GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast);  注意大小写
此帖出自stm32/stm8论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

15
 
此帖出自stm32/stm8论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

16
 
glancegreen 发表于 2010-7-23 11:04
问题是STM8官方例程里也用 “|”这么写,这怎么解释
那你要问ST的人了为啥偏要怎么写了。

说一下 ...

请问一下这个方法是为什么啊?
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
中星联华&ADI明日直播
直播主题:大咖面对面,轻松玩转高速ADC性能测试
直播时间:3月25日(周二)14:00
活动奖励:京东卡、双肩包

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表