セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2024-11-14 現在

ファームウェア開発

ファームウェア開発に関する質問
    MWSDK (C) や MWX (C++) を使用したファームウェア開発に関する質問をまとめています。

    テクニック

    UARTの受信を1バイト単位ではなく、連続して行うには?

    複数バイトの読み取りは Serial >> によって行えますが、1バイトずつ読み出すことを推奨いたします。

    UART の規格は物理層を対象としており、データの区切りは規定しません。例えばセンサIC等であれば、先頭のヘッダや末尾のフッタ等によって、出力するデータへ区切りを設けているはずです。

    データの区切りを適切に処理するためには、次のようにして1バイトずつ読み出し、状態遷移を行う必要があります。

    void loop() {
      uint8_t c;
      while(Serial.available()) {
        Serial >> c;
        // または c = Serial.read();
    
        switch(c) { ... }  // cの値によって処理を分岐する
      }
    }

    全般

    内蔵ウォッチドッグタイマの時間間隔は?変更するには?

    内蔵 WDT の操作は、半導体メーカの低層インタフェースから直接行う必要があります。

    詳細は半導体メーカが提供する資料(JN516x Integrated Peripherals API User Guide)の P95 をご覧ください。

    • 時間は vAHI_WatchdogStart() の引数から設定します(同資料P308)
    • 停止するには vAHI_WatchdogStop() を呼び出します(同資料P309)
    • Restart するには vAHI_WatchdogRestart() を呼び出します(同資料P310)

    なお、初期状態の TWENET システムが vAHI_WatchdogStart() へ与える引数 u8Prescale の値は、10としています(非公開コード)。 したがって、ユーザコードで vAHI_WatchdogStart() を呼び出していない場合の設定時間は (2^(10-1)+1)*8 = 4104 ms = 約4.1秒 であるものと考えられます。

    MWX

    Analogue

    スリープ復帰後にADCの周波数が1kHzに戻ってしまうことを防ぐには?

    ADCのタイマデバイスにE_AHI_DEVICE_TIMER0等を指定している場合は、スリープ復帰後にAnalogue.setup()を呼び出すことで、もう一度初期化してください。スリープ復帰後の既定の状態では、E_AHI_DEVICE_TICK_TIMERを指定しているため、1kHzに固定されます。