Mikrodenetleyici programı flash belleği kullanıcı yapılandırmasını saklamak için kullanılabilir mi?


9

PIC18F gibi birçok mikrodenetleyicide flash program belleği vardır: "Flash program belleği normal çalışma sırasında okunabilir ve yazılabilir". Bu, bazı kullanıcı yapılandırmalarını program belleğinde saklayabileceğim anlamına mı geliyor?

Yanıtlar:


12

Evet yapabilirsin. Bunu birçok kez yaptım.

Ancak, ayrı bir EEPROM kullanmanın bazı dezavantajları vardır:

  1. Program flash belleğine ömür boyu yazma sayısı, veri EEPROM'undan önemli ölçüde daha azdır.

  2. İşlemci silme ve yazma zamanlarında öğle yemeğine çıkacaktır.

  3. Program flaşı bloklar halinde silinir. Tek bir baytı güncelleyemezsiniz. Bununla başa çıkmak için genellikle bir blok önbellek şeması kullanırım.


Mükemmel, bir şekilde sorumun gerçekten "program ve kullanıcı verileri için program belleğini kullanırken neden EEPROM ihtiyacı" olduğunu biliyor gibi görünüyor :) :)
student1

Olin, yeni bellenim sürümü PIC'ye yazıldığında tüm Flash siliniyor mu? Ürün yazılımı indirilirken Flash'taki kullanıcı yapılandırmasının (veya kalibrasyon verilerinin) silinmesini önlemenin iyi bir yolu var mı? Bu, yazılım geliştirme sırasında kolaylık sağlamakla ilgilidir. Kullanıcı yapılandırmasının en son blokta veya Flash'ta saklanacağını hayal ediyorum.
Nick Alexeev

6
@Nick: Bu, kullandığınız PIC programlayıcısına bağlıdır. Hepsi de dahil olmak üzere birçoğu toplu silme yapıyor, böylece kalibrasyon verileri silinecek. Birkaç kez kalibrasyon verilerini okuyan, toplu silme işlemini gerçekleştiren özel bir programlama uygulaması yazdım, sonra kalibrasyon verilerini normal programlama sürecinin bir parçası olarak geri yazdım. Mikroçip programcılarının bazıları program belleğinin yalnızca bir kısmını güncelleyebilir. Kod korumasını açtıysanız, programcının toplu bir silme işlemi yapması gerektiğini unutmayın.
Olin Lathrop

Harvard olmayan işlemcilerde (MSP430'u düşünüyorum) kodu RAM'e kopyalayabilir ve RAM'e atlayabilir ve flash yazma / silme işlemi gerçekleşirken çalışabilirsiniz. Bunu aynı anda bir radyodan yeni veri yazmak ve almak için bir bootloader için kullandım.
markrages

@mark: Evet, bu aynı zamanda RAM'den yürütmenin de mümkün olduğu PIC32'de çalışır. Aslında, bu daha hızlı.
Olin Lathrop

6

Birçok PIC18, 1K boyuta kadar EEPROM belleğe sahiptir. Ne yazık ki referans verdiğiniz PIC18F46J50 desteklemiyor. EEPROM mevcutsa, verileriniz için yeterince büyükse, EEPROM en az 1.000.000 silme / yazma döngüsüne sahip olduğundan ve flaş sadece 10.000 olduğundan daha iyi bir seçimdir.

PIC18, diğer birçok mikrodenetleyici gibi, Harvard mimarisi olarak adlandırılan şeyi kullanır, yani programlar ve veriler için fiziksel olarak ayrı adreslenebilir alan vardır (yani bir program adresi 4 ve veri adresi 4 olabilir ve bunlar aynı değildir). Bu nedenle, C veya montaj dilinde normal yöntemleri kullanarak flash belleği okuyamaz veya yazamazsınız.

Bunun yerine, PIC18 ailesinde, TBLPTR adlı 22 bitlik bir kayıtta bir başlangıç ​​adresi ayarladınız. Flaştaki baytları okumak için bir TBLRD talimatı kullanırsınız. Manuel olarak yapmak zorunda olmadığınız bir okumadan sonra adresi otomatik olarak arttırma veya azaltma seçeneği vardır.

Flash belleğe yazmak için, önce yazılacak bir veya daha fazla 64 baytlık flash bellek bloğunu silmeniz gerekir. TBLPTR'de başlangıç ​​adresini yeniden ayarladıktan ve silme işlemini başlatmak için diğer bazı kayıtlardaki değerler kesildikten sonra devre dışı bırakılır ve bir kayıt defterine hemen 0x55 ve ardından 0xAA yazmanız gerekir; bu silme komutunun kilidini açar ve hatalı kodun yanlışlıkla belleği silmesini önlemek için gereklidir. Son olarak, silme işlemini gerçekten yapmak için komut yürütülür ve ardından kesmeleri yeniden etkinleştirir.

Flash belleğe yazmak, blok boyutu daha küçük olması dışında silme işlemine benzer. Yazma aslında bir TBLWT talimatı kullanılarak yürütülür, bu da TBLRD talimatı gibi otomatik artış / azalmaya izin verir.

Konfigürasyon verilerini kaydetmenin yanı sıra, flash belleğe yazmak kişinin "bellenim üzerinden bellenim" adı verilen alanı kullanarak bellenimini güncellemesine olanak tanır. Genellikle program belleğinin başlangıcında, Bluetooth modülünden, Wi-Fi'den, hücresel modülden veya hatta kablolu bağlantıdan güncelleme alabilen ve flaşı belirli bir noktanın üzerinde güncelleyebilen sabit bir ürün yazılımı bloğuna ihtiyacınız vardır. yeni kod ile program (örneğin, bir "çit"). Güncelleme tamamlandıktan sonra, sıfırlama işlemi başlatılır ve yeni kod kullanıma alınır.

PIC ailesinin yanı sıra diğer birçok mikrodenetleyici flash belleklerini güncelleme yeteneğine sahiptir; çoğu yapılandırma yapmak için bazı yapılandırma kayıtlarının bir kombinasyonunu, bir adres işaretçisini ve özel talimatları kullanır.


Bu "havadan yazılım" yöntemi çok ilginç görünüyor. Sistem İçi Programlama (İSS) ihtiyacını ortadan kaldırıyor mu?
student1

@ student1 Bir ISP arayüzü üzerinden çipin ilk programlanması gereğini ortadan kaldırmaz, çünkü daha sonra güncellemeleri işlemek için çipin üzerine bazı bellenim koymak zorundasınız. Arduino kartlarında kullanılan ATmega mikrodenetleyicilerinde Bootloader adı verilen bu tür bir bellenim zaten var, bu yüzden çizimleri Arduino'ya indirmek için bir ISS arayüzü kullanmanıza gerek yok. Ancak Bootloader'ın kendisini güncellemek istiyorsanız, bu bir ISS arayüzü gerektirir. Bu Bootloader sadece USB üzerinden güncellemeleri işler, bu yüzden gerçekten "kablosuz olarak bellenim" değildir.
tcrosley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.