mbed Lチカはこうやって動く! mbedライブラリを解析してみた

Toshio Kuga/ 2月 7, 2016/ 電子工作/ 0 comments

mbed onlymbedはライブラリが充実していますよね。

mbedライブラリを解析することで
ドライバーの効率的な作成方法が習得できるかも。
ということで、解析したいと思います!

 

スポンサードリンク

mbedでLチカ

mbed対応ボードでLEDをチカチカ点灯(通称:Lチカ)させるためには
以下のようなコードを書くだけで終わりです。
こんなに簡単に実現できます。

詳細はこちらの記事で解説しています。
[nlink url=”http://g-action.gack2u.com/mbed-blink_led/”]

 

ハードウェア

mbed LPC1768純正ボードのピン配置はこんな感じになっております。
そして、ボードの中央に実装されているデバイスが
NXP社のCPU LPC1768でございます。

 

mbed_board
CPU LPC1768のピン配置はこのようになっています。
ラベルは上図のラベルと同じです。

CPUから出てきているピンのいくつかは
ボード上のピンに出てきていないことが分かりますね。

上記サンプルコード中で点灯させているLED1は32番ピンに接続されていますね。
ピンファンクション名はP1[18]となっています。

lpc1768_pin_layout出典:LPC1768 Pinout with labelled mbed Pins

回路図を見ると、LEDに接続されていることが分かります。
このピンから0を出力すると、LEDに3.3Vの電位が発生して点灯するはずですね。

schematic出典:LPC1768 回路図

 

ソフトウェア

ピンを制御するためには、CPUのレジスタにアクセスする必要があります。
確認となりますが、LED1を点灯させるために制御するピンは32番 P1_18です。

 

ピンの選択

マルチファンクションピンは、まずピン機能の選択をする必要があります。

LPC176x/5x User manual 8.5 Register description を見ると
ピンはグループで管理されているようです。

P1_18はP1の上位グループに属していますので、PINSEL3を設定します。

グループ レジスタ アドレス
P0[15:0] PINSEL0 0x4002C000
P0[31:16] PINSEL1 0x4002C004
P1[15:0] PINSEL2 0x4002C008
P1[31:16] PINSEL3 0x4002C00C
P2[15:0] PINSEL4 0x4002C010
P2[31:16] PINSEL5 0x4002C014
P3[15:0] PINSEL6 0x4002C018
P3[31:16] PINSEL7 0x4002C01C
P4[15:0] PINSEL8 0x4002C020
P4[31:16] PINSEL9 0x4002C024
Trace port enable PINSEL10 0x4002C028

 

 

Pin function select register PINSELx

マルチファンクションピンの選択を行います。

32ビットのレジスタで2ビットで1ピンの設定に対応しています。

0 主要機能 通常GPIO
1 1つ目の代替機能
2 2つ目の代替機能
3 3つ目の代替機能

 

マルチファンクションについてはマニュアルに記載されています。
P1_18は、以下の通りです。
代替機能1のUSB_UP_LEDを設定する必要があります。
P1_18

出典:LPC176x/5x User manual

 

ピンの制御

LPC176x/5x User manual 9.5 Register description を見ると
ピンはグループで管理されているようです。

P1_18はP1グループに属しています。

グループ 入出力(FIOxDIR) High設定(FIOxSET) Low設定(FIOxCLR) アクセス可否(FIOxMASK) ピン設定参照(FIOxPIN)
P0 0x2009C000 0x2009C018 0x2009C01C 0x2009C010 0x2009C014
P1 0x2009C020 0x2009C038 0x2009C03C 0x2009C030 0x2009C034
P2 0x2009C040 0x2009C058 0x2009C05C 0x2009C050 0x2009C054
P3 0x2009C060 0x2009C078 0x2009C07C 0x2009C070 0x2009C074
P4 0x2009C080 0x2009C098 0x2009C09C 0x2009C090 0x2009C094

 

GPIO port Direction register FIOxDIR

GPIOの入出力方向を設定します。

32ビットのレジスタで各ビットと各1ピンが対応しています。
P1_18を出力にしたい場合は、18ビットを1にすればいいですね。

0 ピンを入力に設定
1 ピンを出力に設定

 

GPIO port output Set register FIOxSET

GPIO出力ピンにHighレベルをアサートします。

32ビットのレジスタで各ビットと各1ピンが対応しています。
P1_18を0に出力にしたいので、このレジスタは触らなくて良さそうです。

0 変更なし
1 Higレベルをアサート

 

GPIO port output Clear register FIOxCLR

GPIO出力ピンにLowレベルをアサートします。

32ビットのレジスタで各ビットと各1ピンが対応しています。
P1_18を0に出力にしたいので、18ビットを1にすればいいですね。

0 変更なし
1 Lowレベルをアサート

 

GPIO port Pin value register FIOxPIN

GPIOのピン設定およびピンの値参照を行います。
※アナログ値の参照はできません。

32ビットのレジスタで各ビットと各1ピンが対応しています。
P1_18を0に出力にしたいので、18ビットを0にすればいいですね。
その場合はFIOxCLRレジスタの設定は不要です。

0 Lowレベルをアサート
1 Highレベルをアサート

 

GPIO port Mask register FIOxMASK

 

GPIOのピン設定およびピンの値参照を行います。
レジスタを読むとピンの値を参照できます。
※アナログ値の参照はできません。

32ビットのレジスタで各ビットと各1ピンが対応しています。
P1_18を0に出力にしたいので、18ビットは1にしておく必要がありますね。

0 書き込みをマスクしないので、当該ビットの書き込みが行われます。
1 書き込みをマスクし、当該ビットの書き込みが無視されます。

 

ライブラリ

ハードウェアでの制御方法が分かりました。
ライブラリではどのように実装されているか確認します。

 

設計概要

ライブラリは以下のように実装依存部分と非依存部分に分かれています。
さらに、そこからレイヤーに分かれています。

mbed-library

出典:mbed Notebook – mbed ライブラリ内部構造

 

DigitalOutクラス

LED(GPIO)の制御はDigitalOutクラスを使用します。

 

コンストラクタ

クラスオブジェクトのインスタンスは以下のように行います。

コンストラクタ処理の引数には下図の色が付いているラベル名称が指定できます。

lpc1768_pin_layout
ラベル名称とピンファンクションがPinName.h(mbed HAL implementationレイヤー)で定義されています。

 

コンストラクタ内では、DigitalOutクラスのメンバー変数であるgpioに保存されます。
・PINSELx:主要機能に設定。
・PINMODEx:
・FIOxDIR:出力
・FIOxMASK:マスク設定
・FIOxSET:アドレスのみ設定
・FIOxCLR:アドレスのみ設定
・FIOxPIN:アドレスのみ設定

この処理は、コンストラクタからコールされるmbed commonレイヤーの処理です。
固有処理は、mbed HAL implementationレイヤーのgpio_xxxxという処理を呼び出すようにしています。

 

 

ピン名称とレジスタアドレスはLPC17xx.h(CMSIS-COREレイヤー)で定義されています。

 

出力

出力は以下のように行います。

 

オペレータのオーバーロードをおこなっており
mbed APIのwriteがコールされるようになっています。

 

mbed APIから直接、mbed HAL implementationレイヤーが呼び出されています。
こういうのはいいんですかね。

 

くがとしお 的まとめ

本来ならば、色々設定が必要なんですが、
ライブラリが抽象化していることが分かりました。

実装部分と非実装部分にレイヤーを分けて
実装する方法はスマートですね。

参考にしたいと思います。

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">
*
*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)