踩坑日记20251124

踩坑日记20251124

1.51单片机C语言

typedef union {
    uint8_t Byte;  // 整体访问8位
    struct {
        uint8_t B0  : 1;  // 位域访问每一位
        uint8_t B1  : 1;
        uint8_t B2  : 1;
        uint8_t B3  : 1;
        uint8_t B4  : 1;
        uint8_t B5  : 1;
        uint8_t B6  : 1;
        uint8_t B7  : 1;
    } Bits;
} ByteType;
#define bb0 Bits.B0
#define bb1 Bits.B1
#define bb2 Bits.B2
#define bb3 Bits.B3
#define bb4 Bits.B4
#define bb5 Bits.B5
#define bb6 Bits.B6
#define bb7 Bits.B7
#define bb8 Bits.B8

ByteType Uart1Tmp;
ByteType DataTmp;
#define Uart1Data Uart1Tmp.Byte
#define MoDeFlag1 DataTmp.bb0
#define MoDeFlag2 DataTmp.bb1
#define MoDeFlag3 DataTmp.bb2
#define MoDeFlag4 DataTmp.bb3

Uart1Tmp = 0;
Uart1Data = MoDeFlag1<<4;
Uart1Data + = MoDeFlag3*3+MoDeFlag2*2+MoDeFlag1;

//与下面这种写法有何不同
Uart1Tmp = 0;
Uart1Data = MoDeFlag1<<4+MoDeFlag3*3+MoDeFlag2*2+MoDeFlag1;
  1. 位域存储顺序:51 单片机的编译器(如 Keil C51)中,位域默认按「低地址到高地址」分配,即 DataTmp.bb0 是 DataTmp.Byte 的 最低位(bit0)bb1 是 bit1,bb2 是 bit2,bb3 是 bit3(符合你的定义预期)。不同编译器(如 Keil C51、SDCC)的位域存储顺序可能不同(部分编译器会按「高 bit 到低 bit」分配),建议在实际使用前用调试器验证。
  2. 运算符优先级:C 语言中 + 的优先级 高于 <<(移位运算符),这是导致差异的核心原因。
  3. 提升优先级使用小括号,Uart1Data = (MoDeFlag1<<4)+MoDeFlag3*3+MoDeFlag2*2+MoDeFlag1;

2.STM32单片机Hal库

  • 在使用这个宏定义时__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING);
  • 报错如下问题:Expected ':'clang(expected) Expected expressionclang(expected_expression) macro __HAL_TIM_SET_CAPTUREPOLARITY provided by "stm32f1xx_hal_tim.h" #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ do { \ TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ } while (0)
#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \
  do{                                                                     \
    TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \
    TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
  }while(0)
  • 跳转到这个宏时__HAL_TIM_SET_CAPTUREPOLARITY也没有发现问题,后来发现是宏定义里面的函数有问题。TIM_RESET_CAPTUREPOLARITY这个函数有问题,多了一个括号,还好上网查了一下,问了半天AI说没问题。
  • 搁这里躲着呢,太离谱了。
    Pasted image 20251124220456
posted @ 2025-11-24 22:06  小智001  阅读(22)  评论(0)    收藏  举报