特定的C换档操作。看看并告诉我它是什么

时间:2013-07-12 16:17:27

标签: c stm32

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板标准库中的一段代码。我理解每一个操作,但整个代码都非常混乱。请接受挑战并以更直观的方式告诉我它是什么。

为简单起见,请尝试解释EXTI_PinSourcex0x01时的情况,EXTI_PortSourceGPIOx0x01

任何评论都表示赞赏,提前谢谢。

1 个答案:

答案 0 :(得分: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位,然后将其作为值分配。

您可以对第二项操作应用类似的细分。