Mündəricat:

Beləliklə, "Mavi həbinizə" STM32duino Bootloader yükləyirsiniz Bəs indi nə ?: 7 addım
Beləliklə, "Mavi həbinizə" STM32duino Bootloader yükləyirsiniz Bəs indi nə ?: 7 addım

Video: Beləliklə, "Mavi həbinizə" STM32duino Bootloader yükləyirsiniz Bəs indi nə ?: 7 addım

Video: Beləliklə,
Video: Ərçimanlıların mavi yanacaq problemi | Kanal S Xəbər 2024, Iyul
Anonim
Beləliklə, STM32duino Bootloader -ı yükləyirsiniz
Beləliklə, STM32duino Bootloader -ı yükləyirsiniz
Beləliklə, STM32duino Bootloader -ı yükləyirsiniz
Beləliklə, STM32duino Bootloader -ı yükləyirsiniz

STM32duino bootloader və ya digər oxşar sənədlərin necə yükləndiyini izah edən təlimatlarımı oxumusunuzsa, yükləmə kodu nümunəsini sınayın və … heç bir şey olmaya bilər.

Problem budur ki, "Ümumi" STM32 üçün bütün nümunələr olmasa da bir çoxu qutudan çıxmayacaq. STM32 "Mavi həb" lövhənizdə işləmək üçün kiçik dəyişikliklər edilməlidir.

Nəyi və nəyə görə dəyişdirmək lazım olduğunu izah etmək üçün 4 kod nümunəsi seçəcəyəm. Kodlar: "BlinkWithoutDelay", "Solma", "Dimmer" və "AnalogInSerial".

Qeyd edim ki, heç nəyi kodlaşdırmamışam. Sadəcə olaraq yaradılan kodlarda kiçik dəyişikliklər edirəm:

David A. Mellis və Tom Igoe, Marti Bolivar və bəzi hallarda Scott Fitzgerald tərəfindən dəyişdirildi

Tom Igoe və gec Bryan Newbold tərəfindən dəyişdirildi

Buna görə də, yaradıcılıq krediti saxlayaraq, dəyişdirdiyim kodlarda belə müəlliflərin adlarını saxlamağı üstün tuturam.

Addım 1: Sancaqlar və Sancaqlar…. Niyə Kod işləmir?

Sancaqlar və sancaqlar…. Kod niyə işləmir?
Sancaqlar və sancaqlar…. Kod niyə işləmir?

Gəlin STM32 "Mavi həb" pinini nəzərdən keçirək. Qeyd sancaqları PA1 və ya PC2 olaraq təyin olunur …. kimi bir şey.

Məsələn, "BlinkWithoutDelay" kod nümunəsinə nəzər salsanız, pin "33" olaraq elan olunur … Niyə?

Cənab Marti Bolivarın bu kodu MAPLE lövhəsi üçün daşıdığından şübhələnirəm.

Düşünürəm ki, kodun "Mavi həb" lövhələrinə uyğun gəlməsinə icazə vermədi.

Maple və Maple mini lövhə pinləri, Arduino kimi, rəqəmsal olaraq elan edilir, baxmayaraq ki, 33, 24 kimi nömrələrdən istifadə edirlər.

Dedim kod işləmir? Mənim səhvim. Kod heç bir səhv etmədən tərtib edilir və "Mavi həb" ə düzgün yüklənir, buna görə mənim fikrimcə həqiqətən işləyir, amma GPIO çıxışı istifadə edərək gözləmirik. Hətta mövcud olmaya da bilər.

Gözlənildiyi kimi işləməsi üçün kodda az dəyişiklik lazımdır.

Addım 2: Bəzi pinləri "təyin edək"

Gəlin
Gəlin

Resursları dəyişənləri və ya sabitləri asanlıqla müəyyən etmək və ya mənalandırmaq kimi elan etmək yaxşı bir kod tətbiqidir. Kodunuzu başa düşməyinizi və problemlərin həllini asanlaşdıracaq.

Arduino pinlərini aşağıdakı kimi elan etdim:

const int ledPin = 13;

…"

Məndən xoşunuz gəlirsə, bəlkə özünüzdən soruşursunuz: "PC13 kimi adları olan sancaqları necə elan edə bilərəm ???"

Cavab: "#define" C ifadəsini istifadə edin.

Beləliklə, pinout çəkilişinə görə, PC13, "BluePill" -də LED lövhəmizdə olan pimdir. İstifadə etmək üçün kitabxanalar tərifindən sonra (#daxildir…) və hər şeydən əvvəl bunu belə elan edərdim:

#LedPin PC13 təyin edin

…"

Qeyd edək ki, ";" yoxdur xətt sonu, NOR "=" təyin.

Hər iki kodu müqayisə edin. Biri IDE -dən yüklənmiş orijinal nümunədir. İkincisi, "BluePill" ilə işləmək üçün bəzi düzəlişlər etdim.

Kodda istifadə etmək istədiyiniz bütün sancaqları elan etməyi şiddətlə tövsiyə edirəm. Hətta ADC girişi olaraq istifadə etmək niyyətində olanlar da (bu barədə daha sonra).

Bu, həyatınızı asanlaşdıracaq.

Addım 3: PinMode ()… Pinlərinizi necə istifadə edəcəksiniz …

Davam etmədən əvvəl PinMode () funksiyasını başa düşək.

Arduino kimi, STM32 pinlərinin də bir çox funksiyası var. Birini və ya birini seçməyin ən sadə yolu pinMode () ifadəsini istifadə etməkdir.

Arduino'da yalnız 3 rejim mövcuddur: GİRİŞ, ÇIXIŞ və ya GİRİŞ_DÜŞDÜRMƏ.

STM32, digər tərəfdən pinMode () ləzzətlərinə malikdir. Onlar:

Çıxış -Əsas rəqəmsal çıxış: pin YÜKSEK olduqda, gərginlik +3.3v (Vcc) səviyyəsində saxlanılır və DÜŞÜK olduqda yerə endirilir

OUTPUT_OPEN_DRAIN -Açıq drenaj rejimində pin yerə cərəyan qəbul edərək "aşağı", artan empedans təmin edərək "yüksək" göstərir

INPUT_ANALOG -Bu, pinin analoq (rəqəmsal deyil) oxumaq üçün nə vaxt istifadə ediləcəyi üçün xüsusi bir rejimdir. Pində gərginlik üzərində ADC çevrilməsini təmin edir

INPUT_PULLUP -Bu rejimdəki pin vəziyyəti INPUT ilə eyni şəkildə bildirilir, lakin pin gərginliyi yumşaq şəkildə +3.3v -ə doğru "çəkilir"

INPUT_PULLDOWN -Bu rejimdəki pin vəziyyəti INPUT ilə eyni şəkildə bildirilir, lakin pin gərginliyi yumşaq bir şəkildə 0v -ə doğru "aşağı çəkilir"

INPUT_FLOATING -GİRİŞ sinonimi

PWM -Bu, PWM çıxışı üçün pinin nə vaxt istifadə ediləcəyi üçün xüsusi bir rejimdir (rəqəmsal çıxışın xüsusi bir vəziyyəti)

PWM_OPEN_DRAIN -PWM kimi, LOW və HIGH dəyişən dövrləri əvəzinə, pindəki gərginlik LOW və üzən (əlaqəsiz) dövrlərindən ibarətdir

(qeyd: https://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/latest/lang/api/pinmode.html#lang-pinmode saytından götürülmüşdür)

Bu mötərizəni açıram, çünki öz kodunuzu yaratmağa başlayanda ehtiyacınız üçün düzgün pinMode () istifadə etməkdə diqqətli olun.

Addım 4: AnalogWrite () Versus PwmWrite ()… 2 Ləzzətdə Analog Çıxış

AnalogWrite () Versus PwmWrite ()… 2 Ləzzətdə Analog Çıxış
AnalogWrite () Versus PwmWrite ()… 2 Ləzzətdə Analog Çıxış
AnalogWrite () Versus PwmWrite ()… 2 Ləzzətdə Analog Çıxış
AnalogWrite () Versus PwmWrite ()… 2 Ləzzətdə Analog Çıxış

"Blue Pill" GPIO pinlərindən istifadə etməzdən əvvəl davranışını, yəni necə işləyəcəyini bildirmək lazımdır. PinMode () funksiyası tam olaraq budur.

Beləliklə, indi analog çıxışın nə qədər düzgün qurulduğuna diqqət yetirək. Ya Çıxış rejimi, ya da PWM rejimi olaraq elan edilə bilər.

Eyni şəkildə, analog dəyərlər GPIO -ya 2 şəkildə aid edilə bilər: analogWrite () və ya pwmWrite (), AMA analogWrite () yalnız pinMode () = Çıxış olduqda işləyəcək. Digər tərəfdən, pwmWrite () yalnız pinMode () = PWM olduqda işləyəcək.

Məsələn, PA0 -u götürək: analoq/pwm çıxış namizədidir.

analogWrite (): bu şəkildə bəyan edir:

….

#dePine PA0 təyin edin

pinMode (ledPin, Çıxış);

analogWrite (ledPin, <sayı>);

……"

burada rəqəm Arduino kimi 0 ilə 255 arasında olmalıdır. Əslində Arduino ilə geriyə uyğun gəlir.

pwmWrite (): bu şəkildə bəyan edin:

#dePine PA0 təyin edin

pinMode (ledPin, PWM);

pwmWrite (ledPin, <sayı.>);

…."

Nömrənin 0 ~ 65535 arasında olması lazım olduğu yerlərdə, Arduinodan daha yüksək bir qətnamə.

Şəkillərdə 2 kodu müqayisə etmək mümkündür. Orijinal kodu da görə bilərsiniz.

Addım 5: STM32 Serial Rabitə

STM32 Serial Əlaqəsi
STM32 Serial Əlaqəsi

USART interfeyslərinin STM32 -də necə qurulduğunu görək. Bəli, çoxluqdakı interfeyslər ….

"Blue Pill" -də 3 USART (RX/ TX 1 ~ 3) var və bir bootloader istifadə edirsinizsə USB -dən istifadə etməyə imkan verir, o zaman heç birinə bağlı deyil.

USB istifadə etməyinizdən və ya istifadə etməməyinizdən asılı olaraq kodunuzda serial portunu bu və ya digər şəkildə elan etməlisiniz.

Vəziyyət 1: USB istifadə edərək:

Bu şəkildə eskizlər birbaşa USB vasitəsilə endirilir. BOOT0 tullananını 1 mövqeyə və geri 0 -a köçürməyə ehtiyac yoxdur.

Bu vəziyyətdə, indeksi olmayan "Serial" elan etdiyiniz zaman USB vasitəsilə əlaqə deməkdir.

Beləliklə, Serial1, TX/ RX 1 deməkdir (PA9 və PA10 pinləri); Serial2, TX/ RX 2 (PA2 və PA3 sancaqları) və Serial 3 TX/ RX 3 (Pins PA10 və PA11) deməkdir.

Çalışdığımız yoldur. Bu kodlaşdırma üsulu üçün nümunələrdə dəyişikliklər təqdim edəcəyəm.

Başqa bir şey: "Serial USB" nin işə salınması lazım deyil. Başqa sözlə, "… Serial.begin (15200);" lazım deyil.

Hər hansı bir Serial funksiyasına (Serial.read (), Serial.write () və s.) Heç bir başlanğıc olmadan zəng etmək mümkündür.

Nədənsə kodda varsa, tərtibçi buna məhəl qoymayacaq.

Məsələ 2: TTL seriyasından USB adapterə istifadə:

Bu şəkildə, bootloader yerli STM32 USB əlaqəsini dəstəkləmir, buna görə eskizləri yükləmək üçün TX/ RX 1 -ə (pin PA9 və PA10) qoşulmuş USB -dən serial adapterə ehtiyacınız var.

Bu vəziyyətdə, indeksi olmayan "Serial" hər zaman koddur, TX/ RX1 deməkdir (kodu yükləmək üçün istifadə olunan port). Beləliklə, Serial1 TX/ RX 2 -yə (PA2 və PA3 sancaqları) və Serial2 TX/ RX 3 -ə (Pins PA10 və PA11) aiddir. Serial3 yoxdur.

Addım 6: Dəyəri Mikrokontrolörə ötürmək

Mikro nəzarətçiyə dəyər ötürülməsi
Mikro nəzarətçiyə dəyər ötürülməsi

Dimmer nümunəsi, mikrokontrolörə bir dəyərin necə keçdiyini göstərmək üçün sadə bir yoldur.

LED parlaqlığını idarə etmək üçün 0 -dan 255 -ə qədər bir dəyər keçməyi düşünürük.

Blue Pill -də gözlənildiyi kimi işləməyəcək:

  1. PwmWrite () funksiyasından istifadə etmək üçün pinMode () PWM rejimi elan edilməlidir.
  2. Heç vaxt 3 rəqəmdən ibarət tam rəqəm almayacaqsınız. Serial.read () funksiyası yalnız "BYTE" olan bufer məzmununu tutur. "100" yazıb "enter" düyməsini basarsanız, yalnız son "0" buferdən alınacaq. Və dəyəri "48" olacaq ("0" üçün onluq ASCII dəyəri). "100" dəyərini vermək niyyətindəsinizsə "d" yazmalısınız. Beləliklə, LED parlaqlığında bir ASCII simvolu ondalık dəyərini çevirəcəyini söyləmək doğrudurmu?… Yaxşı, bir növ…
  3. Problem, dəyərləri birbaşa Serial.read () funksiyasından xəritələmək bir hiyləgər hərəkətdir. Gözlənilməz dəyərlər əldə etmək demək olar ki, müəyyəndir. Daha yaxşı bir yanaşma, müvəqqəti bir dəyişəndə saxlama tampon məzmunu və xəritələndirməkdir.

2 -ci maddədə əvvəl izah etdiyim kimi, dəyişikliklər təqdim etdiyim kod, ASCII simvolu daxil etməyə imkan verəcək və bu, ASCII onluq dəyərinə əsaslanan LED parlaqlığını idarə edəcək … məsələn, "boşluq" dəyəri 32 -dir (əslində daxil edə biləcəyiniz ən aşağı çap olunan xarakterdir) və "}" ən yüksək olanı mümkündür (dəyər 126). Digər simvollar yazdırıla bilməz, buna görə terminal başa düşməyəcək və ya bir xarakter birləşməsi ola bilər ("~" kimi klaviaturamdakı ölü bir düymədir və düzgün işləməyəcək). Bu o deməkdir ki, bu mürəkkəb xarakter, terminala daxil olduqda, xarakterin özünü və başqa bir şey göndərəcəkdir. Adətən çap olunmayan bir materialdır. Və bu son bir kod ələ keçirəcək. Ayrıca, Terminalınızı da unutmayın, bu halda nə "Daşınma Qayıdışı" nə də "Xətt Feed" i göndərməməlisiniz. Kodun düzgün işləməsi üçün buna diqqət yetirməlisiniz.

Yıxılsan, bir az qarışıq olar, ən pis olar ….

Addım 7: Və Üç Rəqəm Yazmaq İstəsəm …. və ya daha çox ??

Və Üç Rəqəm Yazmaq İstəsəm …. və ya daha çox ??
Və Üç Rəqəm Yazmaq İstəsəm …. və ya daha çox ??

Serial ünsiyyətdən birdən çox xarakter almaq sadə bir iş deyil.

Serial tampon, FIFO bayt simvol yığımıdır. İstənilən vaxt Serial.read () funksiyası çağırıldıqda, göndərilən ilk sim yığından yığılır və başqa yerdə saxlanılır. Adətən kodda bir char dəyişənidir. Diqqət yetirin, avadanlıqdan asılıdır, adətən qeyd buferinin məlumatı necə saxlaya biləcəyi üçün bir fasilə var.

Birdən çox rəqəmi ardıcıl olaraq daxil etmək niyyətindəsinizsə, UART tamponuna daxil olduqları üçün xarakterə görə simli simvol "tərtib etməlisiniz".

Bu, velosiped sürməyin hər bir tampon char oxuduğunu, bir temp dəyişənində saxladığını, bir sətir dizisinin ilk mövqeyinə yüklədiyini, bir sonrakı mövqeyə keçdiyini və tətbiqdən asılı olmayaraq yenidən başlaması deməkdir. Dövrü bitirməyin 2 yolu var:

  1. Bəzi "bitiş işarəsi" xarakterindən istifadə edərək, məsələn, "arabanın geri qaytarılması" və ya "sətrin ötürülməsi". "Son İşarəsi" simvolu tapılan kimi döngə bitir.
  2. Alternativ olaraq, simli zəncirdəki simvolların sayı məhdudlaşdırıla bilər, buna görə də interaktiv dövrlərin sayı məhdudlaşdırıla bilər. Limitə çatanda, deyək ki, 4, öz -özünə rutin bitirmələr əldə edin.

Bunun necə edildiyini sadə bir nümunəyə nəzər salaq:

  • '\ N' kimi bir "son" simvolu təyin edin (bu, xətt axını ASCII simvolu deməkdir).
  • bu arada loop Serial.available () doğrudur
  • Serial.read () saxlanması müvəqqəti bir char dəyişəni ilə nəticələnir. Unutmayın: Serial.read () əslində tamponu "oxuyur", o təmizdir və növbəti simvol ona yüklənir.
  • Bu simvol ilə simli dəyişənləri artırın
  • Son char "end" dirsə, loopdan çıxın.

Ümumiyyətlə, serial xarakterli sıra əldə etmək üçün gündəlik şəkilə bənzəyir.

Cənab David A. Mellisin orijinal kodunun geniş bir uyğunlaşmasına əsaslanır.

Sərbəst olaraq sınayın və istifadə edin. Unutmayın: dəyərlər 3 rəqəm formatında daxil edilməlidir.

Əlavə serial ünsiyyət detallarında özümü uzatmayacağam. Buranı əhatə etmək çox mürəkkəbdir və öz İntructables -a layiqdir.

Ümid edirəm Blue Pill -də nümunələr istifadə etməyinizə və bu kiçik lövhənin nə qədər düzgün kod veriləcəyinə dair bir az məlumat verməyinizə kömək edər.

Ətraflı başqa təlimatlarla görüşərik.

Tövsiyə: