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?
Jawaban:
Beberapa register hanya sah untuk lebar akses tertentu (misalnya, -w32 mungkin tidak benar), atau mungkin tidak membaca kembali nilai-nilai tertulis yang dapat menyebabkan masalah dengan verifikasi.
Mungkin juga ada urutan atau batasan negara dalam mengakses sesuatu.
Opsi yang harus mengatasi masalah yang paling mungkin adalah membuat program kecil untuk melakukan pekerjaan yang terkait dengan berjalan dalam RAM. Anda bisa mengganti data ke dalam binernya setelah mencari tahu offsetnya, mengunggah versi yang dimodifikasi, dan menjalankannya. Atau Anda bisa meminta program mendapatkan nilai dari wilayah RAM di luar luasan file, yang akan Anda atur sebelum dijalankan. Dengan kontrol stlink berbutir halus Anda juga bisa memberikan nilai dalam register CPU, meskipun Anda mungkin (?) Memerlukan program baris perintah open source alternatif daripada ST untuk melakukan itu (rutin kecil dalam metode RAM ini adalah kebetulan bagaimana program tersebut menyelesaikan penulisan untuk mem-flash)
sumber
Jadi, salah satu masalahnya adalah, seperti yang ditunjukkan Chris Stratton:
Ini berarti bahwa verifikasi gagal, menyebabkan kesalahan untuk ditampilkan, meskipun operasi penulisan sebenarnya berhasil.
Di bawah ini adalah respons yang saya dapatkan ketika membaca register PWR_ISR, mengatur bit INIT, lalu membaca kembali register:
Verifikasi Utilitas ST-LINK memeriksa apakah nilainya ditulis ke alamat dan dibaca dari alamat yang cocok. Dalam hal ini, operasi penulisan berhasil, meskipun kedua nilai tidak cocok, karena bit INIT sekarang ditetapkan.
Masalah lainnya adalah saya tidak bisa melihat efek operasi penulisan. Saat terhubung ke mikrokontroler, ia tetap dalam keadaan reset oleh ST-LINK (dikenal sebagai "connect under reset"). Saya perlu menggunakan opsi koneksi HOTPLUG, yang terhubung ke mikrokontroler tanpa berhenti atau reset.
File batch sepenuhnya berfungsi seperti yang saya inginkan! Perintahnya sekarang terlihat seperti ini:
sumber
Saya pikir apa yang terjadi adalah setelah penulisan, pembacaan verifikasi dilakukan. Jika register yang sama mengembalikan waktu saat ini dalam pembacaan, meskipun Anda berhasil memperbarui RTC, debugger tidak akan menyadari. Ini cenderung menjelaskan masalah dengan register daya (kecuali jika debugger mengakses register itu juga di bawah tenda). Periksa nilai baca secara manual. Jika ada masalah yang lebih signifikan, bacaan ini mungkin gagal juga. Juga, coba register lain dalam daftar Anda.
sumber