9 years, 2 months ago.

USB以外のシリアル通信について

mbed LPC824 の dp11(TX) と dp12(RX) を通してシリアル送受信しようとしましたが通信できません。 dp11 をオシロで見てみましたがまったくデータが出ていません。 プログラムは下記のようにしており、LEDは正常に点滅しているのですが。 どうしてでしょうか?(Switch Matrix が正常に設定されていない?)

Serial with dp11 and dp12

DigitalOut myled( dp15 );
Serial mSerial( dp11, dp12 ); 

int main() {
   mSerial.baud( 9600 );
   mSerial.format( 8, Serial::None, 1 );
    
    while(1) {
        mSerial.printf( "On\n" );
        myled = 1;
        wait(0.5);

        mSerial.printf( "Off\n" );
        myled = 0;
        wait(0.5);
    }
}

Question relating to:

The Switch Science mbed LPC824 operates at CPU frequencies of 30 MHz. The LPC824 includes up to 32 kB of flash memory, up to 8 kB of data memory, four …

1 Answer

9 years ago.

高橋さん、こんばんは。

私の方でも現象が再現しました。調べてみたところ、LPC824 HALの serial_api.c の format() 関数内で、CFGレジスタのイネーブルビットを上書き処理していました。そのため、ユーザコードから Serial::format() 関数が呼び出されると、該当するシリアルポートがdisableされるようになっていました。

mbed SDK 側は、テストを行った後に修正版の pull request を出します。

修正が反映されるまでの回避策としては、format()関数を使用しないか、または以下のように format() 関数を呼び出した後に、CFGレジスタ内のENビットを有効にすることで動作可能になります。

#include "mbed.h"

DigitalOut myled( dp15 );
Serial mSerial( dp11, dp12 );

int main()
{
    mSerial.baud( 9600 );
    mSerial.format(8, SerialBase::None, 1 );
    LPC_USART0->CFG |= 1; // Enable USART0

    while(1) {
        mSerial.printf( "On\n" );
        myled = 1;
        wait(0.5);

        mSerial.printf( "Off\n" );
        myled = 0;
        wait(0.5);
    }
}

以上、宜しくお願いします。

学习了

posted by Andy Zhao 08 Jan 2016