Sadržaj:

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

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

Video: Dakle, učitavate bootloader STM32duino u svoju
Video: Empezar con STM32 - PCB y Rádio NRF24 + Bootloader 2024, Srpanj
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žda se ništa neće dogoditi.

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

Odabrat ću 4 primjera koda kako bih objasnio što 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 i kasno izmijenio Bryan Newbold

Stoga 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". Napomena pinovi su identificirani 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 g. Marti Bolivar prenio ovaj kôd za ploču MAPLE.

Mislim da mu nije bila namjera dopustiti kod kompatibilan s 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 pogreška. Kodiraj se bez greške i ispravno učitaj 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.

2. korak: "Definirajmo" neke pinove…

Idemo
Idemo

Dobra je praksa koda deklarirati resurse kao lako prepoznatljive 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 isječaka, PC13 je pin koji imamo na LED diodi u "BluePill -u". Da bih ga koristio, deklarirao bih ovako, odmah nakon definicije knjižnica (#include …) i prije svega ostalog:

#define LedPin PC13

…"

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

Usporedite oba koda. Jedan je izvorni primjer učitan iz IDE -a. Druga je ona koju sam prilagodio za rad s "BluePill -om".

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

To ć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 okusa 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 načinu otvorenog odvoda, pin označava "nisko" prihvaćanjem protoka struje prema zemlji i "visoko" osiguravajući povećanu impedanciju

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,3 V

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 dolje" prema 0v

INPUT_FLOATING -Sinonim za INPUT

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

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

(napomena: izvučeno iz

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 okusa
AnalogWrite () naspram PwmWrite () … Analogni izlaz u 2 okusa
AnalogWrite () naspram PwmWrite () … Analogni izlaz u 2 okusa
AnalogWrite () naspram PwmWrite () … Analogni izlaz u 2 okusa

Prije uporabe GPIO pinova "Blue Pill" potrebno je deklarirati njegovo ponašanje, tj. 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 deklarirajte 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, razlučivost mnogo veća od Arduina.

Na slikama je moguće usporediti dva koda. Također možete vidjeti izvorni kod.

Korak 5: STM32 serijska komunikacija

STM32 serijska komunikacija
STM32 serijska komunikacija

Pogledajmo kako su uređena USART sučelja u STM32. Da, sučelja 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 USB ili ne, morate u svom kodu deklarirati serijski port na jedan ili drugi način.

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

Na ovaj način skice se preuzimaju izravno 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), a serijski 3 znači TX/ RX 3 (pinovi PA10 i PA11).

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

Još jedna stvar: "Serijski USB" ne treba 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, prevoditelj će ga zanemariti.

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

Na taj 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). Pa nadalje, 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 jednostavan je način da se pokaže 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. Za korištenje funkcije pwmWrite (), pinMode () MORA biti deklariran kao PWM način rada.
  2. Nikada nećete dobiti cijeli troznamenkasti broj. Funkcija Serial.read () hvata samo sadržaj međuspremnika, 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 svjetlinu LED -a, zar ne ?? … Pa, neka vrsta …
  3. Problem, mapiranje vrijednosti izravno 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 je 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 temelju njegove decimalne vrijednosti ASCII … na primjer, "razmak" je vrijednost 32 (zapravo je najniži znak za ispis koji možete unijeti) a "}" je moguće najveći (vrijednost 126). Drugi znakovi se ne mogu ispisivati, pa terminal neće razumjeti ili su mogući slogovi znakova (poput "~" je mrtva tipka na mojoj tipkovnici i neće raditi ispravno). To znači da će ovaj složeni znak, kada uđete u terminal, poslati sam znak i nešto drugo. Obično se ne ispisuje. I hoće li ovaj zadnji kod biti obuhvaćen. Također, imajte na umu da vaš terminal, u ovom slučaju, NE smije slati ni "Carriage Return" niti "Line Feed". Morate obratiti pozornost na ovo kako bi kod ispravno radio.

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

Korak 7: I ako bih htio upisati tri znamenke…. ili još više ??

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

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

Serijski međuspremnik je FIFO bajt hrpa znakova. Svaki put kada se funkcija Serial.read () pozove, prvi poslani znak se uklanja s hrpe i pohranjuje na neko drugo mjesto. Obično char varijabla u kodu. Napomena, ovisno o hardveru, obično postoji vrijeme čekanja 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 znak, jer oni ulaze u UART međuspremnik.

To znači cikličko č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 dva načina za završetak ciklusa:

  1. Upotreba nekog znaka "krajnja oznaka", poput "vraćanja nosača" ili "uvlačenja linije". Čim se pronađe znak "kraj oznake", 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 retka).
  • petlja u međuvremenu Serial.available () je istina
  • spremanje Serial.read () rezultira privremenom varijablom char. Zapamtite: čim Serial.read () zapravo "pročita" međuspremnik, on je čist i u njega se učitava sljedeći znak.
  • povećajte niz varijablu s ovim znakom
  • Ako je zadnji znak "kraj", izađite iz petlje.

Obično rutina za dobivanje serijskog niza znakova izgleda poput slike.

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

Slobodno ga koristite i isprobajte. Upamtite: vrijednosti MORAJU biti unijete u troznamenkasti format.

Ovo je to za sada. Neću se dodatno proširivati detaljima serijske komunikacije. Ovdje je previše složeno za pokrivanje i zaslužuje vlastite Neukrotive.

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 uputama.

Preporučeni: