c - 如何在寄存器中定义标志的宽度
问题描述
我正在尝试访问名为 RESPONSE0 的寄存器中的 CMMND_CTR 标志。根据文档,运行标志是第 7 位,挂起标志是第 6 位,睡眠标志是第 5 位等,我将这些位定义如下:#define RESPONSE0_RUNNING (1 << 7)。我遇到问题的地方是 CMMND_CTR 标志是 4 位宽(位 3:0),并且似乎无法弄清楚如何在定义中为标志指定宽度。我已经发布了下面的代码。
解决方案
我遇到问题的地方是 CMMND_CTR 标志是 4 位宽(位 3:0),并且似乎无法弄清楚如何在定义中指定标志的宽度
如果 CMMD_CTR 是 4 位,那么您需要屏蔽掉这 4 位。这意味着您需要设置 4 位 (0xF),并且正如您在其他定义中所做的那样,将其移动到适当的位置。由于 CMMD_CTR 是 3-0 位,因此您需要移位零位。
#define RESPONSE0_REGISTER (*(volatile uint8_t*)0x11)
#define RESPONSE0_RUNNING (1 << 7)
#define RESPONSE0_SUSPEND (1 << 6)
#define RESPONSE0_SLEEP (1 << 5)
#define RESPONSE0_CMD_ERR (1 << 4)
#define RESPONSE0_CMMND_CTR (0xF << 0)
然后你可以像这样读取这些位,
uint8_t response0_cmmd_ctr = RESPONSE0_REGISTER & RESPONSE0_CMMND_CTR;
推荐阅读
- c - 在C中的结构内返回指向char数组的指针?
- c# - Linq 在创建选择之前进行检查
- java - 为什么我的 Angular Node.js 应用程序使用 � 符号将图像上传到 S3,而 Postman 正确上传它们?
- python - 输入重复字母时列表索引超出范围
- gensim - 如何通过 CBOW (GenSim) 从一组输入词中找到最相似的词?
- python - 是否有任何用于从向量回归向量的神经网络模型?
- c++ - MergeSorting C++,运行排序后缺少一个元素
- macos - 如何安装 wxmaxima?
- typescript-compiler-api - Typescript compiler, how to navigate to the definition of a symbol?
- sql - 当我询问 PackageId 时,为什么会返回 MemberId?