İçindekiler:

Bölüm 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Adım
Bölüm 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Adım

Video: Bölüm 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Adım

Video: Bölüm 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Adım
Video: Part 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo 2024, Kasım
Anonim
Image
Image

Bu Eğitilebilir Yazının odak noktası STM32 Nucleo mikro denetleyicisidir. Bunun motivasyonu, çıplak kemiklerden bir montaj projesi oluşturabilmek. Bu, daha derine inmemize ve zaten birkaç Instructable'ın konusu olan MSP432 Launchpad projesini (TI-RSLK) anlamamıza yardımcı olacaktır.

Code Composer Studio'yu kullanarak MSP432 için yalnızca derleme projesi oluşturmak için çevrimiçi olarak çok fazla yardım yok. Şimdiye kadar sadece önceden var olan bir montaj projesinden kopyalayıp/yapıştırıyorduk. Bu yaklaşım bize iyi hizmet etti.

Ancak şimdi, Lab 7 için biraz sorunla karşılaştık. Ya da en azından geçici bir hıçkırık. Lab 7, sonlu durum makinelerini tanıtır ve karşılaştığımız ilk şey, bir dizi değer yaratma ve kullanma ihtiyacıdır. TI kursu esas olarak C programlama kullandığından - bu bir sorun değildir. Ancak bu Instructables, C'ye değil, montaja odaklandı.

Ayrıca dizi salt okunur değerlere sahip olduğundan, onu RAM'e değil flash belleğe koymak iyi olur.

STM32 MCU'yu kullanan montaj projeleri için çevrimiçi olarak çok daha fazla yardım var gibi görünüyor, bu nedenle, öğrenilenleri kullanmak ve ardından MSP432 ve Code Composer Studio'ya uygulamak amacıyla bu Instructable ile başlıyoruz.

Bu hedefe giden yolda, bir başka popüler mikro denetleyiciyle de deneyim kazanmış olacağız.

Adım 1: Cihazın İlk Testi

Cihazın İlk Testi
Cihazın İlk Testi
Cihazın İlk Testi
Cihazın İlk Testi
Cihazın İlk Testi
Cihazın İlk Testi

Yine, neden özellikle STM32 Nucleo'yu seçelim?

Açıkçası? Çünkü ARM kontrolörleri için çıplak metal montaj projeleri hakkında iyi makaleler arıyordum ve bu seriye rastladım. Ve ayrıca STM32 popüler bir MCU gibi göründüğü için.

Biraz araştırma yaptım (seçilebilecek çok sayıda versiyon var - yukarıdaki resme bakın), ama sonunda Amazon'u (ABD'de) kullanacağım için gerçekten alabileceğim şey oldu.

Bazı başlatma talimatlarıyla birlikte basit ama profesyonel bir pakette gelir. Denetleyicide yakılan demonun neredeyse tam olarak önceki Instructables'ta yaptığımız şey olduğunu görmek biraz komikti - bir LED yanıp söner ve bir düğmeye basıldığında hızı değiştirir.

Görünüşe göre bu geliştirme kartı, 2 LED ve bir kullanıcı butonunun bulunmasıyla MSP432'ye çok benziyor. MSP432'nin 2 kullanıcı düğmesi vardır.

Fotoğraflarda da görebileceğiniz gibi, anakartın mikro USB yerine mini olması beni biraz şaşırttı. Bir kablo satın almak için tükenmek zorunda kaldı.

Bir başka iyi test, bilgisayarınıza bağladığınızda (bir Linux kutusu kullanıyorum), dosya yöneticimde "NODE_F303RE" adlı bir dosya sistemi olarak görünmesidir. Bir HTML ve bir metin olmak üzere iki dosyayı ortaya çıkaran açılış.

Bu kadar, ama en azından bağlantının oldukça kolay göründüğünü de söylüyor.

Şimdi başlamaya hazırız.

IVONOMICON Çıplak Metal makale serisindeki iyi bilgilerin hiçbirini tekrarlamamaya çalışacağım, aksine onu zenginleştireceğim.

2. Adım: Temel Bilgiler

İhtiyacımız olan ilk şey bir derleyici.

Ve sonra bir hata ayıklayıcıya ihtiyacımız var:

devchu@chubox:~$ sudo apt-get install gdb-arm-none-eabiPaket listelerini okuma… Bitti Bağımlılık ağacı oluşturma Durum bilgilerini okuma… Bitti Aşağıdaki YENİ paketler yüklenecek: gdb-arm-none-eabi 0 yükseltildi, 1 yeni yüklendi, 0 kaldırılacak ve 8 yükseltilmedi. 2.722 kB arşiv almanız gerekiyor. Bu işlemden sonra 7.738 kB ek disk alanı kullanılacaktır. Get:1 https://us.archive.ubuntu.com/ubuntu xenial/universe amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 kB] 1 saniyede 2.722 kB alındı (1, 988) kB/s) Daha önce seçilmemiş olan gdb-arm-none-eabi paketi seçiliyor. (Veritabanı okunuyor … şu anda kurulu 262428 dosya ve dizin.) Paketi açmaya hazırlanıyor …/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb … gdb-arm-none-eabi paketini açma (7.10-1ubuntu3+9) … İşleme man-db için tetikleyiciler (2.7.5-1) … gdb-arm-none-eabi (7.10-1ubuntu3+9) kurulumu …

3. Adım: Temel Bilgiler - Windows

Yukarıdaki adım, Linux kullandığımızı varsayıyordu. Ya Windows kullanıyorsak?

Geliştirici sitesine gidebilirsiniz ve birkaç indirme seçeneği mevcuttur. Windows 8 makinesi kullanıyorum.

Kurulum sırasında, sadece cygwin kullandığım için Program Dosyaları yerine kök "C:\" sürücüsüne yüklemeyi seçtim ve yerel kutumdan bir kök C: klasörüne bağlantı oluşturmak tüm dosyalardan daha kolaydı. Program Dosyalarına giden yolda karışıklık (boşluklar vb.).

Böylece, cygwin ortamım ve yolum, vb. şöyle görünür:

C:\cygwin64\home\bin\arm-none-eabi-gcc, burada arm-none-eabi-gcc, C:\GNUToolsArmEmbedded\7.2018.q2.update\bin\arm-none-eabi- bağlantısıdır gcc.

Daha sonra cygwin home altında bir "dev" klasörü oluşturdum ve orası core. S dosyasını yerleştirdiğim ve derleyici komutunu çalıştırdığım yer. (derleyici öğeleri için aşağıya bakın).

Aynı şeyi gdb (arm-none-eabi-gdb) için de yaptım.

Adım 4: Temeller Nelerdir?

Peki "gcc-arm-none-eabi" nedir?

Gnu derleyicisi (GCC), programlama dillerini (C gibi) üzerinde çalıştığı makine için yerel kodda derleyecektir. Örneğin, Windows makinenizde GCC kullanarak bazı C kodlarını derleyecek olsaydınız, bu kod Windows makinesinde çalışacak şekilde oluşturulur. Oluşturulan yürütülebilir dosya (tipik olarak) ARM mikro denetleyicisinde çalışmayacaktır.

Bu nedenle, indirilecek ve ARM mikro denetleyicisine yazılacak programlar oluşturmak için (şimdiki durumumuzda bu STM32 Nucelo olacaktır), GCC'ye başka bir şey vermemiz gerekiyor: "çapraz derleme" yeteneği. Yani, yerel sistemi (ve işlemcisi) için değil, hedef sistem (ARM mikro denetleyicisi) için bir yürütülebilir dosya oluşturma yeteneği. İşte burada "gcc-arm-none-eabi" devreye giriyor.

Öyleyse "gdb-arm-none-eabi" nedir?

Yeni oluşturulan yürütülebilir dosyayı mikro denetleyiciye indirip yaktıktan (flaşladıktan) sonra, muhtemelen hata ayıklamak isteyeceğiz - kodun satır satır adım adım. GDB, gnu hata ayıklayıcısıdır ve onun da işini yapmak için bir yola ihtiyacı vardır, ancak farklı bir sistemi hedeflemektedir.

Dolayısıyla, GCC için gcc-arm-none-eabi ne ise, GDB için gdb-arm-none-eabi odur.

Önerilen başka bir paket kurulumu "libnewlib-arm-none-eabi" idi. O nedir?

Newlib, gömülü sistemlerde kullanılmak üzere tasarlanmış bir C kütüphanesi ve matematik kütüphanesidir. Hepsi ücretsiz yazılım lisansları altında bulunan ve onları gömülü ürünlerde kolayca kullanılabilir hale getiren çeşitli kitaplık bölümlerinden oluşan bir kümedir.

Ve son olarak, "libstdc++-arm-none-eabi" paketi. Bu oldukça açık; çapraz derleyici için C++ kitaplığıdır; gömülü ARM mikro denetleyicileri için.

Adım 5: Bağlayıcı Dosyası

Bağlayıcı Dosyası
Bağlayıcı Dosyası
Bağlayıcı Dosyası
Bağlayıcı Dosyası

Bir linker betiği oluşturalım.

Bu dosyadaki bir anahtar parça veya blok, MEMORY komutu olacaktır.

--- sourceware.org'dan:

Bağlayıcının varsayılan yapılandırması, kullanılabilir tüm belleğin tahsisine izin verir. MEMORY komutunu kullanarak bunu geçersiz kılabilirsiniz. MEMORY komutu, hedefteki bellek bloklarının konumunu ve boyutunu tanımlar. Bağlayıcı tarafından hangi bellek bölgelerinin kullanılabileceğini ve hangi bellek bölgelerinden kaçınması gerektiğini açıklamak için kullanabilirsiniz. Daha sonra belirli bellek bölgelerine bölümler atayabilirsiniz. Bağlayıcı, bölüm adreslerini bellek bölgelerine göre ayarlayacak ve çok dolu olan bölgeler hakkında uyaracaktır. Bağlayıcı, mevcut bölgelere sığdırmak için bölümleri karıştırmayacaktır. Bir bağlayıcı komut dosyası, MEMORY komutunun birçok kullanımını içerebilir, ancak, tanımlanan tüm bellek blokları, tek bir MEMORY komutu içinde belirtilmiş gibi işlem görür. MEMORY için sözdizimi şöyledir::

HAFIZA

{ isim [(attr)]: KÖKEN = köken, UZUNLUK = len … }

Makaledeki örnek:

/* RAM'in sonunu ve yığın bellek sınırını tanımlayın *//* (STM32F031x6 satırında 4KB SRAM, 4096 = 0x1000) */ /* (RAM, 0x20000000 adresinde başlar) _estack = 0x20001000;

HAFIZA

{ FLASH (rx): MENŞE = 0x08000000, UZUNLUK = 32K RAM (rxw): MENŞE = 0x20000000, UZUNLUK = 4K }

Bu nedenle, kendi kartımız için ne kadar FLASH (programımız ve sabitlerimiz vb. için) ve ne kadar RAM (program tarafından kullanım için; yığın ve yığın, vb.) Bu biraz ilginçleşiyor.

Nucleo ile birlikte gelen güzel küçük kart, flash belleğinin 512 Kbyte olduğunu ve SRAM'ın 80 Kbyte olduğunu söylüyor. Ancak, USB'ye bağlandığında, iki dosyalı bir dosya sistemi olarak monte edilir ve hem dosya yöneticisi hem de GParted, 540+ Kbyte'ın üzerinde alana sahip olduğunu gösterir. (VERİ DEPOSU?).

AMA, dosya yöneticisini kullanarak iki dosyayı silmeye çalışmak, aygıtın bağlantısını kesip yeniden bağlamak, yine de iki dosyayı gösteriyor. (ve dosya yöneticisi bir şeyi tanıdı çünkü her dosyada küçük bir "kilit" simgesi var.

Şimdi karttaki rakamlarla gidelim. Şimdi yukarıdaki örneği alıp özel panomuza dönüştürüyoruz.

Genel KB'den belirli sayıda bayta geçmek için bu çevrimiçi bellek dönüştürücü gibi bir şey kullanmak isteyebilirsiniz.

O zaman çevrimiçi bir ondalık - onaltılık dönüştürücü kullanmak isteyebilirsiniz.

/* RAM'in sonunu ve yığın bellek sınırını tanımlayın */

/* (STM32F031x6 satırında 4KB SRAM, 4096 = 0x1000) *//* örnek*/

/* adım 1: (STM32F303RE üzerinde 80KB SRAM, 81920 = 0x14000) *//* kartımız */

/* adım 2, hex boyutunu onaltılık başlangıç adresine ekleyin (aşağıda). */

/* (RAM 0x20000000 adresinde başlar) */

_yığın = 0x20001000; /* örnek */

_yığın = 0x20014000; /* bizim tahtamız */

HAFIZA {

FLAŞ (rx): MENŞE = 0x08000000, UZUNLUK = 512K

RAM (rxw): MENŞE = 0x20000000, UZUNLUK = 80K

}

Yukarıdaki dosyaya "linker.script.ld" diyelim.

Adım 6: Vektör Tablosu

Vektör Tablosu
Vektör Tablosu

Şimdi bazı çok temel kesme işlemlerini yapmak için küçük bir derleme dosyası (yönergelerle birlikte) oluşturacağız. Makalenin örneğini takip edeceğiz ve "core. S" adlı bir dosya oluşturacağız.

Yine, örnek dosya içeriği burada, ancak özel panomuz için bir değişiklik yaptım:

// Bu talimatlar çipimizin özelliklerini tanımlar ve

// kullanacağımız derleme dili:.syntax unified /* Bu kod alanından sonra aşağıya bakın */ /*.cpu cortex-m0 */ /*Örneğin bu satırını yorumlayın */.cpu cortex-m4 /* bunun yerine tahtamızın korteksini ekleyin. bu adımda yukarıdaki resme bakın */ /*.fpu softvfp */ /* örneğin bu satırını yorumlayın */.fpu vfpv4 /* panomuzun yerine ekleyin; bir FPU'su var */.thumb // Global bellek konumları..global vtable.global reset_handler /* * Gerçek vektör tablosu. * Basitlik için yalnızca RAM boyutu ve 'sıfırlama' işleyicisi * dahildir. */.type vtable, %object vtable:.word _estack.word reset_handler.size vtable,.-vtable

Hmm.. '.align' Yönergesi yok

Ancak, bu kritik değil. Daha fazlası (belki) daha sonra.

.sözdizimi birleşik

.sözdizimi [birleşik | bölünmüş]

Bu yönerge, ARM-Instruction-Set bölümünde açıklandığı gibi Komut Kümesi Sözdizimini ayarlar.

9.4.2.1 Komut Seti Sözdizimi ARM ve THUMB komutları için biraz farklı iki sözdizimi desteklenir. Varsayılan, bölünmüş, ARM ve THUMB talimatlarının kendi ayrı sözdizimlerine sahip olduğu eski stili kullanır..syntax yönergesi aracılığıyla seçilebilen yeni, birleşik sözdizimi.

.fpu vfpv4

GCC derleyicisi, kayan nokta ile ilgili çeşitli seçeneklerle ikili dosyalar üretebilir: soft - FPU'suz CPU'larda çalışmaya uygun - hesaplamalar derleyici tarafından oluşturulan softfp tarafından yazılımda yapılır - FPU'lu veya FPU'suz CPU'larda çalışmaya uygun - varsa bir FPU kullanır. Özel durumumuz için (kendi araştırmanızı yapmanız gerekecek), bu anakartın FPU'su vfpv4 ile uyumludur. Bununla oynamak zorunda kalabilirsiniz. Hatta softfp'de bırakın.

.thumb (vs.arm)

Bu ARM mikro denetleyicisi aslında bir dizi talimat setine sahiptir. Biri ARM, diğeri THUMB. Bir fark, 16-bit talimatlar ile 32-bit talimatlardır. Bu nedenle, bu yönerge derleyiciye sonraki yönergeleri THUMB veya ARM olarak ele almasını söyler.

Dosyanın geri kalanını olduğu gibi alacağız, çünkü bu Instructables henüz kesmeye dayalı montaj programlamasına girmedi.

7. Adım: 'Merhaba Dünya' Programının Montaj Versiyonu

Aşağıdakiler ayrıca önceden oluşturulmuş "core. S" dosyasına da gidebilir. Bu da yine makaledeki örnekten.

/* * Sıfırlama işleyicisi. Sıfırlamada aradı. */.type reset_handler, %function reset_handler: // Yığın işaretçisini yığının sonuna ayarlayın. // '_estack' değeri linker betiğimizde tanımlanmıştır. LDR r0, =_yığın MOV sp, r0

// Bazı kukla değerler ayarlayın. Bu değerleri gördüğümüzde

// hata ayıklayıcımızda, programımızın // chip'e yüklendiğini ve çalıştığını bileceğiz. LDR r7, =0xDEADBEEF MOVS r0, #0 main_loop: // 'r0' kaydı için 1 ekleyin. ADDS r0, r0, #1 // Geri döngü. B main_loop.size reset_handler,.-reset_handler

Bu nedenle, yukarıdaki programın itici gücü, bir çekirdek MCU kaydına (bu durumda R7) tanınabilir bir model ve sıfırdan başlayan artan bir değeri başka bir çekirdek MCU kaydına (bu durumda R0) yüklemektir. Yürütme koduna adım atarsak, R0'ın veri artışını görmeliyiz.

MSP432 ve TI-RSLK kursu/laboratuarları ile ilgili Talimatları takip ediyorsanız, yukarıdaki programın hemen hemen tamamı size aşina olmalıdır.

Görebildiğim tek yeni şey, R7'yi kaydetmek için "DEADBEEF" yüklenirken "=" kullanılması. Biz bunu kullanmamıştık.

Buraya eklenen "core. S" dosyası artık tam kaynağı içeriyor.

Adım 8: Kodun Derlenmesi

Bazı komut satırı işleri yapmanın zamanı geldi. Sonunda gerçek bir şey.

Ancak, tam olarak orada değiliz. Makalede verilen komutu tekrar inceltmeli ve kendi durumumuza göre değiştirmeliyiz.

İşte örnek kod:

arm-none-eabi-gcc -x assembler-with-cpp -c -O0 -mcpu=cortex-m0 -mthumb -Wall core. S -o core.o

GCC için gnu.org sitesine gidersek, (bu durumda sürüm 7.3),

x

-x, dili belirtmek içindir. Aksi takdirde -x yoksa, derleyici dosya uzantısını kullanarak tahmin etmeye çalışacaktır. (bizim durumumuzda, *. S).

Makaleden alınan yukarıdaki örnek, cpp ile assembler'ı belirtir, ancak biz sadece assembler yapabiliriz.

C

-c, derleyin ama bağlantı vermeyin.

O0

-O, optimizasyon seviyesini ayarlamak içindir. -O0 (oh-zero) kullanmak, "derleme süresini azaltın ve hata ayıklamanın beklenen sonuçları üretmesini sağlayın. Bu varsayılandır" diyor.

mcpu=korteks-m0

-mcpu hedef işlemcinin adını belirtir. Bizim durumumuzda korteks-m4 olurdu.

mparmak

-mthumb, ARM ve THUMB durumlarını yürüten kod oluşturma arasında seçim yapılmasını belirtir.

Duvar

-Duvar elbette çok yaygın ve iyi biliniyor. Tüm uyarı bayraklarını açar.

Son olarak, komutun sonunda core. S girdi dosyası ve core.o çıktı dosyası var.

İşte özel durumumuza uygun yeni komut satırı.

arm-none-eabi-gcc -x assembler -c -O0 -mcpu=korteks-m4 -mthumb -Wall core. S -o core.o

Ve bu derlenmiş.

Adım 9: Programı Bağlama

Doğrudan makaledeki örnekten şuna sahibiz:

arm-none-eabi-gcc core.o -mcpu=korteks-m0 -mthumb -Wall --specs=nosys.specs -nostdlib -lgcc -T./STM32F031K6T6.ld -o main.elf

Yukarıdakilerin çoğunu gördünüz. Yenilikler aşağıdadır.

-specs=nosys.specs

Bunu açıklamak biraz zor.

"Yarı barındırma" ve "yeniden hedefleme" ile ilgisi var ve giriş/çıkış ile ilgisi var. Ayrıca sistem çağrıları ve kitaplıklarla da ilgisi var.

Tipik olarak, gömülü sistemler standart giriş/çıkış aygıtları sağlamaz. Bu, sistem veya kitaplık çağrılarını etkiler (örnek: printf()).

Yarı barındırma, hata ayıklayıcının (hata ayıklayıcı kısmı kırmızı daire içine alınmış 11. Adım resmine bakın) özel bir kanalı olduğu ve yarı barındırma protokolünü kullandığı anlamına gelir ve ana makinede printf() çıktısını (hata ayıklayıcı aracılığıyla) görebilirsiniz.

Öte yandan yeniden hedefleme, aynı sistem veya kitaplık çağrılarının başka bir anlama geldiği anlamına gelir. Gömülü sistem için anlamlı olan başka bir şey yaparlar. Bir anlamda, diyelim ki printf() için, yeni bir uygulama var, bu işlevin yeniden hedeflenmiş bir uygulaması.

Tüm bunları söyledikten sonra, --specs=nosys.specs, yarı barındırma olmayacağımız anlamına gelir. Bu normalde yeniden hedeflediğimiz anlamına gelir. Bu bizi bir sonraki bayrağa getiriyor.

nstdlib

Bağlayıcı seçeneği -nostdlib, bağımsız çalışması amaçlanan bir programı bağlamak için kullanılır. -nostdlib, -nodefaultlibs ve -nostartfiles seçeneklerini içerir. Aşağıda iki seçeneği ayrı ayrı ele alıyoruz, ancak en tipik kullanım tek duraklı alışveriş için sadece nostdlib'dir. Barındırılan bir programı bağlarken, libc gibi standart sistem kitaplıkları varsayılan olarak bağlanır ve programa tüm standart işlevlere (printf, strlen ve arkadaşları). -nodefaultlibs bağlayıcı seçeneği, bu varsayılan kitaplıklarla bağlantı kurmayı devre dışı bırakır; yalnızca bağlantılı kitaplıklar, -l bayrağını kullanarak bağlayıcıya açıkça adlandırdığınız kitaplıklardır.

lgcc

libgcc.a, belirli makinelerin eksikliklerinin üstesinden gelmek için dahili alt rutinler sağlayan standart bir kitaplıktır. Örneğin, ARM işlemci bir bölme talimatı içermez. libgcc.a'nın ARM sürümü bir bölme işlevi içerir ve derleyici gerektiğinde bu işleve çağrılar gönderir.

T

Bu, bağlayıcıya bu dosyayı bağlayıcı komut dosyası olarak kullanmasını söylemenin bir yoludur. Bizim durumumuzda dosya adı linker.script.ld'dir.

o ana.elf

Son olarak, bağlayıcıya, cihazımıza yazılacak/flaşlanacak son çıktı görüntü dosyasının adının ne olacağını söyleriz.

Özel durumumuz için değiştirilmiş tam komut satırı versiyonumuz:

arm-none-eabi-gcc core.o -mcpu=cortex-m4 -mthumb -Wall --specs=nosys.specs -nostdlib -lgcc -T./linker.script.ld -o main.elf

Komut dosyasının ve core.o dosyasının, yukarıdaki komut satırını çalıştıracağımız aynı dizinde olduğundan emin oluruz.

Ve sorunsuz bağlanıyor.

Kontrol

Daha sonra çalıştırıyoruz:

arm-none-eabi-nm main.elf

ve şunu elde ederiz:

devchu@chubox:~/Development/Atollic/TrueSTUDIO/STM32_workspace_9.1$ arm-none-eabi-nm main.elf 20014000 A _estack 08000010 t main_loop 08000008 T reset_handler 08000000 T vtable

İyi görünüyor. arm-none-eabi-nm komutu, nesne dosyalarındaki sembolleri listelemenin bir yoludur.

Adım 10: STM32 Nucleo-64 Bağlantısının Test Edilmesi

STM32 Nucleo-64'e Bağlantı Testi
STM32 Nucleo-64'e Bağlantı Testi
STM32 Nucleo-64'e Bağlantı Testi
STM32 Nucleo-64'e Bağlantı Testi

Kabul etmeyi seçerseniz ilk göreviniz, sisteminizin geliştirme panonuzu görmesini sağlamaktır.

Windows'u kullanma

Windows için TrueSTUDIO'yu Atollic'ten (ücretsiz sürüm) kurmaya karar verdim. Sorunsuz bir kurulum oldu ve bağlantıyı test etmek için st-link'i kullanabilmem için sürücüyü otomatik olarak kurdu. TrueSTUDIO'yu kurduğumda ve cihaz yöneticisi cihazı gördüğünde, takip ettiğimiz Bare Metal makalesinde önerilen texan/stlink araçlarını indirdim. Klasörü tekrar doğrudan "C:\" altına yerleştirdim ve yerel cygwin ana kutumdan komutlara bazı bağlantılar oluşturdum.

ln -s /c/STM32. MCU/stlink-1.3.0-win64/bin/st-info.exe ~/bin/st-info

Cihazla gerçekten iletişim kurup kuramayacağımızı görmek için ilk test olarak şunu koştum:

st-info --probe

Ve geri döndüm:

1 stlink programcısı bulundu

Artık geliştirme panomuzu konuşabileceğimizi/sorgulayabileceğimizi biliyoruz.

Linux'u Kullanmak

Linux için gerçekten bir sürücüye ihtiyacınız yok. Ancak Debian için st araçlarını kaynaktan oluşturmanız gerekecek.

git klonu

libusb-1.0-0-dev'in kurulu olduğundan emin olun.

uygun liste | grep -E "*libusb.*dev*"

Görmelisin:

libusb-1.0-0-dev/xenial, şimdi 2:1.0.20-1 amd64 [kurulu]

ya da böyle bir şey.

Yüklemek için:

sudo apt-get install libusb-1.0-0-dev

Yukarıdakilerin aynı olmadığını unutmayın:

sudo apt-get install libusb-dev

Doğru eksik libusb dev, cmake'in sorun yaşamasına neden olabilir.

CMake Hatası: Bu projede aşağıdaki değişkenler kullanılmaktadır, ancak bunlar NOTFOUND olarak ayarlanmıştır. Lütfen bunları ayarlayın veya CMake dosyalarında doğru şekilde ayarlanıp test edildiklerinden emin olun: LIBUSB_INCLUDE_DIR (GELİŞMİŞ)

Projenin kök dizinine geçin (…blah/blah /stlink). Bir "serbest bırakma" yapın.

Bu derlemeden sonra, araçlar ".. /build/Release" altında olmalıdır.

Daha sonra "st-info --probe" komutunu çalıştırabilirsiniz. İşte Nucleo bağlıyken çıktı, o zaman değil.

devchu@chubox:~/Development/stlink$./build/Release/st-info --probeFound 1 stlink programcıları seri: 303636414646353034393535363537 openocd: "\x30\x36\x36\x41\x46\x46\x35\x30\x34\ x39\x35\x35\x36\x35\x37" flash: 524288 (sayfa boyutu: 2048) sram: 65536 chipid: 0x0446 açıklama: F303 yüksek yoğunluklu cihaz devchu@chubox:~/Development/stlink$./build/Release/st- info --probe 0 stlink programcısı bulundu devchu@chubox:~/Development/stlink$

Adım 11: GDB'yi Linux ile Kullanalım

GDB'yi Linux ile Kullanalım
GDB'yi Linux ile Kullanalım
GDB'yi Linux ile Kullanalım
GDB'yi Linux ile Kullanalım

Tüm bunları denediyseniz ve bu noktaya kadar geldiyseniz - harika! Harika. Şimdi biraz eğlenelim.

Bu ARM geliştirme kartlarını satın aldığınızda, ister Texas Instruments'ın MSP432 Launchpad'i, ister şu anda tartıştığımız bu, Nucleo-F303 (STM32 Nucleo-64), genellikle zaten çalışan bir programla yanıp sönerek gelirler. LED'lerin yanıp sönme hızını değiştirmek için bir anahtara basmayı da içeren bazı yanıp sönen program.

Bunun üzerine bu kadar hızlı yazmadan önce, görülecek ve yapılacak ne olduğuna bir bakalım.

Linux ile bir terminal açın, az önce oluşturduğumuz stlink git projesinin dizinini değiştirin ve st-util aracını bulun.

devchu@chubox:~/Development/stlink$ find. -name st-util

./build/Release/src/gdbserver/st-util

O aracı çalıştırın. st-info --probe ile bağlantımızı daha önce test ettiğimiz için, şöyle bir çıktı almalıyız:

st-util 1.4.0-50-g7fafee2 2018-10-20T18:33:23 INFO common.c: Cihaz parametreleri yükleniyor…. 2018-10-20T18:33:23 INFO common.c: Bağlı cihaz: F303 yüksek yoğunluklu cihaz, id 0x10036446 2018-10-20T18:33:23 INFO common.c: SRAM boyutu: 0x10000 bayt (64 KiB), Flash: 2048 baytlık sayfalarda 0x80000 bayt (512 KiB) 2018-10-20T18:33:23 BİLGİ gdb-server.c: Çip Kimliği 00000446, Çekirdek Kimliği 2ba01477'dir. 2018-10-20T18:33:23 BİLGİ gdb-server.c: *:4242…

Bu, şu anda çalışan GDB sunucusudur ve geliştirme panomuzu görür ve daha da önemlisi, 4242 numaralı bağlantı noktasını (varsayılan bağlantı noktası) dinler.

Artık GDB istemcisini çalıştırmaya hazırız.

Linux'ta başka bir terminal açın, şunu girin:

arm-none-eabi-gdb -tui

Bu, gdb'yi kesinlikle komut satırında çalıştırmakla aynıdır, ancak bunun yerine metin tabanlı bir terminal üretir (benim tahminim, küfür kullandığıdır).

GDB istemcimiz ve GDB sunucumuz çalışıyor. Ancak, istemci sunucuya bağlı değil. Şu anda bizim Nucleo'muz (veya seçtiğiniz yönetim kurulu) hakkında hiçbir şey bilmiyor. Bunu söylemeliyiz. Terminalde, isteminiz şimdi "(gdb)" olmalıdır. Girmek:

yardım hedefi

Size bir liste verecektir. İstediğimizin hedef genişletilmiş-uzak olduğuna dikkat edin - Seri hat üzerinden uzak bir bilgisayar kullanın.

Ama aynı zamanda yerini de vermeliyiz. Bu nedenle, (gdb) isteminde şunu girin:

(gdb) hedef genişletilmiş-uzak yerel ana bilgisayar:4242

Bunun gibi bir yanıt geri almalısınız:

(gdb) hedef genişletilmiş-uzak yerel ana bilgisayar:4242

localhost:4242 0x080028e4 kullanarak uzaktan hata ayıklama ?? ()

Bu arada, st-util gdbserver'ı çalıştıran terminalde şunu aldık:

2018-10-20T18:42:30 BİLGİ gdb-server.c: 6 hw kesme noktası kaydı bulundu

2018-10-20T18:42:30 BİLGİ gdb-server.c: GDB bağlandı.

Adım 12: Programımızı Windows ve Flash İle Tekrar Edelim

Tekrarlayalım, Windows ve Flash Programımız İle
Tekrarlayalım, Windows ve Flash Programımız İle
Tekrarlayalım, Windows ve Flash Programımız İle
Tekrarlayalım, Windows ve Flash Programımız İle
Tekrarlayalım, Windows ve Flash Programımız İle
Tekrarlayalım, Windows ve Flash Programımız İle

st-util gdbserver ve arm-none-eabi-gdb istemcisini çalıştırma adımları aslında önceki Adımda yaptığımızla aynıdır. İki terminal açarsınız (cygwin, DOS cmd veya Windows Powershell), st-util'in yerini bulun, çalıştırın. Diğer terminalde arm-none-eabi-gdb istemcisini çalıştırın. Tek fark, -tui (terminal tabanlı metin görünümü) modunun büyük olasılıkla desteklenmemesidir.

Yukarıdakiler Windows'ta işe yaradıysa, muhtemelen durmanız gerekecek (yalnızca istemci). Bu noktada, bir şekilde derleme dosyanızın ("core.out") olduğu GDB istemcisini çalıştırmanız veya bu dosyanın tüm yolunu GDB istemcisine bir argüman olarak eklemeniz gerekir.

Cygwin'i kullanarak ve yerel $HOME//bin dizinimden bu araçların her ikisinin de bulunduğu yere bağlantılar oluşturarak hayatımı basitleştirdim.

Tamam, daha önce olduğu gibi derledik ve bağladık ve flash edilmeye hazır main.elf dosyamız var.

Bir pencerede çalışan st-util var. GDB istemcisini yeniden başlatıyoruz, bu sefer şunu yapıyoruz:

arm-none-eabi-gdb main.elf

Başlamasına izin veriyoruz, (gdb) istemini bekliyoruz, aynı bağlantı komutumuzu GDB sunucusuna (st-util) yapıyoruz ve yürütülebilir dosyayı flash etmeye hazırız. Çok anti-iklimsel:

(gdb) yük

Cygwin terminalleriyle çalışırken, bazen konsol komutlarının çıktı vermemesiyle ilgili bilinen bir sorun vardır. Yani bizim durumumuzda sunucuyu çalıştıran pencere tamamen sessizdi. Yükü çalıştırdığımız istemciyi çalıştıran şunun çıktısını alır:

Yükleme bölümü.text, boyut 0x1c lma 0x8000000Başlangıç adresi 0x8000000, yükleme boyutu 28 Aktarım hızı: 1 KB/sn, 28 bayt/yazma.

Adım 13: Linux ile Flashing - Daha Ödüllendirici:D

Linux ile Yanıp Sönme - Daha Fazla Ödül:D
Linux ile Yanıp Sönme - Daha Fazla Ödül:D

Adım 14: Biraz Daha Derine Dalalım

Buraya geldiysen, mükemmel. Hadi devam edelim.

Yürütülebilir dosya olan main.elf dosyasının içine neden bakmıyorsunuz? Aşağıdakileri çalıştırın:

arm-none-eabi-objdump -d main.elf

Bunun gibi bir çıktı görmelisiniz:

main.elf: dosya biçimi elf32-littlearm

.text bölümünün sökülmesi:

08000000:

8000000: 00 40 01 20 09 00 00 08.@. ….

08000008:

8000008: 4802 ldr r0, [pc, #8]; (8000014) 800000a: 4685 mov sp, r0 800000c: 4f02 ldr r7, [pc, #8]; (8000018) 800000e: 2000 hareket r0, #0

08000010:

8000010: 3001, r0, #1 8000012: e7fd b.n 8000010 8000014: 20014000.word 0x20014000 8000018: deadbeef.word 0xdeadbeef ekler

Yukarıdaki çıktıdan hangi küçük külçeleri alabiliriz?

Linker.script.ld dosyasını tartışırken ve oluştururken hatırlayacak olursanız, bu ARM cihazlarının 0x20000000'den başlayan RAM'e sahip olduğunu ve FLASH belleğin 0x08000000'de başladığını belirtmiştik.

Böylece, programın gerçekten öyle olduğunu görebiliriz ki, hepsi FLASH bellekte bulunur.

Daha sonra, yukarıda, ancak daha sonraki bir Adımda, "Merhaba Dünya" kısmını reddettiğimizde, bir MCU çekirdek kaydına ("R7") anında, sabit, değişmez bir değer ("0xDEADBEEF") yüklediğimiz bir ifade vardı.

Açıklama şöyleydi:

LDR R7, =0xDEADBEEF

Kodumuzda, DEADBEEF'ten bahsettiğimiz tek yer burası. Başka hiçbir yerde. Yine de, yukarıdaki demonte/yeniden oluşturulmuş talimatlara vb. bakarsanız, DEADBEEF ile ilgili düşündüğümüzden daha fazlası var.

Bu nedenle, derleyici/bağlayıcı bir şekilde DEADBEEF'in değerini 0x8000018 konumundaki bir FLASH adresine kalıcı olarak flash etmeye karar verdi. Ardından, derleyici yukarıdaki LDR talimatımızı şu şekilde değiştirdi:

LDR R7, [PC, #8]

Hatta bizim için bir yorum oluşturdu. Ne güzel. Ve bize mevcut program sayaç değerini (PC kaydı) almamızı, bu değere 0x8 eklememizi ve DEADBEEF'in yakıldığı yer burasıdır ve bu değeri alıp R7'ye doldurmamızı söyler.

Bu aynı zamanda program sayacının (PC) ana_döngünün başlangıcı olan 0x8000010 adresini işaret ettiği ve DEADBEEF değerinin ana_döngünün bitiminden sonra iki adreste oturduğu anlamına gelir.

Adım 15: Son olarak, Çalışan Programa Kısa Bir Bakış

GDB'den çıksanız bile, komutu tekrar girin. Herhangi bir dosya vermenize bile gerek yok; artık yanıp sönmüyoruz, sadece çalıştırıyoruz.

GDB istemcisini GDB sunucusuna yeniden bağladıktan sonra, (gdb) komut isteminde:

(gdb) bilgi kayıtları

Bunun gibi bir şey görmelisiniz:

r0 0x0 0

r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 sp 0x20014000r 0x200172ffffr 42x2001724000l

Ancak, (gdb) isteminde şunu girin:

(gdb) devam et

Ve çok hızlı bir şekilde CTRL-C'ye basın. Bu programı duraklatmalıdır. "Bilgi kayıtları" komutunu tekrar girin.

Bu sefer farklı görünüyor:

(gdb) bilgi kayıtları

r0 0x350ffa 3477498 r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0xdeadbeef 3735928559 r8 0x0 0 r9 0x0 0 r10 0x04000 0 ffx r12 0x1 0x000 0 ffxl 0x1 0200 16777216

Ne oldu? Tam olarak istediğimiz şey. DEADBEEF, R7'ye yüklendi ve R0 (son derece hızlı) artıyor. Tekrar ederseniz, R0'ı başka bir değerle tekrar göreceksiniz.

Adım 16: Flash'ta Salt Okunur Bir Dizi Oluşturmak İstedik

Derleme ve yönergeleri kullanarak bir dizinin eşdeğerini oluşturmanın bir yolu aşağıdaki gibidir:

.type myarray, %object // 'myarray' adı veya etiketi bir nesne türü olarak tanımlanır.

myarray: // bu, 'myarray' bildiriminin başlangıcıdır // (nelerden oluşacaktır)..word 0x11111111 //'myarray'de bulunan ilk üye veya değer..word 0x22222222 //ikinci değer (bitişik adresler)..word 0x33333333 //vb..size myarray,.-myarray // derleyici/birleştirici artık 'myarray'ın bitişinin veya // sınırının nerede olduğunu biliyor.

Artık FLASH bellekte kurduğumuza göre programda kullanabiliriz. Aşağıda bir bölüm var:

LDR R1, myarray // bu, 'myarray' 1. konumunda bulunan verileri yükler. // bizim istediğimiz bu değil.

LDR R1, =myarray // bu, konum değerinin kendisini yükler (1. adres), // veri değil.. // bizim istediğimiz bu.

MOV R2, #0 // R2, çekip gitmediğimizden emin olmak için bir sayı tutacak

// dizinin sonu. LDR R3, =myarrsize // R3, 'myarrsize' eşdeğeri olacaktır.

// R0 verilerimizi tutacak

Ana döngü:

LDR R0, [R1] // R1 ('myarray') ile gösterilen verileri R0'a yükleyin. CMP R2, R3 // Dizi sınırında mıyız? BEQ main_loop // Eğer öyleyse, işimiz bitti, yani sonsuza kadar döngü yapacağız.

ADD R2, #1 // Aksi takdirde diziyi yinelemeye devam edebiliriz.

ADD R1, #4 // R1'i kaydetmek için 4 ekleyin, böylece bir sonrakine doğru işaret eder

// adres..

B main_loop // Geri döngü.

Video tüm bunlardan geçiyor ve içinde bir hata var. Bu iyi; çalıştırma ve hata ayıklama kodunun önemli olduğunu gösterir. Bir dizinin sonundan uzaklaşmanın klasik bir örneğini gösterir.

Önerilen: