Keil v5 警告問題 找不到警告的原因

2019-12-16 22:38发布

小弟最近在編寫程式時發現了三個警告,但我一值找不到解決的辦法

目前有三個我無法去除的警告
..SrcWayne_Init.c(42): warning:  #61-D: integer operation result is out of range
NVIC->IP[USART1_IRQn>>2]|=        2        <<        ( (USART1_IRQn&0x3)*8 + 6 );
..SrcWayne_Init.c(42): warning:  #68-D: integer conversion resulted in a change of sign
NVIC->IP[USART1_IRQn>>2]|=        2        <<        ( (USART1_IRQn&0x3)*8 + 6 );

這兩項的來源是中斷(NVIC的初始化)

  1. void        Wayne_Init_NVIC(void)
  2. {
  3.                 NVIC->IP[TIM16_IRQn>>2]        |=        3        <<        ( (TIM16_IRQn&0x3)*8 + 6 );        //設定優先權3
  4.                 NVIC->IP[USART1_IRQn>>2]        |=        2        <<        ( (USART1_IRQn&0x3)*8 + 6 );        //設定優先權3
  5.                
  6.                 NVIC->ISER[0]                                |=        1        <<        TIM16_IRQn                                //TIM16中斷啟用
  7.                                                                 |        1        <<        USART1_IRQn;                                //USART1中斷啟用
  8. }
复制代码



..SrcWayne_Init.c(78): warning:  #61-D: integer operation result is out of range
I2C1->TIMINGR        =                0x0F<<        28
這一項的來源是中斷(I2C的初始化)
  1.                 I2C1->TIMINGR        =                0x0F<<        28        //除頻值= 48M/(7+1)                =        3MHz
  2.                                                 |                0x0F<<        20        //數據建立時間(4bit)        =        16
  3.                                                 |                0x0F<<        16        //數據保持時間(4bit)        =        16
  4.                                                 |                0xFF<<        8        //高電平保持時間(8bit)=        32
  5.                                                 |                0xFF<<        0;        //低電平保持時間(8bit)=        32
复制代码

請各位幫我看看,是不是我哪裡寫錯了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
陳聖文
1楼-- · 2019-12-18 01:50
TANK99 发表于 2018-10-22 15:49
不过你这个确是越界了。

typedef struct

我這邊是32bit的

typedef struct
{
  __IO uint32_t ISER[1];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
       uint32_t RESERVED0[31];
  __IO uint32_t ICER[1];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register          */
       uint32_t RSERVED1[31];
  __IO uint32_t ISPR[1];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register           */
       uint32_t RESERVED2[31];
  __IO uint32_t ICPR[1];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register         */
       uint32_t RESERVED3[31];
       uint32_t RESERVED4[64];
  __IO uint32_t IP[8];                   /*!< Offset: 0x300 (R/W)  Interrupt Priority Register              */
}  NVIC_Type;
陳聖文
2楼-- · 2019-12-18 04:00
banyai 发表于 2018-10-22 16:27
立即数2, 0xf等默认是有符号数,0xF

看來真是因為有號無號的問題
感謝
我之前都不知道 0x??是默認為有號
陳聖文
3楼-- · 2019-12-18 05:18
TANK99 发表于 2018-10-22 15:49
不过你这个确是越界了。

typedef struct

不過看來警告也是跟7樓說的一樣
是因為莫認為有號的關係
陳聖文
4楼-- · 2019-12-18 07:03
mangolu 发表于 2018-10-22 15:48
0b0011向左移位如果是32位,肯定是超出范围 了!同样,下面的移位也是。

大哥舉例的,這種NVIC是使用有保護的函式庫
即使設定有誤也不會導致全面崩潰
而小弟公司使用的晶片容量小塞不進去
所以改用自己編寫的方式

一周热门 更多>