0

我想使用 GPIO 打开起重机板(ARM 处理器)中的 LED。我对嵌入式编程很陌生。但是,我很擅长C。我参考了一些网站并了解了GPIO相关命令。我写了一个代码,但我不太确定如何将它集成到起重机板的 u-boot 编码中。我不知道从哪里开始。请指导我。

#define LED1    (1 << 6)

int getPinState(int pinNumber);

int main(void)
{

  GPIO0_IODIR |= LED1;

  GPIO0_IOSET |= LED1;

  while (1)
  {

      GPIO0_IOCLR |= LED1;

  }
}

int getPinState(int pinNumber)
{

  int pinBlockState = GPIO0_IOPIN;

  int pinState = (pinBlockState & (1 << pinNumber)) ? 1 : 0;

  return pinState;
}
4

3 回答 3

2

首先,学习常见的位(在你的情况下也是 pin)操作表达式,你将在嵌入式编程中使用很多:

/* Set bit to 1 */
GPIO0_IODIR |= LED1; //output

/* Clear bit (set to 0) */
GPIO0_IOSET &= ~LED1; //low

/* Toggle bit */
GPIO0_IOSET ^= LED1;

除了第一次迭代外,您的while()循环实际上什么都不做,因为相同的逻辑 OR 操作不会更改位状态(请参阅此操作的逻辑表)。此外,您应该添加延迟,因为如果引脚切换太快,LED 可能看起来一直处于关闭状态。简单的解决方案如下所示:

while(1)
{
   GPIO0_IOSET ^= LED1;
   sleep(1); //or replace with any other available delay command
}

我没有用于 Craneboard 的 U-Boot 源文件,因此无法告诉您放置代码的确切位置,但基本上有几种选择:1)将其添加到main()U-Boot 启动的位置,从而将其挂起(但你仍然有 LED 闪烁!)。2)实现单独的命令来打开/关闭 LED(参见command.ccmd _ 前缀文件的示例) 3)将其集成到串行循环中,因此可以在等待用户输入时切换引脚 4)将其构建为 U 上的应用程序-启动。

习惯大量阅读和文档,TRM 是你的朋友(有时是唯一的朋友)。还有一些针对嵌入式初学者的很棒的指南,只需在谷歌周围搜索即可。很少提及:

http://www.microbuilder.eu/Tutorials/LPC2148/GPIO.aspx(带有示例的基础知识)

http://beagleboard.org/(BeagleBoard的绝佳资源,但更适用于 CraneBoard,因为它们共享相同的 SoC,包括很棒的社区)。

http://free-electrons.com/(更多关于嵌入式 Linux 和其他高级主题,但也可以找到一些基础知识)

http://processors.wiki.ti.com/index.php/CraneBoard(CraneBoard官方wiki,可能知道这一点,但以防万一)

PS祝你好运,不要放弃!

于 2013-02-11T08:15:32.450 回答
0

如果您想在 u-boot(而不是 Linux)中执行此操作,则必须为 u-boot 编写应用程序。

5.12 美元的 u-boot 手册解释了如何操作。

u-boot 的源代码提供了一些您可以使用的示例。

于 2013-02-11T07:55:44.123 回答
0

我想添加我的答案。我之前所做的编码是通用的。在起重机板中,有某些功能可以执行操作。所以,我相应地重写了它。我将文件 cmd_toggle.c 包含在'common'u-boot 目录的目录中。并将其添加到 Makefile。以下代码将使 LED 闪烁。

int glow_led(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
int ret,i=0,num=0,ctr=0;
int lpin;
lpin=(int)strtoul(argv[1]);
ret=set_mmc_mux();
if(ret<0)
    printf("\n\nLED failed to glow!\n\n");
else{
        if(!omap_request_gpio(lpin))
        {
        omap_set_gpio_direction(lpin,0);

        for(i=1;i<21;i++)
        {
            ctr=0;
            if((i%2)==0)
            {
                num=num-1;
                omap_set_gpio_dataout(lpin,num);
            }
            else
            {
                num=num+1;
                omap_set_gpio_dataout(lpin,num);
            }

                    udelay(3000000);
        }

    }
}
return 0;
}

U_BOOT_CMD(toggle,2,1,glow_led,"Glow an LED","pin_number");

我可以通过使用 while 循环重复将其设置为1and来简化这一点0

这可以从 u-boot 控制台执行toggle 142,因为我已将 LED 连接到引脚 142。

PS感谢您的所有指导。特别感谢KBart

于 2013-02-27T06:43:27.227 回答