/

ファームウェア開発

ファームウェア開発に関する質問
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に固定されます。