啊,按位運算符數學。
如果將它分解爲幾部分並「優化」某些語言語法,會更容易理解。讓我們也做了較大的變化卷積更容易閱讀:
SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] &= ~((uint32_t)0x0F) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03));
變爲:
#define cfgval_shift_2r (SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02])
cfgval_shift_2r = (cfgval_shift_2r) & ~((uint32_t)0x0F) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03));
揭開一些常量按位數學(如~((uint32_t)0x0F)
)的:
cfgval_shift_2r = (cfgval_shift_2r) & 0xFFF0 << (0x04 * (EXTI_PinSourcex & 0x03));
現在我們有些東西比較容易閱讀。
EXTI_PinSourcex
== 0x00
:
// cfgval_shift_2r = SYSCFG->EXTICR[0], because 0 shifted any number of bits is always 0
SYSCFG->EXTICR[0] = (SYSCFG->EXTICR[0]) & 0xFFF0 << (0x04 * (0 & 0x03));
// \ == 0 /
SYSCFG->EXTICR[0] = (SYSCFG->EXTICR[0]) & 0xFFF0;
所以這需要的SYSCFG->EXTICR[0]
,只是掩蓋了最低顯著字節值關閉,併爲其分配回的價值。
EXTI_PinSourcex
== 0x01
:
// cfgval_shift_2r = SYSCFG->EXTICR[0], because (0x01 >> 0x02) == 0
SYSCFG->EXTICR[0] = (SYSCFG->EXTICR[0]) & 0xFFF0 << (0x04 * (0x01 & 0x03));
// \ == 0x04 * 0x01 == 0x04/
SYSCFG->EXTICR[0] = (SYSCFG->EXTICR[0]) & 0xFFF0 << 0x04;
所以這需要的SYSCFG->EXTICR[0]
值,口罩的至少-顯著字節關閉,轉移一切由4個比特的左,並給它分配作爲回價值。
您可以對第二個操作應用類似的細分。
您是否打印過'SYSCFG-> EXTICR [EXTI_PinSourcex >> 0x02]'它應該是'0'的值。如你所說'EXTI_PinSourcex' ='0x01',所以'SYSCFG-> EXTICR [0x01 >> 0x02] == == SYSCFG-> EXTICR [0]'我想'SYSCFG-> EXTICR [0] == == **表達式之後的零**,只需打印。 –
這聽起來像是一個codegolf.SE工作... –