私がやっていたこと
私は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レジスタへの書き込みを許可するための何らかの書き込み保護はありますか?