İnternet pencereler Android

UART aracılığıyla bellenim stm32. STM32, hazır ürün yazılımının nereden alınacağı çok basit Stm32'dir

Flaş yapmanın en kolay ve en hesaplı yolu STM32- kullanarak önyükleyici, bu yazıda bir pano örneğini kullanarak bunun nasıl yapılacağına bakacağız. miniSTM32F103V.

Önce ne olduğunu anlayalım önyükleyici ya da ne denir yükleyici. yükleyici- bu sadece belleğin belirli bir bölümünde saklanan ve flash mikrodenetleyicinin üzerine yazabilen bir programdır. Çip üretimi sırasında dikilir ve hiçbir şekilde değiştirilemez. Mikrodenetleyicinin hafızanın bu bölümüne girebilmesi için çıktı almanız gerekir. BOOT0 güce doğru çekin ve çıkış ÇİZME1 yere. Kartta, bu iki pin, usb konektörünün yanında bulunur ve çekme, atlama telleri kullanılarak gerçekleştirilir.
Mikrodenetleyicinin reset sonrası hangi bellek alanından başlayacağını belirleyen tablo aşağıdadır. BOOT0 Ve ÇİZME1.


Jumper'ları kurduğumuzu varsayalım, şimdi bellenim içeren hex dosyasını önyükleyiciye aktarmamız gerekiyor, onu şu şekilde aktaracağız: uart, bunun için bir dönüştürücüye ihtiyacımız var usb uart.


Mikro devre temelinde yapılmış böyle bir dönüştürücüm var FT232RL bir lehimleme istasyonu için ince bir uç kullanarak lehimlemek çok basittir. Sızdırmazlık yöntemi şu şekildedir, önce bir ayağı iki zıt açıdan tutmanız, ardından mikro devre sabitlendiğinde bacakların geri kalanını bir havya veya saç kurutma makinesi ile lehimlemeniz gerekir. Ve son dokunuş, mekanik gerilimi onlardan çıkarmak için önce lehimlenen bacakları bir kez daha lehimliyoruz.

Adaptörü bağlarız usb uart bilgisayara ve hangi çipte yapıldığına bağlı olarak CP2120 veya FT232, uygun sürücüleri yükleyin. Daha sonra sistemde COM_PORT olarak tanımlanmalıdır.


Şimdi adaptörümüzü karta bağlayalım, adaptörün RX çıkışını çıkışa bağlayalım. MCU_TxD ve çıktı ile TX çıktısı MCU_RхD. Satıcının gönderdiği kartın topolojisi üst resimdekinden biraz farklıdır, ürün yazılımı pinleri ayrı gösterilir ve kırmızı oklarla işaretlenir.


Ardından, önyükleyici ile iletişim kuracağımız bir program indirmeniz gerekiyor, adı FLASH LOADER DEMONSTRATOR.


Programı kurduktan sonra bağdaştırıcımızın tanımlı olduğu com portunu seçiniz. usb uart ve NEXT düğmesine basın, hız otomatik olarak belirlenecektir. Denetleyici okuma korumalıysa, "Korumayı Kaldır" düğmesine basılarak koruma kaldırılabilir, bu sırada flash bellek silinir ve buna göre içine yazılan tüm veriler kaybolur.


Denetleyici korumalı değilse, aşağıda gösterilen pencere görünecektir, içinde İLERİ düğmesine basıyoruz.


Bir sonraki pencerede ne yapmak istediğimizi seçmeniz gerekiyor: mikrodenetleyicinin flaşını oku / yaz, sil, okumayı / yazmayı yasakla, yazmakla ilgileniyoruz, bunun için yüklemek istediğimiz dosyayı seçip tuşuna basıyoruz. SONRAKİ.

Pekala, burada en ilginç aşamalardan birine ulaştık - bitmiş aygıt yazılımını denetleyiciye nasıl yükleyeceğiz ve sonunda demir parçamızı nasıl canlandıracağız.

Aslında, STM32 denetleyicilerini farklı şekillerde flaş edebilirsiniz, ancak en basit ürün yazılımı seçeneğini özel Flash Loader Demonstrator yardımcı programını kullanan bir seri arabirim aracılığıyla ele alacağız. Bu yardımcı program tamamen ücretsizdir ve hem resmi hem de .

Daha önce de söylediğimiz gibi, önyükleyici, denetleyicinin sistem belleği alanına dikilir. Ürün yazılımını bir seri arabirim aracılığıyla flash belleğe yazmanıza izin veren odur.

Önyükleyici, AN2606 belgesinde (CD00167594.pdf) ayrıntılı olarak açıklanmaktadır ve kullandığı protokol AN3155 belgesinde (CD00264342.pdf) yer almaktadır. isteyenler için bu kapsamlı bilgi, ve kısaca önyükleyici aracılığıyla bellenim sürecini ele alacağız.

Öncelikle Flash Loader Demonstrator yardımcı programını bilgisayarınıza indirip yüklemeniz gerekir.

Bu nedenle, denetleyicinin Tx ayağı, dönüştürücünün Rx bacağına ve denetleyicinin Rx bacağı, dönüştürücünün Tx bacağına bağlanmalıdır. Ayrıca kontrolöre güç verilmeli ve BOOT0 (pin 44), BOOT1 (pin 20) ayakları üzerinde istenilen seviyeleri sağlamalıdır. Sistem belleğinde bulunan önyükleyiciyi başlatmak için, BOOT1 ayağı "yere" ve BOOT0 "güç" e (sağdaki plaka) çekilmelidir.

BOOT0 için bir pull-up yapmak daha iyidir, BOOT1 zor değil, ancak jumper'larla, böylece önyükleme modlarını kolayca seçebilirsiniz (örneğin, programı yükledikten sonra flash önyükleme moduna geçerek, bu programı hemen test edebilirsiniz) .

Bağlantı şeması aşağıda gösterilmiştir.

Eşlik ve veri bitlerinin sayısı zaten gerektiği gibi yapılandırılmıştır, hız değiştirilebilir - kontrolör, değişimin başlatılması sırasında otomatik olarak seçilen hıza ayarlanır, USB'yi bağlarken oluşturulan com-port'u seçmeniz gerekir bilgisayara COM dönüştürücü (dönüştürücümüz, gerçek bir donanımı tamamen taklit eden sanal com-port'u bağlarken oluşturur). Her şey ayarlandıktan sonra "İleri" düğmesini tıklayın.

Her şeyin yolunda olduğu ve kontrolöre bağlanmanın mümkün olduğu gerçeği, bir sonraki sayfada yeşil trafik ışığı ile bilgilendirilecek. Bağlantı kurulmazsa, denetleyici yanıt vermiyor diyerek bu sayfaya hiçbir şekilde girmemize izin verilmeyecektir.

Bir bağlantı kurulduğunda program otomatik olarak kontrolörün ne kadar flash belleğe sahip olduğunu ve bu belleğin okuma korumalı olup olmadığını belirleyecektir. "Korumayı kaldır" düğmesine basarak koruma kaldırılabilir, ancak flaşın içeriği silinir (orada yazılan önceki üretici yazılımı imha edilir). "İleri" ye basıyoruz.

Bir sonraki pencerede programlanacak taşın türünü seçmemiz isteniyor (nedeni belli olmasa da - zaten otomatik olarak belirleniyor) ve ayrıca taşımız için PID, flash bellek kartı ve önyükleyici sürümünü gösteriyorlar. Sadece "İleri"yi tıklayın.

Bir sonraki pencerede, denetleyicimizle gerçekte ne yapmak istediğimizi seçmeniz gerekiyor. Burada aşağıdaki seçenekler mümkündür: Silme (silme), Cihaza indirme (denetleyiciye ürün yazılımı indirme), Cihazdan yükleme (denetleyiciden ürün yazılımını okuma), Flash korumasını Etkinleştir / Devre Dışı Bırak (flash bellek korumasını etkinleştir / devre dışı bırak), Düzenleme seçeneği bayt (seçenek baytlarını değiştir). Buna göre, aygıt yazılımını yüklemek istiyorsak, Aygıta indir öğesini seçin, ardından üç noktalı kareye tıklayın ve gezginde yüklenecek aygıt yazılımının bulunduğu dosyayı seçin ve ardından tekrar “İleri” düğmesine tıklayın.

Bir sonraki sayfada, altta indirme prosedürünün ilerlemesini gösteren bir ilerleme çubuğu görünecektir. Tüm bellenim denetleyiciye indirildikten sonra, bu ilerleme çubuğu yeşile dönecek ve beyaz harflerle "İndirme işlemi başarıyla tamamlandı" (indirme işlemi başarıyla tamamlandı) diyecektir. Bundan sonra, "Kapat" düğmesini tıklayabilir ve Flash Loader Göstericisini kapatabilirsiniz.

İşte bu kadar, şimdi taşan programın çalışmaya başlaması için, denetleyiciyi flaştan önyükleme yapacak şekilde yapılandırmamız (BOOT0 = 0, BOOT1 - herhangi bir seviye) ve yeniden başlatmamız gerekiyor.

Bu Arduino klonu, ST-Link veya bir USB-UART adaptörü gibi harici bileşenler kullanmadan USB üzerinden ürün yazılımı yüklemenizi sağlayan özel bir önyükleyici sunar.

Bugün CooCox'un altından ve stm32duino'suz çıplak bir denetleyiciyle çalışmam gerekiyordu. Ama sorun burada. Bu önyükleyiciden dökülen ampullü basit bir flaşör bile çalışmıyor.

Hadi çözelim. Belki de hesaplamalarım birine sıradan görünecektir. Ama STM32 denetleyicilerini incelemeye yeni başlıyorum ve bir sorun bulmak için en az yarım günümü harcadım. Aniden bu makale birinin geliştirme süresini azaltacaktır.

ST-Link ve diğer hata ayıklayıcılara karşı hiçbir şeyim yok. Ama bitmiş cihazımda olmayacak ama kesinlikle USB olacak. Firmware'i USB üzerinden güncelleme özelliğini neden hemen bırakmıyorsunuz? Şahsen ben bu yöntemi uygun buluyorum. özellikle de güç ve USB Serial'in sağlandığı bir kabloya hala bağlı olduğum için.

Önyükleyicinin nasıl çalıştığını görelim. Başlamak için, AVR denetleyicileri örneğinde. Neden onu hatırladım? Arduino'dan hareket ediyordum ve bilinçaltımda aynı davranışı bekliyordum. Ancak STM32'de her şey farklı çıktı. Bu nedenle bu iki mikrodenetleyici arasındaki farktan bahsetmek istiyorum.

Bu yüzden. İÇİNDE AVR mikrodenetleyicileri ATMega önyükleyici, flaşın sonuna doğru belirli bir miktarda bellek ayırabilir. Sigorta bitlerini kullanarak programın hangi adresten başlayacağını kontrol edebilirsiniz. Önyükleyici yoksa, program 0x0000 adresinden başlar. Bir önyükleyici varsa, başka bir adresten başlar (örneğin, önyükleyici boyutu 2k olarak ayarlanmışsa, 0x3C00 ile ATMega32'de).

Bootloader işini bitirdiğinde kontrolü 0x0000 adresinden ana programa aktarır. Onlar. program her zaman 0x0000 adresinde başlar. Derleyici ve bağlayıcı, kodun adres alanının başında yer alacağı varsayımıyla çalışır.

STM32 mikrodenetleyicilerinde her şey farklıdır. Tüm programlar 0x0800000 adresinde başlar. Önyükleyici özel bir şey değil. Bu, aynı başlangıç ​​adresinden başlayan programın aynısıdır. Çalışma sırasında, önyükleyici ürün yazılımı alabilir (USB veya UART aracılığıyla, bir USB flash sürücüden okuyabilir, bir uydudan alabilir, alt uzaydan alabilir, her neyse ...) ve önyükleyicinin bulunduğu yerden daha yüksek adreslere yazabilir. Ve tabii ki işinizin sonunda kontrolü ana programa aktarın.

Bu nedenle, bellenimi derlerken, önyükleyicinin bellenimi nereye yazacağını bilmeniz ve adresleri buna göre ayarlamanız gerekir.

Teori ile hepsi bu. Uygulamaya geçelim. Altında adım adım talimat nasıl vidalanır USB önyükleyici STM32F1xx serisinin mikrodenetleyicilerine ve belki bazılarına da.

Bununla birlikte, devre üzerinde bazı kısıtlamalar vardır. Burada maalesef güçlü değilim. YTP, PA12 bağlantı noktası (USB D+ olarak da bilinir) için 1,5k'lık bir çekme direncine ihtiyaç duyar. Bu, önyükleyicinin doğru anlar USB'ye bağlanma ve bağlantısını kesme zamanı.

Talimat:

  • github.com/rogerclarkmelbourne/STM32duino-bootloader'ı indirin. STM32F1binaries dizini zaten farklı panolar için derlenmiş bir önyükleyici paketine sahiptir. Dosya adının sonundaki dizin, LED'in nereye bağlı olduğunu gösterir. LED'in pin C13'e bağlı olduğu durumda jenerik_boot20_pc13.bin dosyasını kullandım.
  • Hadi flaş yapalım. Evet, bir USB-UART adaptörüne ihtiyacınız olacak, ancak muhtemelen bir hata ayıklayıcı kullanabilirsiniz.
  • Artık mikrodenetleyici, USB önyükleyici aracılığıyla flaşlamaya hazırdır. Ancak yine de aygıt yazılımının kendisini düzeltmeniz gerekir. Ve 2 şey yapmanız gerekiyor:
    • Bağlayıcının başlangıç ​​adresini belirtin. CooCox'ta bu, proje ayarları, Bağlantı sekmesi, Bellek Alanları bölümü, IROM1 Başlangıç ​​Adresi'nde yapılır. Önyükleyici ilk 8 kilobaytı kaplar, bu nedenle bellenimin başlangıç ​​adresi 0x0800000 + 0x2000 = 0x08002000 olacaktır. Boyut alanı da muhtemelen 8k azaltılmalıdır.
    • Programın başında bir yerde, çevreyi başlatmadan önce NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
  • Firmware dolgusu mümkündür. Araçlar dizininde, maple_upload adlı bir komut dosyası arayın. Yalnızca Windows sürümünü kullandım - maple_upload.bat
  • Şu şekilde çalıştırın:
    "maple_upload.bat" COM20 2 1EAF:0003 "PathToFirmware.bin"

    COM20 yerine mikrodenetleyicinin bağlı olduğu portunuzu değiştirmeniz gerekiyor.

    Dolgu çok hassas bir şeydir, göreceli yolları sevmez. bu nedenle ürün yazılımına giden yol tam olarak belirtilmelidir.

    1EAF:0003, VID ve PID'dir

    2, ürün yazılımının 0x08002000'de (okuma) yüklenmesi gerektiğini belirten AltID parametresidir.

Birkaç nüans daha. Bellenimi yüklemeden önce önyükleyiciyi çalıştırmanız gerekir. En kolay yol, sıfırlama düğmesine basmaktır. Bundan sonra, önyükleyici başlayacak ve üretici yazılımı için birkaç saniye bekleyecektir. Bu noktada hiç kimse maple_upload'ı çalıştırmıyorsa, yükleyici kontrolü ana sabit yazılıma devredecektir.

Bu rahatsızlığa neden olabilir. Mikrodenetleyici kapanır ve askıda kalırsa, artık bağlantı noktasını dinlemez. Bu nedenle, tuş sırasını duyamaz ve önyükleyiciye yeniden başlayamaz. O zaman sadece yardım için sıfırlayın.

Bu kadar. Umarım makalem STM32'de bootloader'ın nasıl çalıştığına ve üzerinden nasıl firmware yükleyebileceğinize ışık tutacaktır. USB girişi. Ne yazık ki, giriş eşiği hala yüksek, ancak birdenbire makalem birinin bunun üstesinden gelmesine yardımcı olacak.

Diyelim ki cihazınızı piyasaya sürdünüz ve birisinin onu kopyalamaya başlamasından korkuyorsunuz ... Aslında, programlayıcıyı cihazımıza bağlamanız ve örneğin ST-Link Yardımcı Programı aracılığıyla ürün yazılımını okumanız yeterli ( HedefBağlamak).

Tabii ki, mikrodenetleyicinin ayaklarını koparabilirsiniz ... ancak ST Microelectronics'in geliştiricileri daha iyi bir alternatif sunuyor. Tüm MK'ler bir okuma koruma sistemine sahiptir. Özü son derece basittir - eğer özel bir kayıt (Seçenek baytları) ayarlanmışsa belirli değer- o zaman aygıt yazılımını hata ayıklama ve okuma yeteneği devre dışı bırakılır. Bu modda, MK'yi flaş etme yeteneğinizi de kaybedersiniz. Tabii ki, bu koruma, Seçenek bayt kaydındaki değer değiştirilerek devre dışı bırakılabilir, ancak bu durumda, programın belleğinin üzerine yazılacaktır, bu da kimsenin onu kopyalayamayacağı anlamına gelir.

Kayıttaki değeri aynı ST-Link Yardımcı Programını kullanarak değiştirebilirsiniz, HedefSeçenek Baytları…Okuma korumasıOLANAK VERMEK.


Devre dışı bırakma sırasıyla benzer şekilde olabilir. Çok sayıda cihaz varsa bu pek uygun değildir. Korumayı programlı olarak etkinleştirebilirsiniz.

Korumayı uygulamak için kullanmak uygundur standart kitaplıkçevre birimleri, özellikle stm32f10x_flash.c ihtiyacımız olan işlevi içerir. Kaydın kendisi ve flash bellekle çalışması belgede açıklanmaktadır. Ancak bundan önce, başlık dosyalarının birden fazla dahil edilmesi için korumanın nasıl uygulandığını hatırlayalım. Önişlemci yönergelerini şu şekilde kullandık:

  • #define - yönerge, önişlemciye dosyadaki satırı değiştirmesini söyler, ancak argüman (sonda olan) belirtilmezse tanımlayıcının kendisi (ortada olan) sistemde kalır ve kontrol edilebilir diğer direktifler tarafından (yani, belirli bir kodun yürütüleceği bir koşul yazabilirsiniz veya tersi);
  • #ifndef - yönerge "eğer tanımlanmamışsa" olarak okunabilir, ancak başka bir #ifdef - "kesinlikle ise" bizim için daha uygundur;
  • #endif - bir koşulun sonunu gösteren bir yönerge.

Bu derlemenin son olduğunu söyleyecek bir tanımlayıcı oluşturalım. Hoşçakal verilen dize yorumlandı - #ifdef ve #endif arasına yerleştirilen kod yürütülmeyecek.

//#BIRAKIMI tanımla

Son montajda, sadece satırın açıklamasını kaldırın ve cihazı flaşlayın.

#ifdef RELEASE // buraya kod #endif

Ve şimdi noktaya. Mikrodenetleyicinin dahili flash belleğiyle nasıl çalışacağımızı zaten anladık. Koruma bitlerini yazmadan önce, hafızaya erişimin kilidini açmanız, ardından gerekli işlemleri yapmanız ve tekrar erişimi engellemeniz gerekir. Aşağıdakiler ortaya çıkıyor:

#ifdef RELEASE #warning "Koruma AÇIK. Hata ayıklama KAPALI" if (FLASH_GetReadOutProtectionStatus() == RESET) ( FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE); FLASH_Lock(); ) #endif

Stm32 mikrodenetleyicilerinden bazıları USB DFU protokolünü destekler (listeleri AN3156 uygulama notunda bulunabilir), üretici yazılımı bu tür MK'ye şu şekilde yüklenebilir: normal USB, örneğin ST'den DFuSe demosu veya açık kaynak dfu-util kullanarak. Bu seçenekle her şey açık ve bunu tarif etmeyeceğim.

DFU desteğinden yoksun olan aynı MK için (özellikle BluePill kartında kullanılan - STM32F103C8T6), öyle ya da böyle bir programlayıcıya ihtiyacınız var, örneğin ST-Link V2 Mini

Cihaz pin çıkışı:

Panoya bağlanmak basittir:

ST-Link STM32F103C8T6 3.3V --- 3.3V GND --- GND SWDIO --- DIO SWCLK --- DCLK

Ayrıca ST-Link Yardımcı Programına da ihtiyacınız var, onu st.com resmi web sitesinden indirebilirsiniz - link. İlk kez bağlanırken, programlayıcının donanım yazılımını güncellemek güzel olurdu. ST-LINK -> üretici yazılımı güncellemesini seçin, daha yeni bir aygıt yazılımı mevcutsa, bunun gibi bir şey olacaktır:

Evet >>>> öğesini seçin, aygıt yazılımı güncellenir.

Ardından, ürün yazılımı dosyasının kendisini açın ve Hedef -> Bağlan'ı seçin. MK'niz hakkındaki bilgiler yardımcı program durum penceresinde de görünecektir - bu, programlayıcının doğru şekilde bağlandığı ve yardımcı programın MK ile iletişim kurabileceği anlamına gelir. Örnek:

Ardından, çipi tamamen temizlemeniz gerekir, Hedef -> Çipi Sil'i seçin.

Örneğin, pedal ve düğme denetleyici gönderisindeki aygıt yazılımım zaten yüklendiyse ve güncellenmesi veya yeniden yüklenmesi gerekiyorsa, programcı panoya bu kadar kolay bağlanamayacaktır (çünkü normal GPIO'lar gibi SWD pinleri kullanıyorum) . Bu durumda iki seçenek vardır:

  1. her iki sarı atlayıcıyı da yeniden düzenleyin. Bu durumda, kart hemen dahili önyükleyicinize yüklenecektir.
  2. Sıfırlama altında sözde Bağlanabilirsiniz. Onun için sıra şöyle olurdu:
  • ST-Link Yardımcı Programında Hedef -> Ayarlar'ı seçin
  • Sıfırlama Modunda Donanım Sıfırla'yı seçin
  • panodaki Sıfırla düğmesine basın ve basılı tutun
  • ST-Link Yardımcı Programında Tamam'a tıklayın
  • tahtadaki sıfırlama düğmesini bırakın

PS. Bir SMT32F4Discovery geliştirici kartınız varsa, içinde zaten bir programlayıcı vardır ve başka bir kartı flaşlamak için de kullanılabilir. Bu durumda, STM32F4Discovery üzerindeki SWD konektörünü kullanmanız ve her iki CN3 atlama telini de çıkarmanız gerekir. SWD konnektörünün pin yapısı aşağıdaki gibidir: