Sadržaj:

Dakle, učitavate STM32duino Bootloader u svoju "plavu pilulu" Pa što sad?: 7 koraka
Dakle, učitavate STM32duino Bootloader u svoju "plavu pilulu" Pa što sad?: 7 koraka

Video: Dakle, učitavate STM32duino Bootloader u svoju "plavu pilulu" Pa što sad?: 7 koraka

Video: Dakle, učitavate STM32duino Bootloader u svoju
Video: Empezar con STM32 - PCB y Rádio NRF24 + Bootloader 2024, Juli
Anonim
Dakle, učitavate STM32duino Bootloader u svoj
Dakle, učitavate STM32duino Bootloader u svoj
Dakle, učitavate STM32duino Bootloader u svoj
Dakle, učitavate STM32duino Bootloader u svoj

Ako ste već pročitali moje upute koje objašnjavaju kako učitati STM32duino bootloader ili bilo koju drugu sličnu dokumentaciju, isprobajte primjer učitavanja koda i ….može se dogoditi da se ništa ne dogodi.

Problem je u tome što mnogi, ako ne i svi primjeri za "generički" STM32 neće uspjeti. Bit će potrebne manje promjene da biste započeli s radom na ploči STM32 "Blue Pill".

Odabrat ću 4 primjera koda da objasnim šta treba promijeniti i zašto. Kodovi su: "BlinkWithoutDelay", "Fading", "Dimmer" i "AnalogInSerial".

Napomena: NISAM ništa kodirao. Samo izdajem manje izmjene u kodovima koje su stvorili:

David A. Mellis i kasno izmijenili Tom Igoe, Marti Bolivar i neki slučajevi Scott Fitzgerald

Tom Igoe, a kasnije je izmijenio Bryan Newbold

Zato radije zadržavam imena autora čak i u kodovima koje mijenjam, zadržavajući zasluge za stvaranje.

Korak 1: Igle i iglice …. Zašto kôd ne radi?

Igle i iglice …. Zašto kôd ne radi?
Igle i iglice …. Zašto kôd ne radi?

Pogledajmo pin STM32 "Blue Pill". Igle za napomene su identifikovane kao PA1 ili PC2 ….nešto slično.

Ako pogledate, na primjer, primjer koda "BlinkWithoutDelay", pin je deklariran kao "33" …. Zašto?

Pretpostavljam da je to zato što je gospodin Marti Bolivar prenio ovaj kod za MAPLE ploču.

Mislim da mu nije bila namjera dopustiti kod kompatibilan sa pločama "Blue Pill".

Igle za mini ploču Maple i Maple numerički su deklarirane, poput Arduina, iako koriste brojeve poput 33, 24 i neke poput ovoga.

Rekao sam da kôd ne radi? Moja greška. Kod kompajlirajte bez greške i ispravno učitajte na "Blue Pill", pa mislim da zaista radi, ali ne očekujemo korištenje GPIO izlaza. Možda čak nije ni dostupan.

Stoga su potrebne male promjene u kodu kako bi radio kako se očekuje.

Korak 2: Hajdemo "definirati" neke pinove…

Hajdemo
Hajdemo

Dobra je praksa koda deklarirati resurse kao lako identificirajuće ili značenje varijabli ili konstanti. Omogućit će vam lakše razumijevanje koda i rješavanje problema.

Koristio sam deklariranje Arduino iglica ovako:

const int ledPin = 13;

…"

Ako vam se sviđam, možda se pitate: "Kako mogu proglasiti pinove s imenima poput PC13 ???"

Odgovor je: Koristite "#define" C naredbu.

Dakle, prema izvlačenju pinout -a, PC13 je pin koji imamo na LED diodi u "BluePill -u". Da bih ga koristio, proglasio bih ovako, odmah nakon definicije biblioteka (#include…) i prije svega ostalog:

#define LedPin PC13

…"

Imajte na umu da NE ";" prekid linije, NOR "=" dodjela.

Uporedite oba koda. Jedan je originalni primjer učitan iz IDE -a. Drugo je ono što sam prilagodio za rad sa "BluePill -om".

Toplo preporučujem da sve pinove koje namjeravate koristiti navedete u kodu. Čak i oni namjeravaju koristiti kao ADC ulaz (o tome kasnije).

Ovo će vam olakšati život.

Korak 3: PinMode () … Kako ćete koristiti svoje igle …

Prije nego nastavimo, razumijemo funkciju PinMode ().

Kao i Arduino, STM32 pinovi imaju više funkcija. Najjednostavniji način odabira jednog ili drugog načina je upotreba izraza pinMode ().

Arduino ima samo 3 načina rada, INPUT, OUTPUT ili INPUT_PULLUP.

STM32, s druge strane, ima mnogo ukusa pinMode (). Oni su:

IZLAZ -Osnovni digitalni izlaz: kada je pin VISOK, napon se održava na +3,3 V (Vcc), a kada je NISKI, povlači se na masu

OUTPUT_OPEN_DRAIN -U režimu otvorenog odvoda, pin označava "nisko" prihvatanjem protoka struje prema zemlji i "visoko" obezbeđivanjem povećane impedanse

INPUT_ANALOG -Ovo je poseban način kada će se pin koristiti za analogna (ne digitalna) čitanja. Omogućuje ADC konverziju na naponu na pinu

INPUT_PULLUP -Stanje pina u ovom načinu rada prijavljuje se na isti način kao i kod INPUT -a, ali napon pina se lagano "podiže" prema +3.3v

INPUT_PULLDOWN -Stanje pina u ovom načinu rada prijavljuje se na isti način kao i kod INPUT -a, ali napon pina se lagano "povlači" prema 0v

INPUT_FLOATING -Sinonim za INPUT

PWM -Ovo je poseban način za koji će se pin koristiti za PWM izlaz (poseban slučaj digitalnog izlaza)

PWM_OPEN_DRAIN -Slično PWM -u, osim što se umjesto izmjeničnih ciklusa LOW i HIGH, napon na pinu sastoji od naizmjeničnih ciklusa LOW i plutajućih (isključenih)

(napomena: izvučeno sa

Upravo otvaram ove zagrade jer kad počnete stvarati vlastiti kôd, pazite da koristite ispravni pinMode () za svoje potrebe.

Korak 4: AnalogWrite () naspram PwmWrite ()… Analogni izlaz u 2 okusa

AnalogWrite () naspram PwmWrite () … Analogni izlaz u 2 ukusa
AnalogWrite () naspram PwmWrite () … Analogni izlaz u 2 ukusa
AnalogWrite () naspram PwmWrite () … Analogni izlaz u 2 ukusa
AnalogWrite () naspram PwmWrite () … Analogni izlaz u 2 ukusa

Prije upotrebe GPIO pinova "Blue Pill" potrebno je deklarirati njegovo ponašanje, odnosno kako će funkcionirati. To je upravo ono što funkcija pinMode () radi.

Dakle, fokusirajmo se sada kako je ispravno postaviti analogni izlaz. Može se deklarirati ili kao OUTPUT način ili PWM način rada.

Na isti način, analogne vrijednosti se mogu pripisati GPIO -u na dva načina: analogWrite () ili pwmWrite (), ALI, analogWrite () će raditi samo ako je pinMode () = OUTPUT. S druge strane, pwmWrite () će raditi samo ako je pinMode () = PWM.

Uzmimo na primjer PA0: to je analogni/pwm izlazni kandidat.

analogWrite (): ovo se deklariše na ovaj način:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <broj>);

……"

gdje broj mora biti između 0 i 255, poput Arduina. Zapravo, unatrag je kompatibilan s Arduinom.

pwmWrite (): deklarirajte na ovaj način:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <broj.>);

…."

Gdje broj mora biti između 0 ~ 65535, rezolucija mnogo veća od Arduina.

Na slikama je moguće uporediti dva koda. Takođe možete vidjeti originalni kod.

Korak 5: STM32 serijska komunikacija

STM32 serijska komunikacija
STM32 serijska komunikacija

Pogledajmo kako je uređen USART interfejs u STM32. Da, interfejsi u množini…..

"Plava pilula" ima 3 USART -a (RX/ TX 1 ~ 3), a ako koristite bootloader koji vam omogućuje korištenje USB -a, nije povezan ni s jednim od njih.

Ovisno o tome koristite li ili ne USB, morate navesti serijski port na jedan ili drugi način u svom kodu.

Slučaj 1: Korištenje USB -a:

Na ovaj način skice se preuzimaju direktno putem USB -a. Nema potrebe za pomicanjem kratkospojnika BOOT0 u 1 položaj i natrag u 0.

U ovom slučaju, svaki put kada deklarirate "Serijski" bez indeksa, znači komunikacija putem USB -a.

Dakle, Serial1, znači TX/ RX 1 (pinovi PA9 i PA10); Serijski2, znači TX/ RX 2 (pinovi PA2 i PA3) i Serijski 3 znači TX/ RX 3 (pinovi PA10 i PA11).

Ovo je način na koji radimo. Predstavit ću promjene u primjerima za ovaj način kodiranja.

Još jedna stvar: "Serijski USB" ne mora se inicijalizirati. Drugim riječima, "… Serial.begin (15200);" nije potrebno.

Moguće je pozvati bilo koju serijsku funkciju (Serial.read (), Serial.write (), itd.) Bez ikakve inicijalizacije.

Ako je iz nekog razloga prisutan u kodu, kompajler će ga zanemariti.

Slučaj 2: Korištenje TTL serije na USB adapter:

Na ovaj način pokretački program ne podržava izvornu STM32 USB komunikaciju, pa vam je za prijenos skica potreban USB -serijski adapter spojen na TX/ RX 1 (pin PA9 i PA10).

U ovom slučaju, svaki put kada je "Serijski" bez indeksa kôd, znači TX/ RX1 (port koji se koristi za učitavanje koda). Dakle, Serial1 se odnosi na TX/ RX 2 (pinovi PA2 i PA3), a Serial2 se odnosi na TX/ RX 3 (Igle PA10 i PA11). Serija 3 nije dostupna.

Korak 6: Prosljeđivanje vrijednosti mikrokontroleru

Prosljeđivanje vrijednosti mikrokontroleru
Prosljeđivanje vrijednosti mikrokontroleru

Primjer zatamnjivanja je jednostavan način da pokažete kako proslijediti vrijednost mikrokontroleru.

Pretpostavlja se da će proći vrijednost od 0 do 255 za kontrolu svjetline LED -a.

NEĆE raditi prema očekivanjima u Blue Pill -u zbog:

  1. Da biste koristili funkciju pwmWrite (), pinMode () MORA biti deklariran kao PWM način rada.
  2. Nikada nećete dobiti cijeli trocifreni broj. Funkcija Serial.read () hvata samo sadržaj bafera, koji je "BYTE". ako upišete "100" i pritisnete "enter", samo posljednja "0" bit će snimljena iz međuspremnika. Njegova vrijednost bit će "48" (decimalna ASCII vrijednost za "0"). Ako namjeravate izdati vrijednost "100", potrebno je upisati "d". Dakle, ispravno je reći da će pretvoriti decimalnu vrijednost ASCII simbola u LED svjetlinu, zar ne? … Pa, neka vrsta …
  3. Problem, mapiranje vrijednosti direktno iz funkcije Serial.read () je trik. Gotovo je sigurno da ćete dobiti neočekivane vrijednosti. Bolji pristup je sadržaj međuspremnika za pohranu u privremenoj varijabli i NEMOJ ga mapirati.

Kao što sam već objasnio u točki 2, kod koji unosim izmjene omogućit će unos ASCII simbola i to će kontrolirati svjetlinu LED -a na osnovu njegove ASCII decimalne vrijednosti … na primjer, "razmak" je vrijednost 32 (zapravo je najniži znak za ispis koji možete unijeti) i "}" je moguće najveći (vrijednost 126). Drugi znakovi se ne mogu ispisivati, pa terminal neće razumjeti ili su moguće složeni znakovi (poput "~" je mrtva tipka na mojoj tastaturi i neće raditi ispravno). To znači da će ovaj složeni znak, kada uđe u terminal, poslati sam znak i nešto drugo. Obično se ne štampa. I da li će ovaj zadnji kod biti obuhvaćen. Također, imajte na umu da vaš terminal, u ovom slučaju, NE bi trebao slati ni "Carriage Return" ni "Line Feed". Morate obratiti pažnju na ovo kako bi kod ispravno radio.

Ako ste pali, to je malo zbunjujuće, postat će najgore ….

Korak 7: I ako želim unijeti tri znamenke…. ili još više ??

A ako bih htio otkucati tri znamenke…. ili još više ??
A ako bih htio otkucati tri znamenke…. ili još više ??

Primanje više znakova iz serijske komunikacije nije jednostavan zadatak.

Serijski međuspremnik je FIFO bajt gomila znakova. Svaki put kada se pozove funkcija Serial.read (), prvi poslani znak se uklanja sa hrpe i skladišti na nekom drugom mjestu. Obično char varijabla u kodu. Napomena, ovisno o hardveru, obično postoji vremensko ograničenje za to kako međuspremnik dnevnika može čuvati informacije.

Ako namjeravate unijeti više od jedne znamenke putem serije, morat ćete "sastaviti" niz znakova po znakove, jer oni ulaze u UART bafer.

To znači ciklično čitanje svakog međuspremnika, spremanje u temp varijablu, učitavanje na prvu poziciju nizova nizova, prelazak na sljedeću poziciju i početak ispočetka, sve dok … pa, ovisi o aplikaciji. Postoje 2 načina da završite ciklus:

  1. Koristeći neki znak "krajnja oznaka", poput "vraćanja nosača" ili "uvlačenja linije". Čim se znak "end Mark" pronađe, petlja završava.
  2. Alternativno, broj znakova u nizu može biti ograničen, pa tako i broj interaktivnih ciklusa. Kad dosegne granicu, recimo, 4, sama stječe rutinske završne obrade.

Pogledajmo na jednostavnom primjeru kako to učiniti:

  • Postavite "end" char, poput '\ n' (to znači ASCII char u feedu linije).
  • petlja u međuvremenu Serial.available () je istina
  • spremanje Serial.read () rezultira privremenom char varijablom. Zapamtite: čim Serial.read () zaista "pročita" bafer, on je čist i u njega se učitava sljedeći znak.
  • povećajte string varijablu s ovim znakom
  • Ako je zadnji znak "kraj", izađite iz petlje.

Obično rutina za dobivanje serijskog niza znakova izgleda kao slika.

Zasnovan je na opsežnoj adaptaciji izvornog koda gospodina Davida A. Mellisa.

Slobodno ga koristite i isprobajte. Upamtite: vrijednosti MORAJU biti unete u trocifrenom formatu.

Ovo je to za sada. Neću se proširivati na dodatne detalje serijske komunikacije. Ovdje je previše složeno za pokrivanje i zaslužuje da posjeduje Intructables.

Nadam se da će vam pomoći u korištenju primjera u Blue Pill -u i dati vam neko prosvjetljenje koliko je ispravan kod za ovu malu ploču.

Vidimo se u drugim uputstvima.

Preporučuje se: