AVR flash bellek bozulması


11

Bu soru AVR'nin yeniden programlanmasıyla ilgilidir .

Proje bilgisi:
ATMEGA644P kullanan pille çalışan bir ürünümüz var. Uygulama sürekli uyku modunda çalışır ve yalnızca saniyede bir (RTC) veya iki harici kesme hattından biri tetiklendiğinde uyanır.

Cihaz, UART üzerinden iletişim kuran oldukça basit bir önyükleyiciye sahiptir (RS232 arayüz IC'yi kullanarak). Sadece donanım ISS programcısına gerek kalmaması için ürün yazılımını güncellemek için bir kolaylık yöntemi olarak hizmet eder. (Önyükleyici, sağlama toplamı güvenli telgraflar bekler)

Cihazlar dahili kararma ile devre dışı bırakıldı, güç tüketimini iki katına çıkardığı ve uzun pil ömrü zorunlu olduğu için tasarlandı (sanırım harici bir kararma algılaması kullanılmış olmalı - bir yeniden tasarım çalışıyor).

Sorun:
Birkaç ayda bir cihaz çalışmayı durduruyor, bu cihazlarda hiçbir ürün yazılımı güncellemesi yapılmadı. Bununla birlikte, daha fazla incelemeden sonra, bu cihazların flaş içerikleri bozulmuş gibi görünüyor. Ayrıca, bu cihazların bazılarının pilleri hala iyi, ancak bir tür düşük voltaj durumunu göz ardı etmek istemiyorum.

Bu, orijinal flash içeriklerinin (solda) bozuk içeriklerle (sağda) karşılaştırılmasıdır:

Flaş karşılaştırması

Bazı gözlemler:

  • Bozuk bir blok her zaman en az bir flash sayfasından (256 bayt) oluşur ve sayfaya hizalanır. Başka bir deyişle: Tek bir bayt değil, yalnızca tüm sayfalar etkilenir.
  • Bozuk içerik çoğu zaman 0xFF değerini okur, ancak başka değerler de içerebilir veya tamamen "rastgele" olabilir.
  • Görüntünün sol tarafındaki küçük çubuk, etkilenen tüm alanları gösterir. Bu cihaz için, toplam flaş içeriğinin yaklaşık onda biri.
  • Yalnızca tek bir sayfanın etkilendiği bir cihazımız vardı.

Flaş bellek yazılırken düşük voltaj durumunun flaş içeriğini bozabileceği tamamen mantıklıdır. Ancak bu, flaşa duyarlı bazı talimatların yürütülmesi gerektiği anlamına gelir.

Belki kontrolör düşük voltaj nedeniyle rastgele yeniden başlatılır ve önyükleme yükleyici kodu bu süre zarfında tamamen öngörülemez şekilde davranır. Düşük voltajla ilgili başka bir forumdan birisini alıntılamak için:

"Bu sadece flaş yürütülmekte olan rastgele talimatlar değil, aynı zamanda rastgele talimatlar süresi (flaş kodunun doğru bir şekilde okunup yorumlanacağının garantisi yoktur). mekanizmalar."

Soru (lar):
Sizce "düşük voltaj sırasında rastgele davranış ve flaş sayfalarda veri değiştiren bazı talimatların uygulanması" - açıklama doğru mu? Bu durumda, neden bazı yazılım sorunlarının (yığın taşması, geçersiz işaretçiler) bir nedeni olarak bu tür hataları her zaman görmüyoruz.

Bu tür yolsuzluğa neden olabilecek başka fikirleriniz var mı? Bunun nedeni EMI / ESD olabilir mi?


Örneğinizin ikinci bloğunda, herhangi bir bit 1-> 0'dan mı yoksa tümü 0-> 1 geçişinden mi geçti? Bunu hesaplayan bir komut dosyası var, ancak ekran görüntünüzdeki tüm sayıları yazmayacağım.
markrages

@markrages: Bakmakla sadece 0-> 1. Bir cevap da, tüm bitlerin 1'e çevrilmediği kısmi bir silme gibi göründüğüne dikkat çekti. Gözleminiz için teşekkürler.
Rev1.0

Yanıtlar:


11

Flaşın yazılmadığını, silindiğini fark etmelisiniz. Silinen bir flaş 0xFF ile dolu. İlk 256 baytınız tamamen silinir, üçüncü 256 baytlık bölgeniz kısmen silinir (doğru verilerden bozuk olana kadar yalnızca 0 ila 1 bit uçurum vardır).

Veri sayfasına göre , bu flaş sayfa silinebilir (genellikle sayfalardan daha büyük silme bloklarıyla çalışırım). Sayfa 282'de görüldüğü gibi, SPM ile Sayfa Silme işlemini gerçekleştirmek oldukça kolaydır.

Bölüm 23.8.1 (Flaş Yolsuzluğun Önlenmesi) ile ilginizi çekebilir:

Voltaj çok düşük olduğunda bir Flash programının bozulması iki durumdan kaynaklanabilir. İlk olarak, Flash'a düzenli yazma sırası, düzgün çalışması için minimum voltaj gerektirir. İkinci olarak, talimatların yürütülmesi için besleme gerilimi çok düşükse CPU'nun kendisi talimatları yanlış yürütebilir. Bu tasarım önerilerine uyarak flaş bozulmasından kolayca kaçınılabilir (biri yeterlidir):

  1. Sistemde Önyükleme Yükleyicisi güncellemesine gerek yoksa, Önyükleme Yükleyicisi yazılım güncellemelerini önlemek için Önyükleme Yükleyici Kilidi bitlerini programlayın.
  2. Yetersiz güç kaynağı voltajı dönemlerinde AVR RESET'i etkin (düşük) tutun.
    Bu, çalışma voltajı algılama seviyesine uyuyorsa dahili Brown-Out Detector (BOD) etkinleştirilerek yapılabilir. Değilse, harici bir düşük VCC sıfırlama koruma devresi kullanılabilir. Bir yazma işlemi devam ederken bir sıfırlama meydana gelirse, güç kaynağı voltajının yeterli olması koşuluyla yazma işlemi tamamlanacaktır.
  3. Düşük VCC dönemlerinde AVR çekirdeğini Güç kapalı uyku modunda tutun. Bu, CPU'nun kodları çözmeye ve yürütmeye çalışmasını engelleyerek, SPMCSR Kaydını ve dolayısıyla Flash'ı istem dışı yazma işlemlerinden etkili bir şekilde korur.

Üçüncü sayfadaki kısmi silme hakkındaki gözleminiz mantıklı görünüyor. Atmel metniyle ilgili olarak: Hepimiz BOD'un zorunlu gibi göründüğüne katılıyoruz. Ama hala yolsuzluğun kesin nedeni hakkında emin değilim. Denetleyicinin flaş sayfasını silmek için bu özel talimatı (düşük voltaj nedeniyle) yürütmesi pek olası değil mi? Demek istediğim, bu önyükleme yükleyici kodunun yürütülmesi sırasında bile gerçekleşmeli, çünkü flaş sadece oradan yazılabilir. Ve belirli bir dizi gerektirir.
Rev1.0

3
Yolsuzluğun kesin kaynağını açıklamak mümkün değildir: Vcc'niz düştükçe, bir transistörü diğeriyle tam olarak doyurmak çok düşük hale gelir. Bir MCU temelde çok büyük bir mantıksal denklemdir. Transistörleriniz mantıksal anahtar olarak davranmayı bırakırsa, bu denklemi değiştirirsiniz. Yanlış davranan ilk transistör ASIC Wafer dopingine ve harici elektromanyetik pertürbasyonlara bağlı olduğundan, ne olacağını tahmin edemezsiniz. Bu sorunu çözmek için ASIC'inizi tasarlarken, hatalı davranmadan önce dijital parçayı kapatan bir analog parça ekleyebilirsiniz. Ancak tüm ASIC maliyetini artırır.
Jacen

AVR180 Harici Bozulma Koruması uygulama notu kafa karıştırıcıdır : "AVR® dahili Flash Program Belleği içeriğinin yetersiz güç kaynağı voltajından asla etkilenmediğini unutmayın". Ayrıca: "AVR CPU kendi program belleğine yazma yeteneğine sahip olmadığından, dahili Flash Program bellek içeriği bir elektrik kesintisi durumundan asla etkilenmez." - IMO Atmel sadece flaş mem değiştirmek zorunda önyükleme yükleyiciler gibi bir şey olduğunu görmezden geliyor.
Rev1.0

@ Rev1.0 Evet, bu pek olası değil ... bu yüzden onu her zaman tüm cihazlardan ziyade sadece birkaç ayda bir cihazda görüyorsunuz.
user253751

"Bu, önyükleme yükleyici kodunun yürütülmesi sırasında bile gerçekleşmesi gerekecek, çünkü flaş yalnızca oradan yazılabilir." - Bu sadece önyükleme kilidi bitleri ( BLB01ve arkadaşları) uygun şekilde ayarlanmışsa geçerlidir! Öyle mi? "Kafa karıştırıcı ... uygulama notu ..." - Uygulama notları çok güvenilmezdir. Onları sadece ilham almak için kullanın; garantiler için, (aynı zamanda yanılmaz değil hey) veri sayfalarına güvenin.
marcelm

4

Bu iyi bilinen bir sorundur ve birçok mikro denetleyiciyi etkiler (sadece Atmel'i değil). Flaş bellek kontrol donanımı, düşük voltaj koşullarında belleğin bir bölümünü bozar veya siler. Basit düzeltme, kahverengileşme korumasını etkinleştirmektir.

Tabii ki mikrodenetleyicilerde her zaman esmerleşme korumasını etkinleştirmelisiniz.


3
HOW ve NEDEN "bellek kontrol donanımı, düşük voltaj koşullarında belleğin bir bölümünü bozar veya siler" hakkında sağlam referanslarınız var mı? Flaş bozulması ile ilgili birçok forum tartışması var ama neredeyse hiçbir zaman sağlam bir şeye inmiyor, bu yüzden burada sordum.
Rev1.0

Yonga içi düşük voltaj sorunu mu yoksa AFAIK'in yalnızca FLASH'i değiştirebileceği önyükleyici bölümündeki programın yanlış / rasgele yürütülmesi ile mi ilgili? İkinci sorun FUSE üzerinden önyükleyici yürütme devre dışı bırakma sorunu çözmek.
TMa

En az bir MEGA mikro erratasında bunun hakkında okuduğumu hatırlıyorum.
kullanıcısı

3

Düşük voltaj çok muhtemel bir nedendir. Örneğin, bir zamanlar 1.8 V'luk bir kahverengileşme seviyesinin sıklıkla bozulmaya neden olduğu bir projem vardı ve bu bozulmalar hiçbir zaman kahverengileşmiş bir 3.5V seviyesiyle çoğaltılamazdı.

İşlemci ne kadar hızlı çalışırsa, düşük voltaj sorunlarına o kadar duyarlı olduğunu unutmayın. CPU frekansını düşürmek sizin için kullanılabilir bir seçenekse, denemeye değer olabilir.


1
Cevap için teşekkürler. Harici bir ultra düşük güç kahverengi-out detektörü kullanarak sona erdik ve o zamandan beri herhangi bir yolsuzluk sorunu yaşamadık.
Rev1.0

0

PCB tasarımının ana kurallarına uymazsa, EMC en büyük düşmanınız olacaktır. İşte kendi deneyimlerimden en önemli olanlar: - üreticilerin bilgi sayfalarında infernal şemalar hakkında size ne söylediklerinden bağımsız olarak, herhangi bir IC'deki kapasitörleri bloke etmek, her IC'nin güç hatlarına 100pF - 1nF arasında en az bir tane koymak - Her PCB'nin katmanı mümkün olduğunca. Bu alanlara mümkün olduğu kadar sık ​​aralıklarla tüm katmanlardan temas edilecektir, 50mil'lik bir ızgara iyi bir değerdir. Bu alanları toprak sinyaline bağlayın. - PCB'nizde asla bağlı olmayan (yüzen, sinyale bağlı olmayan) bakır bırakmayın. Anten görevi görür ve cihazlara elektromanyetik radyasyon uygular - saat sinyallerini taşıyan izleri mümkün olduğunca kısa yapar

"Emc proof pcb design guide" gibi arama motoru taleplerine göre daha fazla ayrıntı bulabilirsiniz

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.