2

我在 lpc1788 ARM Cortex M3 上编写代码。当我尝试将端口配置为 GPIO 时,我遇到了一个奇怪的警告。尽管有警告,代码工作得很好,但要了解为什么会出现这个警告,我在这里提出这篇文章。以下是我编写的代码。

static uint32_t * PIN_GetPointer(uint8_t portnum, uint8_t pinnum)  
{  
    uint32_t *pPIN = NULL;  
    pPIN = (uint32_t *)(LPC_IOCON_BASE + ((portnum * 32 + pinnum)*sizeof(uint32_t)));  
    return pPIN;  
}    

void PINSEL_SetPinMode ( uint8_t portnum, uint8_t pinnum, PinSel_BasicMode modenum)  
{  
    uint32_t *pPIN = NULL;  
    pPIN = PIN_GetPointer(portnum, pinnum);  
    *(uint32_t *)pPIN &= ~(3<<3);    //Clear function bits  
    *(uint32_t *)pPIN |= (uint32_t)(modenum<<3);  
}  

int main(void)  
{  
    PINSEL_SetPinMode(1,15,0);  //this gave a warning: enumerated type mixed with another type  
    PINSEL_SetPinMode(1,18,PINSEL_BASICMODE_NPLU_NPDN);    //this doesnt give any warning  

   /* Following is the enum present in a GPIO related header file, putting it here in comments so that   
       those who are going through this post, can see the enum  

            typedef enum
            {
                PINSEL_BASICMODE_NPLU_NPDN  = 0, // Neither Pull up nor pull down        
                PINSEL_BASICMODE_PULLDOWN,       // Pull-down enabled
                PINSEL_BASICMODE_PULLUP,         // Pull-up enabled (default)         
                PINSEL_BASICMODE_REPEATER        // Repeater mode          
            }PinSel_BasicMode;        
   */

    return 0;  
}     
4

3 回答 3

6

您在需要类型的int地方使用类型enum PinSel_BasicMode。虽然枚举和整数通常可以互换,但它们是不同的类型。

0不是枚举值。PINSEL_BASICMODE_NPLU_NPDN是。它只是0通过定义。

如果枚举声明更改并PINSEL_BASICMODE_NPLU_NPDN等于 1,您的代码将无效。

于 2013-06-04T12:47:11.693 回答
2

1.你传递了int一个enum期望值的地方。因此,要么将其转换为正确的枚举,要么更好:enum直接使用正确的值:

PINSEL_SetPinMode(1, 15, (PinSel_BasicMode)0);
PINSEL_SetPinMode(1, 15, PINSEL_BASICMODE_NPLU_NPDN);

2.enum您正在对一个值使用位移位运算符。我认为您需要在位移之前和之后进行转换以使编译器满意:

void PINSEL_SetPinMode ( uint8_t portnum, uint8_t pinnum, PinSel_BasicMode modenum)  
{  
    uint32_t *pPIN = NULL;  
    pPIN = PIN_GetPointer(portnum, pinnum);  
    *pPIN &= ~(3<<3);    //Clear function bits  
    *pPIN |= (uint32_t)((uint32_t)modenum << 3);
}

之前:因为你想移动一个整数值而不是enum值。

之后:因为移位操作的输出类型不一定与输入类型相同。

于 2013-06-04T13:00:18.240 回答
0

枚举是定义类型,因此这里的警告是与 int 不兼容的类型,因此您可以进行类型转换以避免警告。

但是因为这里 0 是为您的枚举定义的,所以它不会导致您的代码给出错误的结果。

希望能帮助到你.....

于 2013-06-04T12:52:56.993 回答