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

问题描述 投票:0回答:1

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

c++ microcontroller
1个回答
2
投票

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

#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)

并且您可以使用其他寄存器字段的宏对该数量进行按位或运算。

© www.soinside.com 2019 - 2024. All rights reserved.