用于Raspberry pi的C中的裸金属编程

时间:2014-09-17 09:12:11

标签: c raspberry-pi hardware

我目前正在编写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);

3 个答案:

答案 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.