Come e perché leggere i datasheet, se i microcontrollori sono il tuo hobby

Come e perché leggere i datasheet, se i microcontrollori sono il tuo hobby

La microelettronica è diventata una moda degli ultimi anni grazie al magico Arduino. Ma c'è un problema: con un adeguato interesse, si supera rapidamente DigitalWrite(), ma cosa fare dopo non è del tutto chiaro. Gli sviluppatori di Arduino hanno fatto notevoli sforzi per abbattere la barriera d'ingresso nel loro ecosistema, ma oltre i suoi confini si estende ancora una foresta oscura di difficile schematica, poco accessibile agli appassionati.

Per esempio, i datasheet. Sembrano contenere tutto, basta prenderli e usarli. Ma i loro autori chiaramente non si pongono l'obiettivo di popolarizzare i microcontrollori; a volte sembra, che abusano volutamente di termini e abbreviazioni incomprensibili nella descrizione di cose semplici, per confondere il profano. Ma non è tutto così male, con un po' di volontà il mistero si svela.

In questo articolo condividerò l'esperienza di un umanista con i datasheet per scopi hobbistici. Il testo è destinato a coloro che sono cresciuti oltre Arduino, e presuppone una certa conoscenza dei principi di funzionamento dei microcontrollori.

Inizio con il tradizionale

Lampeggiando un LED su Arduino

E subito il codice:

void setup() {
DDRB |= (1<<5);
}

void loop() {
PINB = (1<<5);
for (volatile uint32_t k=0; k<100000; k++);
}

«Cos'è questo? – chiederà il lettore esperto. – Perché scrivi qualcosa nel registro di ingresso PINB? Esso è solo in lettura!» In effetti, la documentazione di Arduino, come la maggior parte degli articoli didattici su internet, afferma che questo registro è in sola lettura. Lo pensavo anch'io, fino a quando non ho riletto il datasheet per l'Atmega328p, mentre preparavo questo articolo. E lì:

Come e perché leggere i datasheet, se i microcontrollori sono il tuo hobby

Si tratta di una funzionalità relativamente nuova, non presente nell'Atmega8, di cui non tutti sono a conoscenza o che non viene menzionata per motivi di compatibilità. Ma è perfettamente valida per dimostrare il concetto che i datasheet dovrebbero essere letti per sfruttare tutte le potenzialità del chip, comprese quelle poco conosciute. E questa non è l'unica ragione.

Perché leggere ancora i datasheet

Di solito, gli utenti di Arduino, dopo aver giocato con i LED e gli AnalogWrite, iniziano a collegare vari moduli e chip alla scheda, per i quali sono già state scritte delle librerie. Prima o poi compare una libreria che non funziona come dovrebbe. Allora l'appassionato comincia a modificarla per ripararla, e lì...

Lì dentro accade qualcosa di categoricamente incomprensibile, quindi è necessario recarsi su Google, leggere numerosi tutorial, utilizzare parti di codice altrui e infine ottenere ciò che si desidera. Questo dà una potente sensazione di realizzazione, ma in realtà il processo ricorda l'invenzione della bicicletta tramite il reverse engineering di una moto. Tra l'altro, non aumenta la comprensione di come funzioni questa bicicletta. Lo so, perché ci ho dedicato molto tempo.

Se invece di dedicarmi a questa affascinante attività avessi trascorso un paio di giorni a studiare la documentazione dell'Atmega328, avrei risparmiato un'enorme quantità di tempo. Dopotutto, è un microcontrollore piuttosto semplice.

Pertanto, leggere i datasheet è necessario almeno per avere un'idea di come è fatto un microcontrollore e di cosa è capace di fare. E in aggiunta:

  • per controllare e ottimizzare le librerie di altri. Spesso sono scritte da hobbisti che inventano la bicicletta; oppure, al contrario, gli autori fanno deliberatamente un'eccessiva protezione contro l'errore. Può essere tre volte più grande e lenta, ma almeno funziona sicuramente;

  • per avere la possibilità di utilizzare nei progetti chip per i quali nessuno ha scritto una libreria;

  • per semplificare il passaggio da una serie di MC a un'altra;

  • per ottimizzare finalmente il mio vecchio codice che non entrava affatto nell'Arduino;

  • per imparare a gestire qualsiasi chip direttamente attraverso i suoi registri, senza doversi preoccupare di studiare come funzionano le relative librerie, se mai esistono.

Perché scrivere nei registri direttamente, quando ci sono HAL e LL?

Glossario
HAL, High Abstraction Layer – libreria per gestire un microcontrollore con alto livello di astrazione. Se è necessario utilizzare l'interfaccia SPI1, basta configurarla e abilitarla, senza preoccuparsi di quali registri siano responsabili di cosa.
LL, Low Level API – libreria che contiene macro o strutture con indirizzi di registri, che consente di accedervi per nome. DDRx, PORTx, PINx su Atmega – questo è LL.

Discussioni su "HAL, LL o registri" avvengono regolarmente nei commenti su Habré. Non pretendendo di avere accesso a conoscenze astrali, condividerò semplicemente la mia esperienza amatoriale e i miei pensieri.

Dopo aver capito più o meno come funziona l'Atmega e aver letto articoli sulle meraviglie dello STM32, ho comprato mezza dozzina di schede diverse - sia Discovery che "Blue Pill", e persino semplici chip per i miei progetti. Tutti loro sono rimasti impolverati in una scatola per due anni. A volte mi dicevo: "da questo weekend imparo STM", lanciavo CubeMX, generavo la configurazione per SPI, guardavo quel muro di testo, abbondantemente condito da copyright STM, e decidevo che fosse davvero troppo.

Come e perché leggere i datasheet, se i microcontrollori sono il tuo hobby

Certo, posso capire cosa ha scritto CubeMX. Ma è anche chiaro che memorizzare tutte le formulazioni, per poi riportarle a mano, è irreale. E debuggare questo, se per caso dimentico di spuntare qualche opzione in Cube, è un vero e proprio incubo.

Sono passati due anni e io continuo a sbavare su ST MCU Finder per vari chip gustosi, ma per me inaccessibili, e ho trovato per caso un ottimo articolo, anche se riguarda lo STM8. E improvvisamente ho capito che per tutto questo tempo stavo bussando a una porta aperta: i registri degli STM sono strutturati come quelli di qualsiasi altro microcontrollore, e per lavorarci non è necessario Cube. E cosa, si poteva fare così?..

HAL e in particolare STM32CubeMX sono strumenti per ingegneri professionisti che lavorano a stretto contatto con i chip STM32. La caratteristica principale è il livello elevato di astrazione, la possibilità di migrare rapidamente da un microcontrollore all'altro e persino da un core all'altro, rimanendo nell'ambito della famiglia STM32. Gli appassionati si trovano raramente ad affrontare tali problemi: la nostra scelta di microcontrollori è generalmente limitata all'assortimento di AliExpress, e migriamo più frequentemente tra chip sostanzialmente diversi - passiamo dall'Atmega allo STM, dallo STM all'ESP, o a seconda delle novità che ci offrono i nostri amici cinesi. HAL qui non aiuta, e il tempo di studio è considerevole.

Resta LL - ma da esso ai registri ci vuole un attimo. Personalmente trovo utile scrivere i miei macro con gli indirizzi dei registri: studio con maggiore attenzione il datasheet, rifletto su ciò che mi servirà in futuro e cosa no, ristrutturo meglio i miei programmi, e tutto sommato il superamento delle difficoltà aiuta la memorizzazione.

Inoltre, c'è una questione con il popolare STM32F103 - esistono due versioni LL incompatibili, una ufficiale da STM, l'altra da Leaf Labs, utilizzata nel progetto STM32duino. Se si desidera scrivere una libreria open-source (e io avevo proprio questo compito), è necessario fare due versioni o accedere direttamente ai registri.

Infine, a mio avviso, rinunciare a LL semplifica la migrazione, soprattutto se si inizia a pianificarla fin dall'inizio del progetto. Un esempio estremo: scriviamo un blink per Arduino in Atmel Studio senza LL:

#include <stdint.h>

#define _REG(addr) (*(volatile uint8_t*)(addr))

#define DDR_B 0x24
#define OUT_B 0x25

int main(void)
{
    volatile uint32_t k;

    _REG(DDR_B) |= (1<<5);

    while(1)
    {
        _REG(OUT_B) |= (1<<5);
        for (k=0; k<50000; k++);
        _REG(OUT_B) &= ~(1<<5);
        for (k=0; k<50000; k++);
    } 
}

Per far lampeggiare questo codice un LED su una scheda cinese con STM8 (da ST Visual Desktop), basta cambiare due indirizzi:

#define DDR_B 0x5007
#define OUT_B 0x5005

Sì, sto usando una caratteristica specifica di collegamento del LED sulla scheda, lampeggerà molto lentamente, ma lampeggerà!

Quali tipi di datasheet ci sono

Negli articoli e nei forum, sia in russo che in inglese, per "datasheet" si intende qualsiasi documentazione tecnica sui chip, e io procedo in questo modo anche in questo testo. Formalmente, essi sono solo uno dei tipi di tale documentazione:

Datasheet – TTX, caratteristiche tecniche tattiche. È obbligatorio avere per qualsiasi componente elettronico. Informazioni di riferimento, è utile tenerle a portata di mano, ma non c'è molto da leggere attentamente. Tuttavia, i chip più semplici spesso si limitano al datasheet per non generare documenti superflui; in questo caso Reference Manual è incluso qui.

Reference Manual – la vera e propria istruzione, un grosso libro di oltre 1000 pagine. Descrive in dettaglio il funzionamento di tutto ciò che è presente nel chip. È il documento principale per comprendere il microcontrollore. A differenza di datasheet, le istruzioni vengono redatte per una vasta gamma di MC, contengono molte informazioni sulla periferica che non è presente nel vostro modello specifico.

Programming Manual o Instruction Set Manual – istruzioni per i comandi unici del microcontrollore. Destinata a chi programma in Assembly. Gli autori degli compiler utilizzano attivamente questa guida per ottimizzare il codice, quindi in generale non ci servirà. Ma è utile dare un'occhiata qui per una comprensione generale, per alcune istruzioni specifiche come l'uscita dalle interruzioni, così come durante l'uso intenso del debugger.

Application Note – consigli utili per risolvere compiti specifici, spesso con esempi di codice.

Errata Sheet – descrizione dei casi di comportamento anomalo del chip con soluzioni, se disponibili.

Cosa si trova nei datasheet

Nello specifico, in Datasheet potremmo avere bisogno delle seguenti sezioni:

Device Summary – la prima pagina del datasheet fornisce una breve panoramica del dispositivo. Molto utile in situazioni in cui si trova un chip (lo si è visto in negozio, si è dissaldato, è stata vista una menzione) e si vuole capire di cosa si tratta.

General Description – una descrizione più dettagliata delle capacità dei chip della serie.

Pinouts – schemi di pinout per tutti i possibili formati del chip (a quale gamba corrisponde quale pin).

Pin Description – descrizione della funzione e delle capacità di ogni pin.

Memory Map – una mappa degli indirizzi in memoria che probabilmente non ci servirà, ma a volte include anche una tabella degli indirizzi dei blocchi di registri.

Register Map – una tabella degli indirizzi dei blocchi di registri, di solito si trova nel datasheet, mentre nel Ref Manual – solo gli offset (address offsets).

Electrical Characteristics – in questa sezione ci interessano in primo luogo absolute maximum ratings, che elencano i carichi massimi sul chip. A differenza dell'indistruttibile Atmega328p, la maggior parte dei microcontrollori non consente di collegare carichi pesanti ai pin, il che può diventare una spiacevole sorpresa per chi usa Arduino.

Package Information – disegni dei formati disponibili, utili nella progettazione delle proprie schede.

Reference Manual strutturalmente consiste in sezioni dedicate a specifiche periferiche, indicate nei loro titoli. Ogni capitolo può essere convenzionalmente suddiviso in tre parti:

Overview, Introduction, Features – una panoramica delle capacità delle periferiche;

Functional Description, Usage Guide o semplicemente il blocco principale della sezione – una descrizione dettagliata del funzionamento delle periferiche e dei metodi per utilizzarle;

Registers – descrizione dei registri di controllo. Nei casi semplici come GPIO o SPI questo può essere più che sufficiente per iniziare a utilizzare la periferica, ma spesso si deve comunque leggere le parti precedenti.

Come leggere i datasheet

I datasheet possono spaventare con il loro volume e il gran numero di termini incomprensibili. In realtà, non è così spaventoso se si conoscono alcuni trucchi.

Installare un buon lettore PDF. I datasheet sono scritti nelle affermate tradizioni delle istruzioni cartacee, è bello stamparli, evidenziarli con segnalibri in plastica e rileggerli. Il ipertesto è presente in quantità limitate. Fortunatamente, almeno la struttura del documento è organizzata con segnalibri, quindi un buon lettore con una navigazione comoda è molto necessario.

Il datasheet non è un libro di testo di Stroustrup, in esso non bisogna leggere tutto. Se avete seguito il consiglio precedente, basta trovare la sezione necessaria nel pannello dei segnalibri.

I datasheet, in particolare Reference Manuals, possono descrivere le capacità non di un chip specifico, ma dell'intera serie. Questo significa che la metà, se non due terzi delle informazioni, non ha nulla a che fare con il vostro chip. Prima di studiare i registri TIM7, controlla se General Description, ce l'hai.

Conoscere l'inglese è sufficiente a un livello base. I datasheet sono per metà composti da termini sconosciuti a un parlante medio e per metà da semplici strutture di collegamento. Ci sono anche dei bellissimi datasheet cinesi in inglese cinese, dove metà sono anche termini e l'altra metà è un insieme casuale di parole.

Se incontri una parola sconosciuta, non cercare di tradurla usando un dizionario inglese-russo. Se ti confonde hysteresis, la traduzione "isteresi" non ti farà stare meglio. Usa Google, Stack Overflow, Wikipedia, forum dove il concetto necessario sarà spiegato con parole semplici e esempi.

Il modo migliore per capire ciò che hai letto è verificare sul campo. Pertanto, tieni a portata di mano la scheda di debug con cui ti stai familiarizzando, o meglio due - nel caso in cui non hai capito qualcosa e vedi un magico fumo.

È utile avere a disposizione il datasheet quando leggi un tutorial di qualcuno o studi una libreria di qualcun altro. È molto probabile che tu possa trovare una soluzione più ottimale al tuo problema. E viceversa - se dal datasheet non riesci a capire come funziona realmente il registro, cercalo su Google: è probabile che qualcuno lo abbia già descritto con parole semplici o abbia lasciato codice comprensibile su GitHub.

Glossario

Alcune parole e designazioni utili che aiutano a familiarizzare più rapidamente con i datasheet. Quello che mi è venuto in mente negli ultimi due giorni, integrazioni e correzioni sono benvenute.

Elettricità
Vcc, Vdd – "più", alimentazione
Vss, Vee – "meno", terra
current – corrente
voltage – tensione
to sink current – lavorare come "terra" per un carico esterno
to source current – alimentare un carico esterno
high sink/source pin – pin con maggiore "tolleranza" al carico

IO
H, High – sul pin Vcc
L, Low – sul pin Vss
High Impedance, Hi-Z, floating – sul pin non c'è nulla, "alta impedenza", è praticamente invisibile al mondo esterno.
weak pull up, weak pull down – resistore pull-up/pull-down integrato, un'analogia approssimativa di 50 kΩ (vedi datasheet). Usato, ad esempio, per evitare che un pin di ingresso fluttui nell'aria, causando falsi attivamenti. Weak – perché è facile da "sovrastare".
push pull – modalità di uscita del pin in cui si alterna tra High e Basso – output standard con Arduino.
drain aperto – indica la modalità di uscita in cui il pin può essere sia Basso, oppure Alta Impedenza / Floating. In questo modo, quasi sempre non si tratta di un vero e proprio drain aperto, ci sono diodi di protezione, resistori e altro. Questo è semplicemente un'indicazione della modalità terra/niente.
drain aperto vero – ma questo è un vero e proprio drain aperto: il pin va direttamente a terra se è aperto, o rimane in uno stato sospeso se è chiuso. Ciò significa che attraverso di esso, se necessario, può passare una tensione superiore a Vcc, ma il massimo è comunque specificato nella scheda tecnica nella sezione Valori Massimi Assoluti / Tensione.

Interfacce
in serie – collegati in serie
a catena – raccogliere i chip in una catena mediante collegamento in serie, aumentando il numero di uscite.
shift – spostamento, di solito indica lo spostamento dei bit. Di conseguenza, per spostare dentro e per spostare fuori – ricevere e trasmettere dati bit a bit.
grilletto – serranda che copre il buffer mentre i bit vengono spostati. Quando la trasmissione è completata, la serranda si apre e i bit iniziano a funzionare.
per sincronizzare in – effettuare una trasmissione bit a bit, spostando tutti i bit nei posti giusti.
buffer doppio, registro shadow, registro di pre-carico – indicazioni della storia, quando un registro deve essere in grado di ricevere nuovi dati, ma trattenerli fino a un certo momento. Ad esempio, per un funzionamento corretto del PWM i suoi parametri (duty cycle, frequenza) non devono cambiare finché non termina il ciclo attuale, ma nuovi parametri possono già essere trasmessi. Di conseguenza, i parametri attuali vengono mantenuti in registro shadow, e i nuovi entrano in registro di pre-carico, essendo registrati nel corrispondente registro del chip.

Varie
prescaler – divisore di frequenza
per impostare un bit – impostare il bit a 1
per cancellare/reset un bit – resettare il bit a 0 (reset – caratteristica delle schede tecniche STM)

E ora?

In realtà, qui era prevista una parte pratica con la dimostrazione di tre progetti su STM32 e STM8, realizzati appositamente per questo articolo con l'aiuto delle schede tecniche, con lampadine, SPI, timer, PWM e interruzioni:

Come e perché leggere i datasheet, se i microcontrollori sono il tuo hobby

Ma il testo risulta piuttosto lungo, quindi i progetti vengono rinviati alla seconda parte.

L'abilità di leggere le schede tecniche ti aiuterà con il tuo hobby, ma difficilmente sostituirà la comunicazione dal vivo con colleghi appassionati nei forum e nelle chat. Per questo, è comunque necessario migliorare prima di tutto la lingua inglese. E quindi, per coloro che hanno letto tutto: un premio speciale: due lezioni gratuite su Skyeng al primo pagamento con il codice HABR2.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster