UINT32 WriteBitsToValue(UINT32 value, UINT32 orig, UINT32 msb, UINT32 lsb) { UINT32 result; UINT32 NoOfBits; UINT32 val; // clear the bits msb to lsb from the orgnal value val = 0xFFFFFFFF; val = (val >>lsb) << lsb; val = (val << (31-msb)) >> (31-msb); val = ~val; // all bits are one except for msb to lasb orig &= val; // get only the correct bits from the value to be assigned // if there are more bits then exclude them NoOfBits = (msb -lsb); value = (value << (31 - NoOfBits)) >> (31 - NoOfBits); value = (value << lsb); result = (orig | value); return result; }
时间: 2024-04-21 08:25:22 浏览: 94
这段代码的作用是将一个32位无符号整数值中的指定位段替换成另一个32位无符号整数值中的指定位段,并返回替换后的结果。其中,参数value表示要替换的新值,参数orig表示原始值,参数msb和lsb分别表示要替换的位段的最高位和最低位。函数中的操作包括:首先将val的所有位都设为1,然后将val中msb到lsb位之外的位都设为0,接着对orig应用AND运算保留msb到lsb位之间的位,接着将value中多余的位数过滤掉,最后将value中的位段移动到正确的位置,与orig中的位段进行OR运算,得到替换后的结果。
相关问题
typedef union { struct { uint32_t timeout_ie :1; uint32_t rx_ack_ie :1; uint32_t rx_byte_ie :1; uint32_t sto_det_ie :1; uint32_t resta_det_ie :1; uint32_t reserved0 :3; uint32_t en_i2c :1; uint32_t i2c_io_en :1; uint32_t slv_mode :1; uint32_t slv_stretch :1; uint32_t prescale :8; uint32_t i2c_pin_sel :1; // 0:CLK->GPIO5, SDA->GPIO6; 1:CLK->GPIO4, SDA->GPIO2 uint32_t reserved1 :11; } b; uint32_t data32; } I2C_CFG_Struct; typedef union { struct { uint32_t halt :1; uint32_t rst_i2c :1; uint32_t sto :1; uint32_t sta :1; uint32_t re_sta :1; uint32_t tx_ack :1; uint32_t mst_rw :1; uint32_t reserved0 :25; } b; uint32_t data32; } I2C_CTL_Struct; typedef union { struct { uint32_t timeout :1; uint32_t rx_ack_if :1; uint32_t rx_byte_if :1; uint32_t sto_det_if :1; uint32_t resta_det_if :1; uint32_t slv_wr :1; uint32_t addr_match :1; uint32_t rx_ack :1; uint32_t busy :1; uint32_t reserved0 :15; uint32_t current_state :4; uint32_t reserved1 :4; } b; uint32_t data32; } I2C_CST_Struct; typedef union { struct c{ uint32_t addr :7; uint32_t reserved0 :25; } b; uint32_t data32; } I2C_ADDR_Struct; typedef union { struct { uint32_t data :8; uint32_t reserved0 :24; } b; uint32_t data32; } I2C_DATA_Struct; typedef enum { I2C_MST, I2C_SLV } I2C_ROLE;
这段代码定义了一些联合体和结构体,用于对I2C配置寄存器、控制寄存器、状态寄存器、地址寄存器和数据寄存器进行位字段的操作。
- `I2C_CFG_Struct` 是一个联合体,其中包含了一个结构体,该结构体定义了配置寄存器的各个位字段。
- `I2C_CTL_Struct` 是一个联合体,其中包含了一个结构体,该结构体定义了控制寄存器的各个位字段。
- `I2C_CST_Struct` 是一个联合体,其中包含了一个结构体,该结构体定义了状态寄存器的各个位字段。
- `I2C_ADDR_Struct` 是一个联合体,其中包含了一个结构体,该结构体定义了地址寄存器的各个位字段。
- `I2C_DATA_Struct` 是一个联合体,其中包含了一个结构体,该结构体定义了数据寄存器的各个位字段。
此外,还定义了一个枚举类型 `I2C_ROLE`,用于指定I2C的角色,可以是主设备(`I2C_MST`)或从设备(`I2C_SLV`)。
struct CAN_Brake_Report{ uint32_t ID : 8; uint32_t PI : 16; uint32_t Timeout : 1; uint32_t Fault : 1; uint32_t Veh_block : 1; uint32_t NONE1 : 13; uint32_t PO : 16; uint32_t WorkMode : 3; uint32_t TYPEFB : 3; uint32_t OVERRIDE : 1; uint32_t Available : 1; uint32_t BrkRptChkSm : 8; };打印上面的结构体
这个结构体定义了一个表示刹车报告的数据类型,它包含了ID,PI,Timeout,Fault,Veh_block,PO,WorkMode,TYPEFB,OVERRIDE,Available以及BrkRptChkSm等字段。
阅读全文