2017-04-24 39 views
1

以我STM32代碼我有一個角色const int的指針爲int,在開關殼體節點

#define USART1    ((USART_TypeDef *) USART1_BASE) 

,我想有

switch((uint32_t)ptr) 
{ 
    case USART1: return 1; 
(...) 

但是GCC-臂(6.3.1 )給我一個錯誤

error: reinterpret_cast from integer to pointer

我發現我可以使用

信息210
case __builtin_constant_p(USART1): return 0; 

但這只是gcc解決方案?有更通用的東西嗎?

+1

'ptr'是什麼類型?什麼是(USART_TypeDef *)? – Unimportant

+0

開關(reinterpret_cast ptr))? –

+0

您正試圖將一個指針指向一個整數 - >'switch((uint32_t)ptr)' – CinCout

回答

2

UART1_BASE這是一對夫婦無符號整型常量的簡單相加。見機頭:

#define PERIPH_BASE   0x40000000U 
#define APB2PERIPH_BASE  (PERIPH_BASE + 0x00010000U) 
#define USART1_BASE   (APB2PERIPH_BASE + 0x1000U) 

所以應該能夠使用

switch((unsigned int)ptr) { 
    case USART1_BASE: return 1; 
} 
0

USART1_BASE是STM32開發環境的頭文件中的一個數字。當您決定在交換機中使用何種類型時,您可以編譯您的代碼。我建議uint32_t

switch((uint32_t)ptr) 
{ 
    case USART1_BASE: return 1; 
    (...) 

如果您想了解更多的可讀性,你可以嘗試從開關除去演員:

uint32_t ptr_value = (uint32_t)ptr; 

switch(ptr_value) 
{ 
    case USART1_BASE: return 1; 
    (...) 
2

你忘了投指向整數case語句也是如此。 來自我工作代碼的示例:

switch ((uint32_t)gpio) { 
    case (uint32_t)GPIOA: 
     EXTI_cfgr = 0b0000; 
     break; 
    case (uint32_t)GPIOB: 
     EXTI_cfgr = 0b0001; 
     break; 
    case (uint32_t)GPIOC: 
     EXTI_cfgr = 0b0010; 
     break; 
    default: 
     break; 
    } 
相關問題