在我的STM32代码中,我有一个
#define USART1 ((USART_TypeDef *) USART1_BASE)
我希望
switch((uint32_t)ptr)
{
case USART1: return 1;
(...)
但gcc-arm(6.3.1)给我一个错误
错误:从整数到指针
的reinterpret_cast
我找到了一个可以使用的信息
case __builtin_constant_p(USART1): return 0;
但这只是gcc解决方案?还有更通用的东西吗?
答案 0 :(得分: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;
}
答案 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;
}
答案 2 :(得分: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;
(...)