// 为了处理字节序和对齐差异,使用标准库中的 <stdint.h> 来定义固定宽度整数类型
#include <stdint.h>
// 定义控制寄存器结构体
typedef struct {
// 第0 - 3位用于设置设备模式
uint8_t device_mode : 4;
// 第4 - 7位用于设置数据速率
uint8_t data_rate : 4;
} __attribute__((packed)) CR1_t;
// 定义状态寄存器结构体
typedef struct {
// 第0 - 2位表示设备状态标志
uint8_t device_status : 3;
// 保留位(如果有),用未命名位域填充,确保结构体大小正确
uint8_t : 5;
} __attribute__((packed)) SR1_t;
// 为了确保可移植性和高效性,还可以提供访问函数
// 设置控制寄存器的设备模式
void set_device_mode(CR1_t *cr1, uint8_t mode) {
cr1->device_mode = mode & 0x0F;
}
// 获取控制寄存器的设备模式
uint8_t get_device_mode(const CR1_t *cr1) {
return cr1->device_mode;
}
// 设置控制寄存器的数据速率
void set_data_rate(CR1_t *cr1, uint8_t rate) {
cr1->data_rate = rate & 0x0F;
}
// 获取控制寄存器的数据速率
uint8_t get_data_rate(const CR1_t *cr1) {
return cr1->data_rate;
}
// 获取状态寄存器的设备状态标志
uint8_t get_device_status(const SR1_t *sr1) {
return sr1->device_status;
}
说明
- 使用
stdint.h
:定义了固定宽度整数类型,如 uint8_t
,确保在不同平台上数据类型的大小一致,增强可移植性。
- 位域定义:在结构体中使用位域来精确表示寄存器中的各个位段,节省内存空间并方便对寄存器位的操作。
__attribute__((packed))
:告诉编译器不要对结构体进行填充和对齐优化,确保结构体的大小和内存布局与定义的位域一致,避免因平台对齐规则不同导致的问题。
- 访问函数:提供了一些简单的访问函数来操作寄存器的位域,这样不仅可以提高代码的可读性和可维护性,还能在函数内部进行必要的边界检查和数据处理,增强代码的健壮性。