- 追加された行はこの色です。
- 削除された行はこの色です。
[[lbed/01-LEDチカチカ]]
[[lbed]]
#contents
2013/07/20からのアクセス回数 &counter;
** あると便利シリアルポート [#k15a8a54]
lbedは、LPCXpresso IDEのソースレベルのデバッグができるので、mbedよりもPCと
シリアルで接続する機会は少ないとは思うのですが、はやりあると便利なシリアル通信です。
*** 初心者もベテランも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