You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:25:21