2013-07-12 62 views
-1
SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] &= 
           ~((uint32_t)0x0F) << 
           (0x04 * (EXTI_PinSourcex & (uint8_t)0x03)); 

SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] |= 
            (((uint32_t)EXTI_PortSourceGPIOx) << 
           (0x04 * (EXTI_PinSourcex & (uint8_t)0x03))); 

這是來自STM32F4板標準庫的一段代碼。我理解每一個操作,但整個代碼真的很混亂。請接受挑戰,並以更直觀的方式告訴我它是什麼。特定的C移位操作。看看並告訴我它是什麼

並且爲了簡單起見,試圖解釋當EXTI_PinSourcex0x01EXTI_PortSourceGPIOx也是0x01時的情況。

任何意見表示讚賞,在此先感謝。

+0

您是否打印過'SYSCFG-> EXTICR [EXTI_PinSourcex >> 0x02]'它應該是'0'的值。如你所說'EXTI_PinSourcex' ='0x01',所以'SYSCFG-> EXTICR [0x01 >> 0x02] == == SYSCFG-> EXTICR [0]'我想'SYSCFG-> EXTICR [0] == == **表達式之後的零**,只需打印。 –

+0

這聽起來像是一個codegolf.SE工作... –

回答

2

啊,按位運算符數學。

如果將它分解爲幾部分並「優化」某些語言語法,會更容易理解。讓我們也做了較大的變化卷積更容易閱讀:

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個比特的左,並給它分配作爲回價值。

您可以對第二個操作應用類似的細分。

+0

非常感謝。 – CodeFarmer

相關問題