我想使用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;
}
答案 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循环将其重复设置为1
和0
来使这更简单一些。
这可以作为toggle 142
从u-boot控制台执行,因为我已将LED连接到引脚142.
P.S 感谢您的所有指导。特别感谢KBart