Bisakah program memori flash mikrokontroler digunakan untuk menyimpan konfigurasi pengguna?

9

Banyak mikrokontroler, misalnya PIC18F , memiliki memori program flash: "Memori program Flash dapat dibaca dan ditulis selama operasi normal". Apakah ini berarti saya dapat menyimpan beberapa konfigurasi pengguna dalam memori program?

siswa1
sumber

Jawaban:

12

Ya kamu bisa. Saya telah melakukan ini berkali-kali.

Namun, ada beberapa kelemahan relatif untuk menggunakan EEPROM terpisah:

  1. Jumlah seumur hidup menulis ke memori program flash secara signifikan kurang dari data EEPROM.

  2. Prosesor akan pergi makan siang selama waktu menghapus dan menulis.

  3. Program flash terhapus dalam blok. Anda tidak bisa hanya memperbarui satu byte. Saya biasanya menggunakan skema caching blok untuk menangani ini.

Olin Lathrop
sumber
Sempurna, Anda tampaknya entah bagaimana tahu bahwa pertanyaan saya benar-benar "mengapa perlunya EEPROM sementara Anda dapat menggunakan memori program untuk data program dan pengguna" :)
student1
Olin, apakah semua Flash terhapus ketika firmware versi baru dibakar ke dalam PIC? Apakah ada cara yang baik untuk mencegah konfigurasi pengguna (atau data kalibrasi) di Flash terhapus selama unduhan firmware? Ini tentang kenyamanan selama pengembangan firmware. Saya akan membayangkan bahwa konfigurasi pengguna akan disimpan di blok terakhir atau Flash.
Nick Alexeev
6
@Nick: Terserah programmer PIC yang Anda gunakan. Banyak, termasuk semua milik saya, melakukan penghapusan massal, sehingga data kalibrasi akan terhapus. Saya beberapa kali menulis aplikasi pemrograman khusus yang membaca data kalibrasi, menghapus sebagian besar, kemudian menulis data kalibrasi kembali sebagai bagian dari proses pemrograman normal. Beberapa pemrogram Microchip mungkin hanya dapat memperbarui sebagian memori program. Perhatikan bahwa jika Anda mengaktifkan perlindungan kode, programmer harus melakukan penghapusan massal.
Olin Lathrop
Pada prosesor non-Harvard (saya sedang memikirkan MSP430), Anda dapat menyalin kode ke dalam RAM, dan melompat ke dalam RAM dan menjalankannya saat penulisan / hapus flash berlangsung. Saya menggunakan ini untuk bootloader, untuk secara bersamaan menulis dan menerima data baru dari radio.
markrages
@mark: Ya, ini juga berfungsi pada PIC32, di mana dimungkinkan untuk dijalankan dari RAM. Bahkan, itu lebih cepat.
Olin Lathrop
6

Banyak PIC18 memiliki memori EEPROM, hingga 1K. Sayangnya PIC18F46J50 referensi Anda tidak. Jika EEPROM tersedia, itu adalah pilihan yang jauh lebih baik jika cukup besar untuk data Anda, karena EEPROM memiliki minimal 1.000.000 siklus hapus / tulis, dan flash hanya 10.000.

PIC18, seperti kebanyakan mikrokontroler lainnya, menggunakan apa yang disebut arsitektur Harvard, yang berarti ada area yang dapat dialamatkan secara terpisah untuk program dan data (yaitu Anda dapat memiliki alamat program 4 dan alamat data 4, dan mereka tidak sama). Karenanya Anda tidak dapat membaca atau menulis memori flash menggunakan metode normal dalam bahasa C atau bahasa assembly.

Sebagai gantinya, pada keluarga PIC18, Anda mengatur alamat awal dalam register 22-bit yang disebut TBLPTR. Untuk membaca byte dari flash, Anda menggunakan instruksi TBLRD. Ada opsi untuk menambah atau mengurangi alamat secara otomatis setelah membaca, Anda tidak harus melakukannya secara manual.

Untuk menulis ke memori flash, Anda harus menghapus satu atau lebih blok 64-byte memori flash terlebih dahulu yang akan ditulis ulang. Setelah mengatur alamat awal lagi di TBLPTR, dan nilai di beberapa register lain untuk menginisialisasi operasi hapus, interupsi dinonaktifkan dan kemudian Anda harus menulis 0x55 segera diikuti oleh 0xAA ke register; ini membuka kunci perintah hapus dan diperlukan untuk mencegah kode yang salah dari kehabisan memori secara tidak sengaja. Akhirnya perintah untuk benar-benar melakukan penghapusan dijalankan, diikuti dengan mengaktifkan kembali interupsi.

Menulis ke memori flash mirip dengan menghapus, kecuali ukuran blok lebih kecil. Tulisan sebenarnya dieksekusi menggunakan instruksi TBLWT, yang juga memungkinkan kenaikan / penurunan otomatis seperti instruksi TBLRD.

Selain menghemat data konfigurasi, menulis ke memori flash memungkinkan seseorang untuk memperbarui firmware mereka di lapangan menggunakan apa yang disebut "firmware over the air". Anda harus memiliki blok firmware tetap, biasanya di awal memori program, yang dapat menerima pembaruan dari modul Bluetooth, Wi-Fi, modul seluler, atau bahkan koneksi kabel, dan memperbarui flash di atas titik tertentu dalam program (misalnya "pagar") dengan kode baru. Setelah pembaruan selesai, reset dimulai, dan kode baru mulai digunakan.

Banyak mikrokontroler lain selain keluarga PIC memiliki kemampuan untuk memperbarui memori flash mereka; sebagian besar menggunakan beberapa kombinasi register konfigurasi, penunjuk alamat, dan instruksi khusus untuk melaksanakan tugas.

tcrosley
sumber
Metode "firmware over the air" terlihat sangat menarik. Apakah itu menghilangkan kebutuhan untuk Pemrograman Dalam Sistem (ISP)?
pelajar1
@ student1 Ini tidak menghilangkan kebutuhan pemrograman awal chip melalui antarmuka ISP, karena Anda harus meletakkan beberapa firmware pada chip untuk dapat menangani pembaruan nanti. Mikrokontroler ATmega yang digunakan pada papan Arduino sudah memiliki jenis firmware ini, yang disebut Bootloader, itulah sebabnya Anda tidak perlu menggunakan antarmuka ISP untuk mengunduh sketsa ke Arduino. Namun jika Anda ingin memperbarui Bootloader itu sendiri, itu memang membutuhkan antarmuka ISP. Bootloader ini hanya menangani pembaruan melalui USB, jadi ini bukan "firmware over the air".
tcrosley