我目前正在编写raspberry pi。
我想澄清一些疑问,请任何人帮忙。
以下是代码段。
#define GPIO_BASE 0x20200000UL
gpio = (unsigned int*)GPIO_BASE; gpio[GPIO_GPFSEL1] |= (1 << 18);
此代码来自http://www.valvers.com/embedded-linux/raspberry-pi/step01-bare-metal-programming-in-cpt1
我了解代码的功能,以打开和关闭LED。
我有理解这些陈述的问题
gpio = (unsigned int*)GPIO_BASE; gpio[GPIO_GPFSEL1] |= (1 << 18);
答案 0 :(得分:2)
首先,你在内存中有一些地址。
define GPIO_BASE 0x20200000UL
在此地址下存在GPIO的控制结构。在你的情况下,它只是一系列的整数。将值写入该结构的某个字段会使GPIO设置其引脚。
gpio = (unsigned int*)GPIO_BASE;
在结构中选择一些寄存器(地址(unsigned int *)GPIO_BASE + GPIO_GPFSEL1)并将第18位设置为开启。
gpio[GPIO_GPFSEL1] |= (1 < < 18);
GPIO可能会将其中一个引脚设置为高电平状态。连接到该引脚的LED将开始发光。
答案 1 :(得分:1)
嗯......
第一句话:
gpio = (unsigned int*)GPIO_BASE;
将指针变量gpio
设置为等于GPIO_BASE
的值,并将后者转换为指针类型。
第二个
gpio[GPIO_GPFSEL1] |= (1 << 18);
对gpio[GPIO_GPFSEL1]
中的值与常量值1 << 18
进行按位或运算。这会在寄存器GPIO_GPFSEL1
中“打开”第18位(从0开始计数)。
请记住,在C中,数组索引a[b]
与*(a + b)
相同,即它是指针添加和解除引用。
答案 2 :(得分:0)
在
gpio = (unsigned int*)GPIO_BASE;
gpio指向0x20200000
内存地址。这是&#34; GPIO外设的基地址(ARM物理地址)&#34;。
您链接的文章说:
回到处理器手册,我们看到了我们需要的第一件事 要做的是将GPIO引脚设置为输出。这是通过设置 GPIO16的功能到输出。 'GPIO功能中的位18到20 选择1'寄存器控制GPIO16引脚。
声明
#define GPIO_GPFSEL1 1
gpio[GPIO_GPFSEL1] |= (1 << 18);
分解为:
gpio[1] = gpio[1] | (1 << 18);
因此,地址(0x20200000 + sizeof(unsigned int))
被取消引用,OR运算符将第18位设置为1.