2

序文: これはすべて、ST-Link を使用してターゲットに接続され、IAR Embedded Workbench IDE のデバッグ モードで評価されます。

STM32F1 のリアルタイム クロックは、STM が提供する標準ペリフェラル ライブラリでサポートされています。RTC_SetCounter() を使用して、RTC を 107301722、つまり「2013 年 5 月 26 日 22:02:02 GMT」に設定しようとしています。

void RTC_SetCounter(uint32_t CounterValue) /*From Std Periph Lib */
{ 
  RTC_EnterConfigMode();
  /* Set RTC COUNTER MSB word */
  RTC->CNTH = CounterValue >> 16;
  /* Set RTC COUNTER LSB word */
  RTC->CNTL = (CounterValue & RTC_LSB_MASK);
  RTC_ExitConfigMode();
}

RTC レジスタ値を変更するための要件である RTC_EnterConfigMode() を呼び出すことに注意してください。 "

void RTC_EnterConfigMode(void) /*From Std Periph Lib */
{
  /* Set the CNF flag to enter in the Configuration Mode */
  RTC->CRL |= RTC_CRL_CNF;
}

これは、構成モードに入るコードです。十分に単純です。そして、これが逆アセンブリです (最適化は有効になっていません)。0x10 は CNF フラグのビット位置です。

//  RTC->CRL |= RTC_CRL_CNF;
RTC_EnterConfigMode:
    0x8053ed6: 0x4829         LDR.N     R0, ??DataTable13_1     ; RTC_CRL
    0x8053ed8: 0x8800         LDRH      R0, [R0]
    0x8053eda: 0xf050 0x0010  ORRS.W    R0, R0, #16             ; 0x10
    0x8053ede: 0x4927         LDR.N     R1, ??DataTable13_1     ; RTC_CRL
    0x8053ee0: 0x8008         STRH      R0, [R1]
//}
    0x8053ee2: 0x4770         BX        LR

私が見つけたのは、RTC_SetCounter() の呼び出しから行 0x8053ee0 の逆アセンブリまでのどこかで中断すると、構成モードが有効になりますが、行 0x8053ee2 以降の逆アセンブリにブレークポイントを移動すると、構成モードが設定されないことです。であるため、RTC は設定されません。

私が目指していることの一部は、時間の設定を伴う単体テストであるため、デバッグ以外の設定で何が起こるかを分析しようとする領域では何も試していません。単体テストには、デバッガーのアタッチが必要です。

これは厳密にはデバッガの問題ですか? 実行可能な解決策につながる可能性のあるこの動作を説明する合理的な理由はありますか?

4

1 に答える 1