Apa yang saya lakukan
Saya menggunakan mikrokontroler STM32 dan untuk proyek saya, saya harus dapat mengirim data pada waktu tertentu dalam sehari (katakanlah, jam 11 pagi dan 2 siang). Mikrokontroler perlu tahu jam berapa sebelum saya bisa mencapainya. Sayangnya, saya hanya memiliki komunikasi satu arah, dan karena itu saya tidak dapat meminta waktu saat ini dari jaringan.
Karena itu saya ingin mengatur waktu sekarang, langsung setelah saya selesai pemrograman. Saya tahu saya dapat menulis data ke flash menggunakan ST-LINK Utility Command Interface Interface (ST-LINK_CLI) menggunakan perintah berikut:
ST-LINK_CLI.exe -w32 <Address> <data> -Rst
Saya menulis skrip pengujian sederhana yang menulis cap waktu Unix ke beberapa alamat yang saat ini tidak digunakan oleh kode.
Saya akan menulis fungsi untuk membaca cap waktu dan menggunakannya untuk mengatur waktu RTC. Sampai saya membaca yang berikut ini di Manual Pengguna ST-LINK Utility :
-w32 mendukung penulisan ke memori Flash, OTP, SRAM dan register R / W.
Ketika manual mengatakan ini mendukung penulisan ke register R / W, apakah ini berarti saya dapat langsung mengakses register RTC dan mengaturnya? Saya sudah mencoba, tetapi sepertinya saya tidak bisa menulis ke register ini.
Saya lebih suka menggunakan metode ini jika berhasil, karena saya tidak perlu menulis fungsi khusus untuk menanganinya di mikrokontroler lagi. Ini berarti bahwa saya dapat mengatur waktu RTC dari setiap mikrokontroler yang saat ini kami gunakan, alih-alih perlu memperbarui kode mereka.
Apa yang ingin saya lakukan
Untuk mengatur register RTC, saya mencoba melakukan langkah-langkah berikut, seperti yang dijelaskan dalam Manual Referensi STM :
- atur bit DPB dalam register PWR_CR
- tulis 0xCA ke register RTC_WPR
- tulis 0x53 ke register RTC_WPR
- hentikan RTC dengan mengatur bit INIT dalam register RTC_ISR
- pilih jam 1Hz dengan menulis ke register RTC_PRER
- memuat waktu saat ini dengan menulis ke register RTC_TR
- memuat tanggal saat ini dengan menulis ke register RTC_DR
- mulai RTC dengan mengatur ulang bit INIT di register RTC_ISR
Untuk mengakses register, saya telah menggunakan alamat berikut:
- PWR_CR: 0x4000 7000
- RTC_WPR: 0x4000 2824
- RTC_ISR: 0x4000 280C
- RTC_PRER: 0x4000 2810
- RTC_TR: 0x4000 2800
- RTC_DR: 0x4000 2804
Apa yang salah
Saya tidak dapat menulis ke salah satu register ini. Dengan ST-LINK Utility, saya mendapatkan pesan berikut:
Kesalahan terjadi selama penulisan memori!
Menggunakan ST-LINK_CLI:
Menulis 0x00000100 pada 0x40007000 ... Kesalahan!
Membaca register ini tidak ada masalah, tapi saya tidak bisa menulis kepada mereka menggunakan ST-LINK Utility atau Command Line Interface-nya.
Pertanyaan
Bagaimana saya bisa menulis ke register R / W menggunakan Utilitas ST-LINK?
Apakah ada semacam perlindungan penulisan untuk memungkinkan penulisan ke register RTC yang saya abaikan?