Taula de continguts:

Per tant, carregueu el carregador d’arrencada STM32duino a la vostra "píndola blava" I ara què passa ?: 7 passos
Per tant, carregueu el carregador d’arrencada STM32duino a la vostra "píndola blava" I ara què passa ?: 7 passos

Vídeo: Per tant, carregueu el carregador d’arrencada STM32duino a la vostra "píndola blava" I ara què passa ?: 7 passos

Vídeo: Per tant, carregueu el carregador d’arrencada STM32duino a la vostra
Vídeo: Автомобильный генератор BMW 12 В 180 А к генератору с помощью зарядного устройства для ноутбука 2024, De novembre
Anonim
Per tant, carregueu el carregador d 'arrencada STM32duino al vostre
Per tant, carregueu el carregador d 'arrencada STM32duino al vostre
Per tant, carregueu el carregador d 'arrencada STM32duino al vostre
Per tant, carregueu el carregador d 'arrencada STM32duino al vostre

Si ja heu llegit les meves instruccions que expliquen com es carrega el carregador d’arrencada STM32duino o qualsevol altra documentació similar, proveu de carregar l’exemple de codi i … pot ser que no passi res.

El problema és que molts, si no tots els exemples de STM32 "genèric" no funcionaran fora de la caixa. Seran necessaris canvis menors per treballar a la placa STM32 "Blue Pill".

Seleccionaré 4 exemples de codi per explicar què cal canviar i per què. Els codis són: "BlinkWithoutDelay", "Fading", "Dimmer" i "AnalogInSerial".

Tingueu en compte que NO he codificat res. Acabo de publicar canvis menors en els codis creats per:

David A. Mellis i modificat per Tom Igoe, Marti Bolívar i alguns casos per Scott Fitzgerald

Tom Igoe i modificat per Bryan Newbold

Per tant, prefereixo conservar els noms dels autors fins i tot als codis que modifiqui, mantenint el crèdit de creació.

Pas 1: pins i pins …. Per què el codi no funciona?

Pins i pins …. Per què el codi no funciona?
Pins i pins …. Per què el codi no funciona?

Fem una ullada al PIN "Blue Pill" de STM32. Els pins de les notes s’identifiquen com a PA1 o PC2 …. alguna cosa així.

Si mireu, per exemple, l'exemple de codi "BlinkWithoutDelay", el pin es declara com a "33" … Per què?

Sospito que això és degut a que el senyor Marti Bolívar va portar aquest codi al tauler MAPLE.

Crec que no era la seva intenció deixar que el codi fos compatible amb els taulers "Blue Pill".

Els pins d'Arce i Maple són declarats numèricament, com Arduino, tot i que utilitzen números com el 33, el 24 i alguns com aquest.

He dit que el codi no funcionava? El meu error. Compileu codi sense cap error i pengeu-lo correctament a "Blue Pill", per tant, és la meva opinió que de fet funciona, però no esperem que utilitzant una sortida GPIO. Pot ser que ni tan sols estigui disponible.

Per tant, són necessaris petits canvis en el codi perquè funcioni com s’esperava.

Pas 2: "Definim" alguns pins…

Anem
Anem

És una bona pràctica de codi declarar recursos com a variables fàcils d'identificar o significar o de constants. Us permetrà codificar més fàcilment la comprensió i la solució de problemes.

Jo solia declarar els pins d'Arduino així:

const int ledPin = 13;

…"

Si us agrada, potser us pregunteu: "Com puc declarar pins amb noms com PC13 ???"

La resposta és: utilitzeu la sentència C "#define".

Per tant, segons el dibuix de pinout, PC13 és el pin que tenim a bord del LED de "BluePill". Per utilitzar-lo, declararia així, just després de la definició de les biblioteques (# include …) i abans de qualsevol altra cosa:

#define LedPin PC13

…"

Tingueu en compte que NO hi ha ";" terminació de línia, NOR "=" assignació.

Compareu els dos codis. Un és l’exemple original carregat des de l’IDE. La segona és la que vaig ajustar per treballar amb "BluePill".

Us recomano declarar tots els pins que vulgueu utilitzar al codi. Fins i tot els que tenen intenció d’utilitzar-los com a entrada ADC (més informació més endavant).

Això us facilitarà la vida.

Pas 3: PinMode () … Com faràs servir els teus pins …

Abans de continuar, entenem la funció PinMode ().

Igual que Arduino, els pins STM32 tenen múltiples funcions. La forma més senzilla de seleccionar una o altra és mitjançant la instrucció pinMode ().

Arduino només té 3 modes disponibles: INPUT, OUTPUT o INPUT_PULLUP.

STM32, en canvi, té molts sabors de pinMode (). Ells són:

SORTIDA: sortida digital bàsica: quan el pin és ALT, el voltatge es manté a + 3,3 v (Vcc) i, quan és BAIX, es tira cap a terra

OUTPUT_OPEN_DRAIN -En mode de drenatge obert, el pin indica “baix” acceptant el flux de corrent a terra i “alt” proporcionant una impedància augmentada

INPUT_ANALOG: es tracta d’un mode especial per quan s’utilitzarà el pin per a lectures analògiques (no digitals). Permet realitzar conversions ADC a la tensió del pin

INPUT_PULLUP -L’estat del pin en aquest mode s’informa de la mateixa manera que amb INPUT, però el voltatge del pin es lleva suaument cap a + 3,3v

INPUT_PULLDOWN -L’estat del pin en aquest mode s’informa de la mateixa manera que amb INPUT, però el voltatge del pin es “tira cap avall” suaument cap a 0v

INPUT_FLOATING: sinònim d’INPUT

PWM: es tracta d'un mode especial per a quan s'utilitzarà el pin per a la sortida PWM (un cas especial de sortida digital)

PWM_OPEN_DRAIN -Com PWM, excepte que en lloc d’alternar cicles de BAIX i ALT, la tensió del pin consisteix en cicles alterns de BAIX i flotant (desconnectat)

(nota: extreta de

Acabo d’obrir aquest parèntesi perquè quan comenceu a crear el vostre propi codi, tingueu cura d’utilitzar el pinMode () correcte segons les vostres necessitats.

Pas 4: AnalogWrite () versus PwmWrite () … Sortida analògica en 2 sabors

AnalogWrite () Versus PwmWrite () … Sortida analògica en 2 sabors
AnalogWrite () Versus PwmWrite () … Sortida analògica en 2 sabors
AnalogWrite () Versus PwmWrite () … Sortida analògica en 2 sabors
AnalogWrite () Versus PwmWrite () … Sortida analògica en 2 sabors

Abans d’utilitzar els pins GPIO "Blue Pill", cal declarar el seu comportament, és a dir, com funcionarà. Això és exactament el que fa la funció pinMode ().

Per tant, centrem-nos ara en la correcta configuració d’una sortida analògica. Es pot declarar com a mode OUTPUT o PWM.

De la mateixa manera, els valors analògics es poden atribuir a GPIO de 2 maneres: analogWrite () o pwmWrite (), PERUT, analogWrite () només funcionarà si pinMode () = OUTPUT. D’altra banda, pwmWrite () només funcionarà si pinMode () = PWM.

Prenem PA0, per exemple: és un candidat de sortida analògica / pwm.

analogWrite (): es declara així:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <número>);

……"

on el nombre ha de ser entre 0 i 255, com Arduino. En realitat, és compatible amb Arduino.

pwmWrite (): declarar d'aquesta manera:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <número.>);

…."

Quan el nombre ha de ser entre 0 i 65535, una resolució molt superior a Arduino.

En imatges és possible comparar entre 2 codis. També podeu veure el codi original.

Pas 5: Comunicació sèrie STM32

Comunicació en sèrie STM32
Comunicació en sèrie STM32

Vegem com es disposen les interfícies USART a STM32. Sí, interfícies en plural …

"Blue Pill" té 3 USART (RX / TX 1 ~ 3) i, si utilitzeu un carregador d'arrencada, us permet USB, no està connectat a cap d'aquests.

Segons que utilitzeu USB o no, heu de declarar el port sèrie d'una o altra manera al vostre codi.

Cas 1: utilitzar USB:

D'aquesta manera, els esbossos es descarreguen directament mitjançant USB. No cal moure el pont BOOT0 a 1 posició i tornar a 0.

En aquest cas, cada vegada que declareu "Sèrie" sense índex, significa comunicació per USB.

Per tant, Serial1 significa TX / RX 1 (pins PA9 i PA10); Serial2 significa TX / RX 2 (pins PA2 i PA3) i Serial 3 significa TX / RX 3 (pins PA10 i PA11).

Aquesta és la nostra manera de treballar. Presentaré canvis en exemples per a aquesta forma de codificació.

Una altra cosa: "Serial USB" no necessita inicialitzar. En altres paraules, "… Serial.begin (15200);" no és necessari.

És possible trucar a qualsevol funció de sèrie (Serial.read (), Serial.write (), etc) sense cap inicialització.

Si per algun motiu està present al codi, el compilador l’ignorarà.

Cas 2: utilitzar l'adaptador TTL seria a USB:

D'aquesta manera, el carregador d'arrencada no admet la comunicació USB STM32 nativa, de manera que necessiteu un adaptador USB a sèrie connectat a TX / RX 1 (pin PA9 i PA10) per carregar els esbossos.

En aquest cas, cada vegada que "Sèrie" sense índex és codi, significa TX / RX1 (port utilitzat per carregar el codi). Així, Serial1 es refereix a TX / RX 2 (pins PA2 i PA3) i Serial2 es refereix a TX / RX 3 (Pins PA10 i PA11). No hi ha Serial3 disponible.

Pas 6: Passar un valor al microcontrolador

Passant un valor al microcontrolador
Passant un valor al microcontrolador

L'exemple de Dimmer és una manera senzilla de mostrar com passar un valor al microcontrolador.

Suposa passar un valor de 0 a 255 per controlar la brillantor del LED.

NO funcionarà tal com s’esperava a Blue Pill perquè:

  1. Per utilitzar la funció pwmWrite (), s'ha de declarar pinMode () com a mode PWM.
  2. Mai obtindreu un número sencer de 3 dígits. La funció Serial.read () captura només contingut de memòria intermèdia, que és un "BYTE". si escriviu "100" i premeu "enter", només es capturarà l'últim "0" des del buffer. I el seu valor serà "48" (valor ASCII decimal per a "0"). Si voleu emetre el valor "100", cal escriure "d". Per tant, és correcte dir que convertirà un valor decimal en símbol ASCII en brillantor de LED, oi ?? … Bé, una mena de …
  3. Problema, mapeu els valors directament des de la funció Serial.read () és una acció de truc. És gairebé segur obtenir valors inesperats. Un millor enfocament és el contingut de memòria intermèdia d’emmagatzematge en una variable temporal i que el mapeja.

Com explico abans a l’ítem 2, el codi que introdueixo permetrà introduir un símbol ASCII i això controlarà la brillantor del LED basada en el seu valor decimal ASCII … per exemple, "espai" és el valor 32 (en realitat és el caràcter imprimible més baix que podeu introduir) i "}" és el més alt possible (valor 126). Altres caràcters no es poden imprimir, de manera que el terminal no entendrà o és possible que es compongui un caràcter (com "~" és una tecla inactiva al meu teclat i no funcionarà correctament). Això significa que aquest caràcter compost, quan s'introdueix al terminal, enviarà el caràcter mateix i alguna cosa més. Normalment no es pot imprimir. I és que aquest darrer codi es capturarà. A més, tingueu en compte que el vostre terminal, en aquest cas, NO hauria d'enviar ni "devolució de transport" ni "avaluació de línia". Heu de prestar-hi atenció perquè el codi funcioni correctament.

Si vas caure és poc confús, empitjora …

Pas 7: i si voldria escriure tres dígits … o fins i tot més ??

I si voldria escriure tres dígits … o fins i tot més ??
I si voldria escriure tres dígits … o fins i tot més ??

Rebre diversos caràcters d'una comunicació en sèrie no és una tasca senzilla.

El buffer sèrie és una pila de caràcters FIFO bytes. Cada vegada que es crida la funció Serial.read (), el primer caràcter enviat s’elimina de la pila i s’emmagatzema en algun altre lloc. Normalment és una variable char en el codi. Tingueu en compte que depèn del maquinari, normalment hi ha un temps d'espera per a com la memòria intermèdia de registre pot conservar la informació.

Si teniu intenció d'introduir més d'un dígit per sèrie, haureu de "compondre" una cadena caràcter per caràcter, a mesura que s'incorporin al buffer UART.

Això significa que el ciclisme llegeix cada caràcter de memòria intermèdia, emmagatzema-ho en una variable temporal, carregueu-lo a la primera posició d'una matriu de cadenes, passeu a la posició següent i torneu a començar, fins que … bé, depèn de l'aplicació. Hi ha dues maneres d'acabar el cicle:

  1. Utilitzant algun caràcter de "marca final", com ara "Retorn de carro" o "Avanç de línia". Tan aviat com es troba el caràcter "end Mark", el bucle acaba.
  2. Com a alternativa, el nombre de caràcters de la cadena de cadenes es pot limitar, igual que el nombre de cicles interactius. Quan arriba al límit, diguem, 4, adquireix acabats de rutina per si mateix.

Vegem un exemple senzill de com fer això:

  • Establiu un caràcter "final", com ara "\ n" (això vol dir caràcters ASCII de línia de flux).
  • mentrestant, el bucle Serial.available () és cert
  • emmagatzemant Serial.read () es produeix una variable de caràcter temporal. Recordeu: quan Serial.read () realment "llegeixi" la memòria intermèdia, estarà neta i es carregarà el següent caràcter.
  • incrementa una variable de cadena amb aquest caràcter
  • Si l'últim caràcter és "final", surt del bucle.

Normalment, la rutina per obtenir una matriu de caràcters en sèrie sembla una imatge.

Es va basar en una àmplia adaptació del codi original del senyor David A. Mellis.

No dubteu a utilitzar-lo i provar-lo. Recordeu: els valors S’han d’introduir en format de 3 dígits.

Això per ara. No m'explicaré en detalls addicionals de comunicació en sèrie. És massa complex per cobrir aquí i es mereix Intructables propis.

Espero que us ajudi a utilitzar exemples de Blue Pill i us doni una mica d’il·lustració sobre el codi correcte d’aquest petit tauler.

Ens veiem al voltant en altres instruccions.

Recomanat: