我正在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;
}
答案 0 :(得分:6)
您使用的int
类型需要enum PinSel_BasicMode
类型。虽然枚举和整数通常是可以互换的,但它们是不同的类型。
值0
不是枚举值。 PINSEL_BASICMODE_NPLU_NPDN
是。通过定义只有0
。
如果枚举声明更改且PINSEL_BASICMODE_NPLU_NPDN
等于1,则代码无效。
答案 1 :(得分: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
值。
之后:因为移位操作的输出类型不一定与输入类型相同。
答案 2 :(得分:0)
枚举是定义的类型,因此这里的警告是带有int的不可用类型,因此您可以进行类型转换以避免警告。
但是因为这里为你的枚举定义了0,所以它不会导致你的代码给出错误的结果。
希望它有所帮助.....