This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28388D:用 GPADAT 寄存器中的位掩码清除问题

Guru**** 2390735 points
Other Parts Discussed in Thread: TMS320F28388D
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1491115/tms320f28388d-problem-clearing-bits-with-bit-mask-in-the-gpadat-register

器件型号:TMS320F28388D

工具与软件:

我使用位掩码(我的偏好)设置 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 &=~(掩码<<位置);

但我希望能够在单个操作中使用单个掩码来实现、就像我在上面所做的那样。

有人发现了问题吗?   谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请注意、clearMask2 = 0x0F000000

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    不应在此寄存器上执行按位读取-修改-写入操作。 对于逐位运算、应改用 GPxSET、GPxCLEAR 或 GPxTOGGLE 寄存器。 如果需要直接写入 GPxDAT、则应一次写入整个寄存器。

    即使掩码正确、也要依次执行读取、按位与和、然后写回、这违反了 TRM 指导原则。 我建议改用 GPACLEAR 和 GPASET。

    此致、

    Masoud