Embedded 在craneboard中使用GPIO点亮LED

Embedded 在craneboard中使用GPIO点亮LED,embedded,embedded-linux,led,gpio,Embedded,Embedded Linux,Led,Gpio,我想使用GPIO打开craneboard(ARM处理器)中的LED。我对嵌入式编程非常陌生。但是,我在C语言方面很在行。我在一些网站上参考过,并学习了与GPIO相关的命令。我写了一段代码,但我不太确定如何将其集成到craneboard的u-boot编码中。我不知道从哪里开始。请引导我 #define LED1 (1 << 6) int getPinState(int pinNumber); int main(void) { GPIO0_IODIR |= LED1;

我想使用GPIO打开craneboard(ARM处理器)中的LED。我对嵌入式编程非常陌生。但是,我在C语言方面很在行。我在一些网站上参考过,并学习了与GPIO相关的命令。我写了一段代码,但我不太确定如何将其集成到craneboard的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;
}

#定义LED1(1如果您想在u-boot(而不是Linux)中执行此操作,那么您必须为u-boot编写一个应用程序

解释如何做


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

首先,学习在嵌入式编程中经常使用的通用位(在您的例子中也是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操作不会改变位状态(请参阅此op的逻辑表)。此外,您还应该添加延迟,因为如果引脚切换过快,LED可能会一直关闭。简单的解决方案如下:

while(1)
{
   GPIO0_IOSET ^= LED1;
   sleep(1); //or replace with any other available delay command
}
我没有用于Craneboard的U-Boot源文件,因此无法告诉您代码的确切位置,但基本上有几个选项:1)将其添加到U-Boot启动的
main()
,从而将其挂起(但您仍然有LED闪烁!)。2) 执行单独的命令来打开/关闭LED(参见command.c和cmd_uu前缀文件示例)3)将其集成到串行循环中,以便在等待用户输入时切换pin 4)通过U-Boot将其构建为应用程序

习惯于大量的阅读和文档,TRM是你在这里的朋友(有时是唯一的朋友)。此外,还有一些非常适合嵌入式初学者的指南,只需谷歌搜索即可。很少有人提及:

(基础知识和示例)

(对于BeagleBoard来说,这是一个很好的资源,但对于CraneBoard来说却有很多应用,因为它们共享同一个SoC,包括伟大的社区)

(更多关于嵌入式Linux和其他高级主题,但也可以找到一些基础知识)

(官方CraneBoard wiki可能知道这一点,但以防万一)


祝你好运,不要放弃

我想补充我的答案。我之前所做的编码是一种广义的编码。在craneboard中,有特定的功能来执行操作。因此,我相应地重写了它。我在u-boot目录的
'common'
目录中包含了cmd_toggle.c文件。并将其添加到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");
int-glow_发光二极管(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=设置mmc mux();

非常感谢。我一定会查看这些网站。顺便说一句,如果你能帮我一点忙,源代码在。很高兴我能帮你。你的主板安装好并运行了吗?如果是,你能访问U-Boot控制台吗?最简单(最快),解决方案是修改U-Boot内置的示例。只需在hello_world.c中添加循环,重新编译、刷新,然后按照如何使其运行。如果您还有任何问题,请告诉我,也许我可以再次提供帮助。谢谢。我尝试了给定的过程。我没有更改加载地址。它已设置为0x82000000。因此,我只是加载了。但是当“启动”时,它只是挂起。有什么建议吗?我们有没有办法在u-boot加载时让连接到GPIO的LED发光?没有足够的信息告诉你板挂起的原因。至于第二个问题,当然有一种方法,实际上有很多种方法-你可以初始化切换LED的计时器,在启动时手动闪烁一些行动等,这取决于你的目标是什么。但这个网站不是为冗长的讨论,通过邮件联系我,最好有一些日志和描述你做了什么,你想做什么。