Taula de continguts:
- Pas 1: pins i pins …. Per què el codi no funciona?
- Pas 2: "Definim" alguns pins…
- Pas 3: PinMode () … Com faràs servir els teus pins …
- Pas 4: AnalogWrite () versus PwmWrite () … Sortida analògica en 2 sabors
- Pas 5: Comunicació sèrie STM32
- Pas 6: Passar un valor al microcontrolador
- Pas 7: i si voldria escriure tres dígits … o fins i tot més ??
Vídeo: Per tant, carregueu el carregador d’arrencada STM32duino a la vostra "píndola blava" I ara què passa ?: 7 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:12
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?
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…
É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
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
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
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è:
- Per utilitzar la funció pwmWrite (), s'ha de declarar pinMode () com a mode PWM.
- 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 …
- 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 ??
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:
- 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.
- 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:
Configuració de la píndola blava a STM32CubeIDE: 8 passos
Configuració de Blue Pill Board a STM32CubeIDE: La Blue Pill és un tauler de desenvolupament ARM d’os nus molt barat. Compta amb un processador STM32F103C8 que té 64 kbytes de flash i 20 kbytes de memòria RAM. Funciona fins a 72 MHz i és la manera més barata d’entrar al desenvolupament de programari incrustat ARM
Fer una eina d'eliminació d'arrencada d'arrencada de bugia trencada / esquinçada / trencada / fosa / fosa de baix cost: 3 passos
Crear una eina d’eliminació d’arrencada d’espurna trencada / esquinçada / trencada / fosa / fosa de baix cost: aquesta instrucció us mostra com fer la vostra pròpia eina econòmica per extreure l’arrencada trencada de la bugia per poder continuar amb la vostra posada a punt. Per als fabricants de bricolatge que treballen amb el vostre propi vehicle, no hi ha res com substituir la vostra espurna
Alternativa Arduino: programació de la píndola blava STM32 mitjançant USB: 5 passos
Alternativa Arduino: programació de la píndola blava STM32 mitjançant USB: a tots dos ens encanten les plaques Arduino, des del més petit Attiny85 fins al MEGA2560 més gran. Tanmateix, si necessiteu més velocitat, més entrades analògiques, més precisió, però encara no voleu canviar de programació Arduino, hi ha una solució elegant
Carregueu la vostra pàgina web de configuració Arduino / ESP des del núvol: 7 passos
Carregueu la vostra pàgina web de configuració Arduino / ESP des del núvol: quan creeu un projecte Arduino / ESP (ESP8266 / ESP32), només podeu codificar-ho tot. Però sovint apareix alguna cosa i acabareu tornant a connectar el vostre dispositiu IoT al vostre IDE. O simplement teniu més persones a accedir a la configuració
Carregueu les bateries AAA NiMH en un carregador AA: 3 passos
Càrrega de piles AAA NiMH en un carregador AA: tenia un carregador AA NiMH per a la meva càmera digital. Un parell d’anys després vaig tenir un parell de dispositius alimentats per piles AAA NiMH. Volia utilitzar el carregador que ja tenia, però només per a piles AA