Part Number:TMS320F280049
#define HWREGH(x) (*((volatile uint16_t *)((uintptr_t)(x))))
HWREGH(WD_BASE + SYSCTL_O_WDCR) |= SYSCTL_WD_CHKBITS | SYSCTL_WDCR_WDDIS; 这个语句理解如下:
HWREGH(0x0000 7000U+0x0000 0029U) |= 0x0000 0068U进行操作;
但我不太想白 这个或等号 ” |= “, 在这里是什么意思。 跟C语言里面的|= 运算符一样理解吗?把地址:0x0000 7000U+0x0000 0029U里面的值 与 0x0000 0068运算后再赋给地址:0x0000 7000U+0x0000 0029?如果这样理解的话,地址0x0000 7000U+0x0000 0029里面的初始值应该为0H?
Yale Li:
Hi Andy,
Andy Liu 说:跟C语言里面的|= 运算符一样理解吗?把地址:0x0000 7000U+0x0000 0029U里面的值 与 0x0000 0068运算后再赋给地址:0x0000 7000U+0x0000 0029?
是的。
您列一个真值表看一下,会方便您理解:
位值
运算值
‘|=’结果0
0
00
1
11
0
11
1
1可以看到‘|=’就是要对相关位置1(表格的第2、4行),并且不会改变不想操作的位的值(第1、3行)。
,
Andy Liu:
Hello Yale,
再请教一下,初始状态下,地址:0x0000 7000U+0x0000 0029U里面的内容为0,对吗? 或等的运算我明白,只是以前习惯了直接位操作,现在初次接触这个地址操作的方法,一时想不明白。谢谢你的回答。
,
Yale Li:
Hi Andy,
Andy Liu 说:再请教一下,初始状态下,地址:0x0000 7000U+0x0000 0029U里面的内容为0,对吗?
这个要去查TRM中的寄存器表,表中会给出寄存器的每个位在复位之后的初始值;
但其实初始值是多少是无所谓的,这就是用 ‘或等’ 来代替 ‘等于’ 进行赋值操作的原因。