0

GPIO を使用して、クレーンボード (ARM プロセッサ) の LED を点灯させたいと考えています。私は組み込みプログラミングに非常に慣れていません。しかし、私はCがかなり得意です。いくつかのWebサイトを参照し、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

まず、組み込みプログラミングで 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
}

main()私はCraneboard用の U-Boot のソース ファイルを持っていないので、コードを配置する正確な場所を教えることはできませんが、基本的にいくつかのオプションがあります:まだ LED が点滅しています!)。2) LED のオン/オフを切り替える別のコマンドを実装します (例については、 command.cおよびcmd _ プレフィックス付きファイルを参照してください) 3) シリアル ループに統合して、ユーザー入力の待機中にピンを切り替えることができるようにします 4) U 経由のアプリケーションとしてビルドします-ブート。

多くの読書とドキュメントに慣れてください。ここでは TRM があなたの味方です (時には唯一の味方です)。また、埋め込みスターター向けの優れたガイドがいくつかあります。ググってみてください。言及することはほとんどありません:

http://www.microbuilder.eu/Tutorials/LPC2148/GPIO.aspx (基本と例)

http://beagleboard.org/ (BeagleBoard の優れたリソースですが、同じ SoC を共有する CraneBoard にも多くのことが当てはまり、優れたコミュニティが含まれています)。

http://free-electrons.com/ (組み込み Linux やその他の高度なトピックを対象としていますが、いくつかの基本も見つけることができます)

http://processors.wiki.ti.com/index.php/CraneBoard (公式の CraneBoard wiki、おそらくこれを知っていますが、念のため)

PS がんばって、あきらめないで!

于 2013-02-11T08:15:32.450 に答える
0

答えを追加したいと思います。私が以前に行ったコーディングは一般化されたものでした。クレーンボードには、操作を行う特定の機能があります。だから、それに応じて書き直しました。'common'u-bootディレクトリのディレクトリにファイル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");

1whileループを使用して、ととして繰り返し設定するだけで、これを少し簡単にすることができます0

toggle 142これは、LEDをピン142に接続したので、u-bootコンソールから実行できます。

PSすべてのご指導ありがとうございます。KBartに感謝します

于 2013-02-27T06:43:27.227 に答える
0

u-boot で (Linux ではなく) 実行したい場合は、u-boot 用のアプリケーションを作成する必要があります。

$5.12 の u-boot マニュアルにその方法が説明されています。

u-boot のソースには、使用できるいくつかの例が含まれています。

于 2013-02-11T07:55:44.123 に答える