Bootloader kullanılarak kod yüklendiğinde ne olur?


13

Optiboot önyükleyicisini kullanarak Arduino Uno'ma yeni bir çizim yüklediğimde gerçekten ne olur?

  • Arduino'ya ne gönderilir?
  • Nasıl tepki veriyor?
  • "Senkronize değil" ne anlama geliyor?
  • Zaten "senkronize" nedir?

Not: Bu bir "referans sorusu" olarak düşünülmüştür .


çok ilginç bir yazı! Sadece bir soru daha. Seri iletişimi (görüntüler) izlemek için hangi yazılımı kullanıyorsunuz?
julio

Saleae Logic 8 gibi bir Mantık Analizörünün çıktısıdır. Saleae.com Çok hoş bir küçük analizör. ~ 125, 150 $ için 24 MHz örnekleme hızı kullanılır. Mevcut yakalama hızları 100 ve 500 MHz'dir. > SPI, I2C ve diğerleri> Çoğu dijital iletişim, bilginin nasıl aktarılacağını belirten belirli bir protokol kullanır. Logic yazılımı, SPI, I2C, seri, 1-Kablolu, CAN, UNI / O, I2S / PCM, MP Modu, Manchester, Modbus, DMX-512, Paralel, JTAG, LIN, Atmel SWI, MDIO, SWD, LCD HD44780, BiSS C, HDLC, HDMI CEC, PS / 2, USB 1.1, Midi - veya kendiniz oluşturun
CrossRoads

Yanıtlar:


21

Optiboot yükleyiciyi çalıştıran bir Uno'yu sıfırladığınızda, önyükleyici önce pim 13'ü üç kez yanıp söner.

Pin 13 yanıp sönüyor

Üst satır (gri) gönderilir için Arduino, orta hat (turuncu) gönderilir den Arduino.

Bu sırada, avrdudebilgisayarınızda çalışan program cihaza bir sorgu gönderir:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

Arduino, yanıp sönen pim 13 ile meşgul olduğu için ilk "senkronizasyonu al" ı fark etmez. Bir kez yapıldığında "senkronizasyonu al" (seri donanım tarafından arabelleğe alınır) fark eder ve yanıtlar:

STK_INSYNC / STK_OK (0x14/0x10)

Görünüşe göre avrdude biraz sabırsız ve zaman aşımına uğradı, çünkü tekrar "senkronizasyon al" sorgusuyla çalışıyor. Bu sefer Optiboot hemen cevap veriyor.


Yüklemenin geri kalanı bir sonraki resimde açıklanmıştır. Stok "Blink" programı yüklenerek oluşturulan örnek.

Optiboot yükleme işlemi

(Daha büyük bir versiyon için yukarıdaki resme tıklayın)


Adımlar:

  • Sorgu: Senkronizasyon al? Cevap: Senk.
  • Sorgu: Parametre al? (ana sürüm) Yanıt: sürüm 4.
  • Sorgu: Parametre al? (küçük sürüm) Yanıt: sürüm 4.
  • Cihaz parametrelerini ayarlayın. Aşağıdaki cihaz parametreleri çipe gönderilir:

    0x42  // STK_SET_DEVICE
    0x86  // device code
    0x00  // revision
    0x00  // progtype: “0” – Both Parallel/High-voltage and Serial mode
    0x01  // parmode: “1” – Full parallel interface
    0x01  // polling: “1” – Polling may be used
    0x01  // selftimed: “1” – Self timed
    0x01  // lockbytes: Number of Lock bytes.
    0x03  // fusebytes: Number of Fuse bytes
    0xFF  // flashpollval1
    0xFF  // flashpollval2
    0xFF  // eeprompollval1
    0xFF  // eeprompollval2
    0x00  // pagesizehigh
    0x80  // pagesizelow
    0x04  // eepromsizehigh
    0x00  // eepromsizelow
    0x00  // flashsize4
    0x00  // flashsize3
    0x80  // flashsize2
    0x00  // flashsize1
    0x20  // Sync_CRC_EOP

    Optiboot tüm bunları yok sayar ve In Sync / OK ile yanıtlar. :)

  • Genişletilmiş cihaz parametrelerini ayarlayın:

    0x45  // STK_SET_DEVICE_EXT
    0x05  // commandsize: how many bytes follow
    0x04  // eeprompagesize: EEPROM page size in bytes.
    0xD7  // signalpagel: 
    0xC2  // signalbs2: 
    0x00  // ResetDisable: Defines whether a part has RSTDSBL Fuse 
    0x20  // Sync_CRC_EOP

    Optiboot da bunları yok sayar ve In Sync / OK ile yanıtlar.

  • Program moduna girin. Cevap: Senk / Tamam.

  • İmzayı okuyun. Optiboot 0x1E 0x95 0x0F , imzayı gerçekten okumadan yanıt verir .

  • Sigortaları yazın (dört kez). Optiboot sigortayı yazmaz, sadece Sync / OK olarak yanıtlar.

  • Yükleme adresi (başlangıçta 0x0000). Adres kelimelerdir (yani bir kelime iki bayttır). Bu, bir sonraki veri sayfasının yazılacağı adresi ayarlar.

  • Program sayfası (128 bayta kadar gönderilir). Optiboot hemen "In Sync" yanıtını verir. Ardından, sayfayı gerçekten programlarken yaklaşık 4 ms'lik bir duraklama olur. Sonra "Tamam" yanıtını verir.

  • Yükleme adresi (şimdi 0x0040). Bu, ondalık olarak adres 64'tür, yani. Program belleğinin başlangıcından itibaren 128 bayt.

  • Başka bir sayfa yazılmıştır. Bu sıra tüm sayfalar yazılana kadar devam eder.

  • Adresi yükle (0x0000'e geri dön). Bu yazmayı doğrulamak içindir.

  • Sayfayı oku (128 bayta kadar okunur). Bu doğrulama içindir. Doğrulama başarısız olsa bile, bozuk verilerin zaten çipe yazıldığını unutmayın.

  • Programlama modundan çıkın.


"Senkronize değil" ne anlama geliyor?

Yukarıdan da görebileceğiniz gibi, Arduino'nun programlama sekansındaki her adımda, muhtemelen bazı veriler ve ardından "Tamam" (0x10), ardından "Senkronize" (0x14) ile yanıt vermesi bekleniyor.

Eğer "senkronize değil" ise, avrdude "senkronize" yanıtı almadı demektir. Olası nedenler şunlar olabilir:

  • Yanlış baud hızı kullanılmış
  • IDE'de yanlış seri bağlantı noktası seçildi
  • IDE'de yanlış kart türü seçildi
  • Yüklü önyükleyici yok
  • Yanlış önyükleyici takılmış
  • Kart önyükleyiciyi kullanacak şekilde yapılandırılmamış (sigortalarda)
  • Bazı cihazlar Arduino'daki D0 ve D1 pinlerine takılı ve seri haberleşmelere müdahale ediyor
  • USB arabirim yongası (ATmega16U2) düzgün çalışmıyor
  • Tahta için yanlış saat
  • Atmega328P'de yanlış sigorta ayarları (örn. "Saati 8'e böl")
  • Kart / yonga hasarlı
  • Hatalı USB kablosu (bazı USB kabloları yalnızca güç sağlar ve veri için değildir, örneğin USB fanları için ucuz kablolar)

"Senkronize" nedir?

Yukarıda belirtildiği gibi, "Senkronize" yanıtı, Arduino'nun (bootloader) yükleme programıyla senkronize edildiği anlamına gelir.


Hangi protokol kullanılıyor?

Protokol, Atmel tarafından belgelendiği gibi STK500 protokolüdür. Aşağıdaki referanslara bakın.


Referanslar

Not : STK500 Sürüm 2, Optiboot'ta kullanılmaz, ancak Mega2560 gibi kartlar kullanmanız durumunda bilgi için dahil edilir.


STK500 sabitleri

/* STK500 constants list, from AVRDUDE */
#define STK_OK              0x10
#define STK_FAILED          0x11  // Not used
#define STK_UNKNOWN         0x12  // Not used
#define STK_NODEVICE        0x13  // Not used
#define STK_INSYNC          0x14  // ' '
#define STK_NOSYNC          0x15  // Not used
#define ADC_CHANNEL_ERROR   0x16  // Not used
#define ADC_MEASURE_OK      0x17  // Not used
#define PWM_CHANNEL_ERROR   0x18  // Not used
#define PWM_ADJUST_OK       0x19  // Not used
#define CRC_EOP             0x20  // 'SPACE'
#define STK_GET_SYNC        0x30  // '0'
#define STK_GET_SIGN_ON     0x31  // '1'
#define STK_SET_PARAMETER   0x40  // '@'
#define STK_GET_PARAMETER   0x41  // 'A'
#define STK_SET_DEVICE      0x42  // 'B'
#define STK_SET_DEVICE_EXT  0x45  // 'E'
#define STK_ENTER_PROGMODE  0x50  // 'P'
#define STK_LEAVE_PROGMODE  0x51  // 'Q'
#define STK_CHIP_ERASE      0x52  // 'R'
#define STK_CHECK_AUTOINC   0x53  // 'S'
#define STK_LOAD_ADDRESS    0x55  // 'U'
#define STK_UNIVERSAL       0x56  // 'V'
#define STK_PROG_FLASH      0x60  // '`'
#define STK_PROG_DATA       0x61  // 'a'
#define STK_PROG_FUSE       0x62  // 'b'
#define STK_PROG_LOCK       0x63  // 'c'
#define STK_PROG_PAGE       0x64  // 'd'
#define STK_PROG_FUSE_EXT   0x65  // 'e'
#define STK_READ_FLASH      0x70  // 'p'
#define STK_READ_DATA       0x71  // 'q'
#define STK_READ_FUSE       0x72  // 'r'
#define STK_READ_LOCK       0x73  // 's'
#define STK_READ_PAGE       0x74  // 't'
#define STK_READ_SIGN       0x75  // 'u'
#define STK_READ_OSCCAL     0x76  // 'v'
#define STK_READ_FUSE_EXT   0x77  // 'w'
#define STK_READ_OSCCAL_EXT 0x78  // 'x'


1
İyi bir nokta! Cevaba birkaç referans ekledim. Teşekkürler.
Nick Gammon

Burada açıklanan doğrulama işleminin özel olarak bir sayfa okuması kullandığını, yani avrdudevarsayılan doğrulama davranışını destekleyen herhangi bir önyükleyicinin flaş içeriğinin okunmasını destekleyen bir önyükleyici olduğunu unutmayın.
Chris Stratton

1
Bu kapsamlı ve açıklayıcı program talimatı ve Optiboot / STK500 analizi akıl almaz derecede harika. Teşekkürler, büyük Nick Gammon!
David Refoua
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.