同様の投稿があることは知っていました: C/C++ プログラムから LED を点滅させる手順は?
しかし今、私はアームベースの開発ボードに取り組んでおり、LED をオンまたはオフにするために使用できる 2 つのシリアル ポートがあるようです。
基本的な流れとしては、シリアルの1ピンを「1」またはONにするとLEDが点灯し、「0」で消灯するという流れだと思います。
私が参照できるC言語の参照コードはありますか?
同様の投稿があることは知っていました: C/C++ プログラムから LED を点滅させる手順は?
しかし今、私はアームベースの開発ボードに取り組んでおり、LED をオンまたはオフにするために使用できる 2 つのシリアル ポートがあるようです。
基本的な流れとしては、シリアルの1ピンを「1」またはONにするとLEDが点灯し、「0」で消灯するという流れだと思います。
私が参照できるC言語の参照コードはありますか?
一般的に、ボードには、組み込みのI / Oを制御できるボードサポートパッケージ(BSP)が付属している必要があります。ハードウェアフロー制御信号を本当に使用したい場合は、シリアルライブラリを探してください。
ボード上でGPIO(汎用I / O、またはデジタルI / O)を探すことをお勧めします。これにより、通常、入力または出力として構成できます。デジタルI/Oラインとアースピンの間の電流制限抵抗を介してLEDを接続できるはずです。LEDを逆向きに接続すると、照明の代わりに電流が遮断されるため、LEDの向きが正しいことを確認してください。そしていつものように、接続する前に必ずデジタル電圧計でチェックしてください。
デジタルI/O用のBSPがない場合でも、構成は通常非常に簡単です。レジスタにビットを設定して有効にし、別のレジスタにビットを設定して入力または出力を選択します。これらは通常、8ビットの「ポート」に配置されます。一部のシステムでは個別のI/Oピンを構成できますが、他のシステムでは入力または出力用にポート全体を構成することしかできません。次に、書き込み/出力レジスタの制御するビットに1または0を書き込むだけです。
ARMチップには通常、かなりの量の周辺機器が組み込まれているため、ほとんどのボードはI / Oをボード上の物理コネクタに接続するだけであり、レジスタメモリマップを見つけるためにチップベンダーのドキュメントを読む必要がある場合があります。より優れたボードベンダーは、ドキュメント、ライブラリ(BSP)、および例を提供します。Luminary Microは、イーサネットMACとPHYが組み込まれたチップを提供し、コネクタとマグネティックスを追加するだけで、1チップのWebサーバーを利用できます。
これは、使用している特定のアームベースの開発ボードの仕様に大きく依存します。
そのボードに固有のドキュメントを見つける必要があります。
私は以前、この種のプログラミングを行っていました。
シリアル ポート接続を調べる必要があり ます http://www.lammertbies.nl/comm/cable/RS-232.html http://www.beyondlogic.org/serial/serial.htm
出力に +5v、-5v がありますが、今ははっきりとは思い出せません。すべてのピンが必要なわけではありません。
以前は ARM を使用したことがありませんが、プログラムには 8 ビットの PIC コントローラーを使用しています。オンラインで多くの例を見つけることができると思います。
GPIO を制御するための推奨される代替手段は、BSP を使用することです。この BSP (ボード サポート パッケージ) は、すべての周辺機器を適切なデフォルトに設定し、関数を呼び出せるようにするためのすべての作業を行います。選択した BSP には、1 バイトを 8 ビット GPIO ポートに書き込む機能がある可能性があります。あなたのLEDには1ビットしかありません。この場合、C コードは次のようになります (少なくとも、Luminary Micro キットではこのように動作します)。(コード例。特にキットでコンパイルするには、少し余分な作業が必要です)。
/* each LED is addressed by an address (byte) and a bit-within-this-byte */
struct {
address, // address of IO register for LED port
bit // bit of LED
} LEDConfigPair;
struct LEDConfigPair LEDConfig[NUMBER_OF_LEDS] = {
{GPIO_PORTB_BASE,0}, // LED_0 is at port B0
{GPIO_PORTB_BASE,1} // LED_1 is at port B1
} ;
/* function LED_init configures the GPIOs where LEDs are connected as output */
led_init(void)
{
U32 i;
for(i=0;i<NUMBER_OF_LEDS;i++)
{
GPIODirModeSet( LEDConfig[i][0], LEDConfig[i][1], GPIO_DIR_MODE_OUT );
}
}
/* my LED function
set_led_state makes use of the BSP of Luminary Micro to access a GPIO function
Implementation: this BSP requires setting 8 port wide IO, so the function will calculate a mask (
*/
set_led_state(U8 led,bool state)
{
U8 andmask;
U8 setmask;
andmask = ~(1 << LEDConfig[led].bit);// a bitmask with all 1's except bit of LED
if (true == state)
{
setmask = (1 << LEDConfig[led].bit); // set bit for LED
} else
{
setmask = 0;
}
GPIOPinWrite(LEDConfig[led].address, andmask, setmask);
}
もちろん、これはすべて綴られています。次のように 1 行で実行できます。
#DEFINE SETLEDSTATE(led,state) GPIOPinWrite(LEDConfig[led].address, ~(1<<LEDConfig[led].bit),(state<<LEDConfig[led].bit))
これは同じことを行いますが、ビットマスクを夢見ることができ、実際のプログラムをデバッグするためにいくつかの LED のみを切り替えたい場合にのみ意味があります...
代替案: ベアメタル。この場合、すべてを自分で設定する必要があります。組み込みシステムの場合、ピンの多重化と電源管理に注意する必要があります (メモリ コントローラーと CPU クロックが既にセットアップされていると仮定します)。
シリアル ポートの Rx または Tx ピンを使用して行うことはできません。そのためには、シリアル ポートの RTS または CTS ピンを制御するだけです。「VC++コードでCOMポートにアクセスする」をグーグルで検索し、RTSおよびCTSステータスピンを制御して、外部デバイスのオンとオフを切り替えます。