RTCbソフトウェアリセットについて

CPU:RX210

tool:PDG Ver2.09 (RPDL RX210_library_little.lib 2014/4/16 14:38:10)

Power ON では起動途中でプログラムが途中で止まり、reset では滞りなく起動するという現象が発生しました。

途中で止まっている個所が関数 R_PG_RTC_Start であることが分かりましたので

RPDL のソースコードをリンクして、さらに追いかけると関数 R_RTC_Create の中の

/* Reset the RTC */
RTC.RCR2.BIT.RESET = 1;
/* Wait for the reset to complete */
while (RTC.RCR2.BIT.RESET != 0);

while ループが抜けてこないことが判明しました。

基板によって動作が異なるのでハードウェアによるものと考えたのですが

FITの動作が知りたかったので、サンプルを作り動作を確認したところ現象は発生しませんでした。

FITとRPDLとのソースコードを見比べました。

FIT の関数 rtc_init にはソフトウェアリセットを実行する前に以下のコードが入っていました。

/* Disable RTC interrupts */
RTC.RCR1.BYTE = 0x00u;
while (0x00u != RTC.RCR1.BYTE)
{
    /* Confirm that it has changed */
    nop();
}

そこでこの部分だけ取り出して、関数 R_PG_RTC_Start の前に入れたところ現象が発生しなくなりました。

このような現象が発生したことはありますでしょうか。

Parents
  • わわいです。
    RXに限らず、RTCというのはCPUリセットがかかろうが、CPUが動いてなかろーが、あまつさえ、電源が切断されているときでさえ動き続けるように作られてますので、一般的な周辺デバイスとはちと考え方を変える必要があります
    電源投入時のCPUリセット時も、場合によってはRTCのリセットをしてはいけない場合もあったりします。
    ということで、電源投入直後といえども、RTCのカウント回路やら割り込み回路やらアラームなども、動いている、という前提で各種初期化を実行する必要があります。

    ということで、おそらく、RTCで割込がペンディングの状態になっていてソフトウエアリセットが完了しなかったものと推察されます。んで、この対策としては、ソフトリセットをかける前に、割り込みのディセーブルを実行する必要がある、ということではないかと思われます。
Reply
  • わわいです。
    RXに限らず、RTCというのはCPUリセットがかかろうが、CPUが動いてなかろーが、あまつさえ、電源が切断されているときでさえ動き続けるように作られてますので、一般的な周辺デバイスとはちと考え方を変える必要があります
    電源投入時のCPUリセット時も、場合によってはRTCのリセットをしてはいけない場合もあったりします。
    ということで、電源投入直後といえども、RTCのカウント回路やら割り込み回路やらアラームなども、動いている、という前提で各種初期化を実行する必要があります。

    ということで、おそらく、RTCで割込がペンディングの状態になっていてソフトウエアリセットが完了しなかったものと推察されます。んで、この対策としては、ソフトリセットをかける前に、割り込みのディセーブルを実行する必要がある、ということではないかと思われます。
Children
No Data