如何在C++中切换STM32的BitAction枚举类型变量的值?
问题:STM32F103中BitAction枚举变量切换值时出现类型不兼容错误
在基于STM32F103VET编写按键控制LED开关的代码时,定义了BitAction枚举类型的变量BitVal,尝试通过BitVal = !BitVal切换其值时,编译器报错:assigning to 'BitAction' from incompatible type 'bool'。
现有代码如下:
#include "stm32f10x_rcc.h" #include "stm32f10x.h" #include "misc.h" void GPIO_Config(void); BitAction BitVal; int main(){ GPIO_Config(); GPIO_SetBits(GPIOA, GPIO_Pin_6); while(1) { if(!GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10)){ while(!GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10)){ GPIO_WriteBit(GPIOA, GPIO_Pin_6, BitVal); BitVal =! BitVal; //error: assigning to 'BitAction' from incompatible type 'bool' } } } } void GPIO_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE); /*config Led PA6*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*config Button E10*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); //button U6 }
BitAction枚举定义:
/** * @brief Bit_SET and Bit_RESET enumeration */ typedef enum { Bit_RESET = 0, Bit_SET }BitAction;
解决方案
报错原因是!BitVal会将枚举值转换为布尔类型(bool),而BitAction是枚举类型,直接赋值触发类型不兼容错误。以下是几种正确的切换方法:
方法1:条件判断切换(推荐)
直接判断当前枚举值,赋值为对应另一个枚举常量,完全符合枚举类型使用规范,可读性强:
BitVal = (BitVal == Bit_RESET) ? Bit_SET : Bit_RESET;
方法2:强制类型转换
利用布尔值与枚举值的数值对应关系(false对应0、true对应1),将取反结果强制转换为BitAction类型:
BitVal = (BitAction)!BitVal;
注意:该方法依赖枚举值的数值定义,若后续枚举常量数值修改可能失效。
方法3:数值运算切换
基于枚举值的数值特性,通过减法实现切换:
BitVal = (BitAction)(1 - BitVal);
逻辑:Bit_RESET为0时,1-0=1对应Bit_SET;Bit_SET为1时,1-1=0对应Bit_RESET。同样依赖枚举值的数值定义。
额外优化:修正按键逻辑
原代码中按键按下循环内反复执行写GPIO和值切换,会导致LED快速闪烁,建议改为按键释放后再切换状态:
while(1) { if(!GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10)){ // 等待按键释放 while(!GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10)); // 释放后切换LED状态 BitVal = (BitVal == Bit_RESET) ? Bit_SET : Bit_RESET; GPIO_WriteBit(GPIOA, GPIO_Pin_6, BitVal); } }
内容的提问来源于stack exchange,提问作者tung vu
相关产品推荐
相关产品推荐

