记录微控制器外设配置寄存器设置

Documenting microcontroller peripheral configuration register settings?

本文关键字:寄存器 设置 配置 外设 控制器 记录      更新时间:2023-10-16

我目前正在编写通过I2C配置和与特定外设交互的代码。当然,在设备上配置所有所需的特性需要将许多寄存器设置为特定的值。我已经以#define DEVICE_REG_NAME0 0xEE的形式使用宏来组织对设备内存的访问,但是要写入的字节目前只是魔术数字。如何描述/记录每个存储位置内的位或向量,以使设备的配置易于理解?

您可以使用宏来定义寄存器设置以及寄存器地址。例如,假设寄存器NAME0的值是一个位字段,其中包含两个单独的位,用于启用THIS和THAT。它还包含一个两位字段,用于从四种模式中选择一种。

#define DEVICE_REG_NAME0_ADDR 0xEE
#define DEVICE_REG_NAME0_ENABLE_THIS 0x01
#define DEVICE_REG_NAME0_ENABLE_THAT 0x02
#define DEVICE_REG_NAME0_MODE0 0x00
#define DEVICE_REG_NAME0_MODE1 0x04
#define DEVICE_REG_NAME0_MODE2 0x08
#define DEVICE_REG_NAME0_MODE3 0x0C

然后,您构建您想要分配给寄存器的值,在寄存器内的每个字段中按位排列一个宏。

// This value enables THIS, disables THAT, and selects MODE1
(DEVICE_REG_NAME0_ENABLE_THIS | DEVICE_REG_NAME0_MODE1)
// This value disables THIS, enables THAT, and selects MODE2
(DEVICE_REG_NAME0_ENABLE_THAT | DEVICE_REG_NAME0_MODE2)

如果你想更明确地使用禁用位,那么你可以定义这些额外的宏。

#define DEVICE_REG_NAME0_DISABLE_THIS 0x00
#define DEVICE_REG_NAME0_DISABLE_THAT 0x00

寄存器值的各个位和字段的名称应反映数据表中使用的名称。

更新:如果你有一个表示整数值的多比特字段,并且你不想为每个可能的值定义宏,那么你可以使用单个宏来定义移位量。例如,让我们在第4位到第6位添加另一个DEBOUNCE字段,该字段表示一个值在0到7之间的整数周期。

#define DEVICE_REG_NAME0_DEBOUNCE_SHIFT 4

给定一个表示所需值(未移位)的整数变量debounce,您将创建如下所示的相应寄存器值

(debounce << DEVICE_REG_NAME0_DEBOUNCE_SHIFT)

您可以将该数量与其他寄存器字段的宏按位或。