[[lbed/01-LEDチカチカ]]

[[lbed]]

#contents

2013/07/20からのアクセス回数 &counter;

** あると便利シリアルポート [#k15a8a54]
lbedは、LPCXpresso IDEのソースレベルのデバッグができるので、mbedよりもPCと
シリアルで接続する機会は少ないとは思うのですが、はやりあると便利なシリアル通信です。

*** 初心者もベテランもArduino IDEのシリアルコンソール [#l872b69d]
*** 初心者もベテランもArduino IDEのシリアルモニター[#l872b69d]
やはり、Arduinoは良く出来ており、組み込み機器とPCをつないで使うには、Arduino IDEの
シリアルモニターが便利です。

PCから文字を入力する場合には、トップのテキストフィールドに文字を入力し、送信ボタンを押します。
組み込み機器からの文字列は、その下のテキストエリアに表示されます。

&ref(SerialMonitor.png);


** テストプログラム [#j282de55]
シリアル通信を行うクラスは、Serialで残念ながらmbedのようなStreamに対応させることはできません
でした。

そこで、ArudinoのSerialを手本に作成しました。
Serialのインスタンスを生成後、baudメソッドでボーレイトを指定します。

最初にHelloと表示し、文字入力があれば+1した文字コードを送りし、ledを反転させる簡単なプログラムで動作を
確認しました。((文字出力がちょっと不安定です。))

#pre{{
#include<cr_section_macros.h>
#include<NXP/crp.h>
__CRP extern const unsigned int CRP_WORD = CRP_NO_CRP;

#include"lbed.h"

DigitalOut myled( LED1);

int main(void) {
     wait_init();
     Serial pc(p9, p10);
     pc.baud(9600);
     pc.println("Hello");
     while (1) {
          char c = pc.read();
          pc.write(c + 1);
          myled = !myled;
     }
     return 0;
}
}}

*** 動作確認 [#j7aad11e]
MyARMワークベンチにUSBシリアル変換を差して、PCに接続します。((MyARMの作成時にUSBコネクターのはんだに失敗して、上手くMyARM上でのUSBシリアル通信ができなかったので、別途USBシリアル変換器を購入しました(恥ずかしい)))

&ref(SerialSetting.png);


*** Serialの実装 [#had9d15b]
Serialは、トラ技の2012/10の特集を参考に作成しましたが、出力用のバッファを持っていないので、高速な通信は厳しいです。

#pre{{
#include "Serial.h"
#include "PinNames.h"
#include "LPC11xx.h"

Serial::Serial()
     : _tx(-1)
     , _rx(-1)
{
     setup(P1_6, P1_7, "default");
}

Serial::Serial(PinName tx, PinName rx, const char *name)
     : _tx(-1)
     , _rx(-1)
{
     setup(tx, rx, name);
}

void Serial::setup(PinName tx, PinName rx, const char *name)
{
     _tx = tx;
     _rx = rx;
     _available = false;
     LPC_IOCON->PIO1_6 |= 0x01;                                   // RXD機能に設定(FUNC=001)
     LPC_IOCON->PIO1_7 |= 0x01;                                   // TXD機能に設定(FUNC=001)
}

void Serial::baud(unsigned int baudrate) {
     unsigned int DL;
     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);                    // UARTへクロック供給
     LPC_SYSCON->UARTCLKDIV = 0x01;                              // ボーレート生成ブロックへクロック供給
     DL = (SystemCoreClock * LPC_SYSCON->SYSAHBCLKDIV)     // ボーレート分周比の算出
          / (16 * baudrate * LPC_SYSCON->UARTCLKDIV);
     LPC_UART->LCR |= (1<<7);                                   // ディバイザ・ラッチ・アクセス有効(DLAB=1)
     LPC_UART->DLM = DL / 256;                                   // ボーレートの設定(U0DLM)
     LPC_UART->DLL = DL % 256;                                   // ボーレートの設定(U0DLL)
     LPC_UART->LCR &= ~(1<<7);                                   // ディバイザ゙・ラッチ・アクセス無効(DLAB=0)
     LPC_UART->LCR = 0x03;                                        // データのフォーマット設定(8bit Non Stop 1)
     LPC_UART->FCR = 0x07;                                        // 入出力バッファの初期化
     _available = true;                                             // 利用可能にセット
}

void Serial::begin(unsigned int baudrate) {
     baud(baudrate);
}

int Serial::write(const char c) {
     while (!(LPC_UART->LSR & (1<<5)))                         // データ転送待ち
          continue;
     LPC_UART->THR = c;                                             // データ送信
     return 1;
}

int Serial::read() {
     while (!(LPC_UART->LSR & 0x01))                              // 受信待ち
          continue;
     return LPC_UART->RBR;                                        // データ受信
}

int Serial::available() {
     return _available ? 1 : 0;
}
}}

** コメント [#c81be729]
#vote(おもしろかった,そうでもない,わかりずらい)

皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc