Menggunakan Utilitas ST-LINK untuk mengkonfigurasi RTC ke waktu sekarang

9

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?

Spectre208
sumber
Kemungkinan terproteksi kecuali kode kunci dimasukkan.
Sparky256
Senang melihat Anda telah menemukan banyak hal dari petunjuk awal. Secara umum Anda harus memposting solusi sebagai jawaban daripada mengedit pertanyaan, dan terutama ketika Anda sudah melakukannya sejauh ini sendiri, akan lebih baik untuk akhirnya memindahkan penerimaan Anda ke sana.
Chris Stratton
Sebenarnya saya belum memikirkannya seperti itu! Saya merasa saya harus tetap melakukannya, meskipun saya ingin Anda memiliki beberapa kredit juga.
Spectre208
Berapa lama setelah pemrograman perangkat Anda harus berjalan, dan seberapa akurat waktu hari itu seharusnya? Saya hanya khawatir bahwa betapapun akuratnya RTC Anda, akhirnya akan sedikit melayang, setidaknya jika digunakan selama bertahun-tahun dan persyaratan waktu Anda sangat ketat.
Timo
Seharusnya berjalan selama 10 tahun dengan baterai tunggal .. Namun, skema waktu sudah sedikit dimodifikasi oleh beberapa nomor acak untuk mencegah semua perangkat mengirim data mereka sekaligus. Oleh karena itu penyimpangan waktu RTC bukan masalah besar.
Spectre208

Jawaban:

4

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)

Chris Stratton
sumber
3

Jadi, salah satu masalahnya adalah, seperti yang ditunjukkan Chris Stratton:

Beberapa register .. mungkin tidak membaca kembali nilai tertulis yang dapat menyebabkan masalah dengan verifikasi.

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:

0x4000280C: 00000027

Menulis 0x00000080 pada 0x4000280C ... Kesalahan!

0x4000280C: 000000A7

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.

Opsi "connect under reset" memungkinkan untuk terhubung ke target sebelum menjalankan instruksi apa pun. Ini berguna dalam banyak kasus seperti ketika target berisi kode yang menonaktifkan pin JTAG / SWD.

Opsi "HotPlug" memungkinkan untuk terhubung ke target tanpa berhenti atau reset. Ini berguna untuk memperbarui alamat RAM atau register IP saat aplikasi sedang berjalan

File batch sepenuhnya berfungsi seperti yang saya inginkan! Perintahnya sekarang terlihat seperti ini:

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

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.

Sean Houlihane
sumber