在起重机中使用GPIO发光LED

时间:2013-02-11 06:49:49

标签: embedded embedded-linux led gpio

我想使用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;
}

3 个答案:

答案 0 :(得分:2)

首先,学习在嵌入式编程中将使用A LOT的公共位(在您的情况下也是引脚)操作表达式:

/* 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
}

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

习惯了很多阅读和文档,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维基,可能知道这个,但以防万一)

P.S。祝你好运,不要放弃!

答案 1 :(得分:0)

如果你想在u-boot中(而不是在Linux中),那么你必须为u-boot编写一个应用程序。

$5.12 of u-boot manual解释了如何做到这一点。

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

答案 2 :(得分:0)

我想补充一下我的答案。我以前做的编码是一个广义的编码。在起重机中,有一些功能可以完成操作。所以,我相应地重写了它。我将文件cmd_toggle.c包含在u-boot目录的'common'目录中。并将其添加到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循环将其重复设置为10来使这更简单一些。

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

P.S 感谢您的所有指导。特别感谢KBart