以下是代码的一部分:
#define GPIO_PORTF_DATA_BITS_R ((volatile unsigned long *)0x40025000)
#define LED_BLUE 0x04
#define LED_GREEN 0x08
#define LED_RED 0x02
GPIO_PORTF_DATA_BITS_R[LED_BLUE | LED_GREEN | LED_RED] = (LED_GREEN | LED_RED)
由于我对指针的了解很少,它相当于
volatile unsigned long *p = 0x40025400;
p[0x0E] = 0x0A;
如果我是正确的,那么p [0x0E]是什么意思或在这里做什么?
答案 0 :(得分:3)
在C中,索引运算符[]
具有以下语义:a[b]
表示*(a + b)
,因此a
或 {{1}必须评估到一个地址。
因此,您的示例意味着b
,即它访问一个寄存器,该寄存器与0x40025400处的基址相距偏移0xe * *(0x40025400 + 0xe) = 0xa
。缩放是因为指针指向sizeof (unsigned long)
,并且指针算术总是按指向的类型的大小进行缩放。
答案 1 :(得分:0)
同意@Lundin。定义LED_BLUE, LED_GREEN, LED_RED
都是2的幂和LED控制通常只需要一点点开启或关闭暗示这些定义是位掩码。
建议您需要以下内容。
void LED_Red_On(void) {
*GPIO_PORTF_DATA_BITS_R |= LED_RED;
}
void LED_Green_Off(void) {
*GPIO_PORTF_DATA_BITS_R &= ~((unnsigned long)LED_GREEN);
}
...