工具与软件:
我使用位掩码(我的偏好)设置 TMS320F28388D 微控制器寄存器中的位、一切都很好、但我在清除 GPADAT 数据寄存器中的位 时遇到问题;具体而言、我可以使用 GPADAT |=雪崩轻松设置特定位、但当我尝试使用 GPADAT &= clearMask 位为1时、不会清除为0。
我认为这些值是正确的:
GPADAT 定义为 #define GPADAT (*(Volatile UINT32 *)(GPIO_DAT_BASE_ADDRESS + GPADAT_OFFSET))
使用#define GPIO_DAT_BASE_ADDRESS 0x00007F00和#define GPADAT_OFFSET 0x00000000 (仅在基址、但我使用这种形式来促进其他寄存器的设置)
当 GPADAT 位24 - 27中的值(雪崩)为4位时、设置为雪崩=雪崩<< 24
通过掩码(clearMask)清除 OR'ing 操作= 0xF0FFFFFF 之前的位置
以便我
雪崩=雪崩<< 24;//正确定位位
GPADAT &= clearMask; //清除 GPADAT 中相应的位位置
GPADAT |=雪崩;//将位值写入数据寄存器中的相应位置
这样的结果是、当我从置零的 GPADAT 寄存器开始操作时、ORing 操作会将值正确地写入 GPADAT 寄存器中。
但之后、值为1的位位置不会被 AND 运算复位、但值为1的位位置会被 OR 运算写入、因此最终4位值仅为1111 (0xF)。
我听说数据寄存器出现了清除-修改-设置的问题、因此我尝试将 GPADAT &= clearMask;替换为 GPACLEAR = clearMask2
其中 GPACLEAR 是 #define GPACLEAR (*(Volatile UINT32 *)(GPIO_DAT_BASE_ADDRESS + GPACLEAR_OFFSET))、并具有#define GPACLEAR_OFFSET 0x00000004
这也不起作用(未清除4个位)。
最后、我通过用以下公式分别清除每个位来实现这一点:
掩码= 1;
GPADAT &=~(掩码<<位置);
但我希望能够在单个操作中使用单个掩码来实现、就像我在上面所做的那样。
有人发现了问题吗? 谢谢。