ST-LINKユーティリティを使用してRTCを現在の時刻に構成する


9

私がやっていたこと

私はSTM32マイクロコントローラーを使用しています。私のプロジェクトでは、1日の特定の時間(たとえば、午前11時と午後2時)にデータを送信できるようにする必要があります。マイクロコントローラは、これを実現する前に何時かを知る必要があります。残念ながら、私は一方向の通信しか持っていないため、ネットワークに現在の時刻を要求することはできません。

したがって、プログラミングが完了した直後に現在の時刻を設定したいと思います。次のコマンドを使用して、ST-LINKユーティリティのコマンドラインインターフェイス(ST-LINK_CLI)を使用してフラッシュにデータを書き込むことができることを知っていました。

ST-LINK_CLI.exe -w32 <Address> <data> -Rst

私は、現在コードで使用されていないアドレスにUnixタイムスタンプを書き込む簡単なテストスクリプトを作成しました。

タイムスタンプを読み取る関数を記述し、それを使用してRTC時間を設定しようとしていました。ST-LINKユーティリティユーザーマニュアルで以下を読むまで:

-w32は、フラッシュメモリ、OTP、SRAMおよびR / Wレジスタへの書き込みをサポートします。

マニュアルにR / Wレジスタへの書き込みがサポートされていると記載されている場合、これはRTCレジスタに直接アクセスして設定できることを意味しますか?試しましたが、これらのレジスタに書き込むことができません。

マイクロコントローラーで処理するために特定の関数を記述する必要がなくなるため、この方法を使用することをお勧めします。これは、コードを更新する必要がなく、現在使用しているすべてのマイクロコントローラーのRTC時間を設定できることを意味します。


私がやろうとしていたこと

RTCレジスタを設定するために、STMリファレンスマニュアルで説明されているように、次の手順を実行しようとしました。

  • PWR_CRレジスタのDPBビットを設定する
  • RTC_WPRレジスタに0xCAを書き込む
  • RTC_WPRレジスタに0x53を書き込む
  • RTC_ISRレジスタのINITビットを設定してRTCを停止する
  • RTC_PRERレジスタに書き込んで1Hzクロックを選択します
  • RTC_TRレジスタに書き込むことで現在時刻をロードする
  • RTC_DRレジスタに書き込むことで現在の日付をロードする
  • RTC_ISRレジスタのINITビットをリセットしてRTCを開始する

レジスターにアクセスするために、以下のアドレスを使用しました。

  • PWR_CR:0x4000 7000
  • RTC_WPR:0x4000 2824
  • RTC_ISR:0x4000 280C
  • RTC_PRER:0x4000 2810
  • RTC_TR:0x4000 2800
  • RTC_DR:0x4000 2804

何が悪かったのか

これらのレジスタのいずれにも書き込むことができません。ST-LINKユーティリティを使用すると、次のメッセージが表示されます。

メモリの書き込み中にエラーが発生しました!

ST-LINK_CLIの使用:

0x40007000に0x00000100を書き込んでいます...エラー!

これらのレジスタを読み取ることは問題ありませんが、ST-LINKユーティリティまたはそのコマンドラインインターフェイスを使用してそれらに書き込むことはできません。


質問

ST-LINKユーティリティを使用してR / Wレジスタに書き込む方法を教えてください。

私が見落としたRTCレジスタへの書き込みを許可するための何らかの書き込み保護はありますか?


キーコードが入力されない限り、おそらく書き込み保護されています。
Sparky256 2016年

最初のヒントから自分で多くのことを理解できたことをうれしく思います。一般的には、質問に対する編集ではなく、回答として解決策を投稿する必要があります。特に、自分自身でこれを追求した場合は、最終的に受け入れをそれに移すことが適切です。
Chris Stratton

私は実際にそのように考えたことはありません!私もあなたにいくつかのクレジットをお願いしますが、私はまだそうすべきだと思います。
Spectre208

プログラミング後、デバイスはどれくらいの期間実行する必要がありますか。また、時刻はどれくらい正確でなければなりませんか?RTCがどれほど正確であっても、少なくとも何年も使用されており、タイミング要件が厳しい場合、RTCは最終的に少しドリフトすることを心配しています。
Timo

単一のバッテリーで10年間動作することが想定されています。ただし、すべてのデバイスがデータを一度に送信しないように、時間スキームはすでにいくつかの乱数によってわずかに変更されています。したがって、RTC時間のずれは大きな問題ではありません。
Spectre208

回答:


4

一部のレジスタは、特定のアクセス幅に対してのみ有効です(つまり、-w32は正しくない可能性があります)。または、検証で問題を引き起こす可能性がある書き込まれた値を読み戻せない場合があります。

物事へのアクセスには、シーケンスまたは状態の制限がある場合もあります。

考えられるほとんどの問題を回避するオプションは、RAMで実行するようにリンクされるジョブを実行する小さなプログラムを作成することです。オフセットを計算した後、データをバイナリに置き換え、変更したバージョンをアップロードして実行できます。または、プログラムに、実行前に設定するファイルのエクステントの外にあるRAMの領域から値を取得させることもできます。stlinkをよりきめ細かく制御することで、CPUレジスタに値を渡すこともできますが、STではなく、代替のオープンソースコマンドラインプログラムが必要になる場合があります(RAMメソッドのこの小さなルーチンは、偶然にもそのプログラムが書き込みを行う方法です)点滅する)


3

したがって、問題の1つは、Chris Strattonが指摘したとおりです。

一部のレジスタは、書き込まれた値を読み戻さない場合があり、検証で問題が発生する可能性があります。

これは、書き込み操作が実際に成功したにもかかわらず、検証が失敗し、エラーが表示されることを意味しました。

以下は、PWR_ISRレジスタを読み取り、INITビットを設定して、レジスタを再度読み取ったときに受け取る応答です。

0x4000280C:00000027

0x4000280Cで0x00000080を書き込んでいます...エラー!

0x4000280C:000000A7

ST-LINKユーティリティの検証では、アドレスに書き込まれた値とアドレスから読み取られた値が一致するかどうかを確認します。この場合、INITビットが設定されているため、2つの値が一致しない場合でも、書き込み操作は成功しました。

もう1つの問題は、書き込み操作の影響に気付かなかったことです。マイクロコントローラに接続されている間、ST-LINKによってリセット状態に維持されます(「リセット中の接続」と呼ばれます)。HOTPLUG接続オプションを使用する必要がありました。これは、停止またはリセットせずにマイクロコントローラーに接続します。

「リセット下で接続」オプションを使用すると、命令を実行する前にターゲットに接続できます。これは、ターゲットにJTAG / SWDピンを無効にするコードが含まれている場合など、多くの場合に役立ちます。

「HotPlug」オプションを使用すると、停止またはリセットせずにターゲットに接続できます。これは、アプリケーションの実行中にRAMアドレスまたはIPレジスタを更新するのに役立ちます

バッチファイルは、思いどおりに完全に機能します。コマンドは次のようになります。

ST-LINK_CLI.exe -c HOTPLUG -w32 <Address> <data> -w32 <Address> <data> ...

1

何が起こっているのかと思いますが、書き込み後に検証読み取りが実行されます。同じレジスタが読み取りで現在時刻を返す場合、RTCの更新は成功しますが、デバッガは認識しません。これは、パワーレジスタの問題を説明する可能性が低くなります(デバッガが内部でそのレジスタにアクセスしている場合を除きます)。読み取った値を手動で確認してください。より重大な問題があった場合、この読み取りも失敗する可能性があります。また、リスト内の他のレジスタを試してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.