Recensione evaboard STM32-Discovery (CORTEX-M3)

Recensione evaboard STM32-Discovery (CORTEX-M3)

In questo articolo (Review4U) parlerò di un’interessante scheda di valutazione, la STM32-DISCOVERY, della ST Microelectronics, che monta un processore a 32-bit della famiglia ARM.

La scheda, senza contenitore come di regola, ha dimensioni di 43x84mm, ed è costituita da un PCB doppia faccia. Il microprocessore (il “target”) montato è il STM32F100RBT6B, con ben 128k di FLASH e 8k di RAM, funzionante fino ad un massimo teorico di 24MHz (più avanti vedremo come overcloccare leggermente il micro).
Insieme al micro “target”, è montato un altro micro della stessa famiglia, un STM32F103C8T6, che ha il compito di gestire il debugger USB…è incluso un vero debugger hardware, chiamato ST-Link, che può essere usato anche con schede diverse. Allo scopo occorre rimuovere i due jumper CN3 e collegare la scheda esterna al connettore CN2. Naturalmente i processori supportati sono solo gli ST che utilizzano il protocollo SWD. Viceversa, se si ha a disposizione un debugger JTAG (ad esempio il J-Link della IAR/Segger), si può sempre collegare ai relativi pin del target e non utilizzare l’ST-Link.

Tornando alla scheda, è comoda la scelta di montare pin-strip “lunghi”, che sporgono anche dal lato componenti e che sono eccellenti per fissare le sonde dell’oscilloscopio.

L’alimentazione sia per il micro target che per il debugger viene prelevata direttamente dall’USB, tramite riduzione a 3.3V effettuata dal regolatore LD1117. Completano la dotazione due pulsanti, di cui solo uno utilizzabile per i nostri programmi, mentre l’altro è il reset, e 4 LED, di cui uno sull’alimentazione, uno di pertinenza del debugger e due a disposizone del nostro target.
Per finire è da segnalare il montaggio del quarzo su zoccolo per una facile e indolore sostituzione.

Il microcontrollore dell’evaboard STM32-Discovery (CORTEX-M3)

Il microcontrollore appartiene alla estesissima famiglia ARM, sottofamiglia Cortex, versione M3. Si tratta di un processore a 32 bit reali, che ha l’interessante caratteristica di utilizzare un set di istruzioni a lunghezza ridotta, detto Thumb-2, con prestazioni spesso pari o superiori ai set di istruzioni full 32-bit precedenti, e con il grande vantaggio di minor spazio occupato dal codice. Trattare in poche righe una famiglia di micro così estesa è impossibile, rimando quindi alle informazioni più dettagliate presenti sul web. Come curiosità, si stima che circa il 98% dei milioni di telefoni cellulari costruiti ogni anno, monti al proprio interno un micro della famiglia ARM.

TOOLS E SOFTWARE
La ST tramite i suoi partner mette a disposizione ben tre diversi sistemi di sviluppo, naturalmente con limitazioni di vario genere: IAR, KEIL e ATOLLIC. Per motivi personali ho selto il compilatore IAR, che è in grado di compilare e linkare codice C e assembler fino ad un massimo di 32kbytes. La versione che ho scaricato, previa registrazione gratuita sul sito IAR, è la 6.10.3 per ARM.

LA DEMO
Per testare questa scheda, ho scritto un breve programmino che simula un segnale audio digitale. In particolare ho realizzato un simulatore di SPDIF. Lo SPDIF è lo standard consumer analogo dello standard professionale AES-EBU, che trasmette i dati audio in DIGITALE su un’unico filo. Entrambi gli standard sono descritti in dettaglio nella norma IEC958 e anche, più approssimativamente, in documenti free reperibili in rete.

Molti PC, DVD, TV, hanno un’uscita SPDIF che può “appoggiarsi” per il trasferimento, ad un cavo ottico oppure coassiale (rame). Più difficile è trovare un ingresso SPDIF: questo è tipicamente presente solo su amplificatori AV (Audio/Video). Le velocità di campionamento utilizzate sono di solito tre: 32kHz, 44.1kHz (standard CD), e 48kHz. Per il mio demo ho scelto la frequenza maggiore, cioè 48kHz. Ogni campione audio, che può essere lungo fino a 20 o 24 bit, occupa 32 bit fissi, che diventano 64 dopo la necessaria codifica in Biphase Mark, e così divisi:

    4 bit di preambolo. Non vengono codificati BM, ma diventano comunque 8-bit fissi.
    4 bit di dati ausiliari (possono essere usati per aumentare a 24 i bit totali del campione audio). Codificati BM diventano 8 bit.
    20 bit di campioni. Codificati BM diventano 40 bit.
    1 bit di Validity. Codificato BM diventa 2 bit. Se uguale a 1, il campione viene scartato.
    1 bit di Subcode Data. Codificato BM diventa 2 bit.
    1 bit di Channel Status Information. Codificato BM diventa 2 bit.
    1 bit di Parity. Codificato BM diventa 2 bit. Calcolato come parità degli ultimi 28 bit originali, escludendo cioè i primi 4 bit del preambolo.

La codifica Biphase Mark è necessaria per due motivi: in primo luogo fa sì che il flusso di dati risultante abbia valor medio nullo, e questo lo rende trasmissibile per mezzo di trasformatori di isolamento (che come noto, non trasferiscono la continua). Inoltre permette di risincronizzare facilmente il clock del ricevitore, in quanto presenta sempre un certo numero di transizioni 0->1 e viceversa. Nel flusso infatti si troveranno massimo 2 bit consecutivi identici, tranne nello speciale preambolo dove se ce ne sono tre.

La codifica BM dice che 1 bit originale va codificato in 2 bit seguendo questa semplice regola: il primo bit BM è sempre l’opposto dell’ultimo bit trasmesso, mentre il secondo bit BM è uguale al primo bit BM se il bit originale è 0, oppure opposto al primo bit BM se il bit originale è 1. Ad esempio se volessimo trasmettere i bit 001, supponendo l’ultimo bit precedente a 0:

    bit da trasmettere -> 0 0 1
    flusso BM -> xx xx x0 11 00 10
    ^ ultimo bit precedente

Il flusso SPDIF si può immaginare come una Matrioska: è cosituito da tanti Blocks consecutivi, ciascuno dei quali è costituito da 192 frames, a loro volta contenenti 2 canali A e B (Left e Right), ciascuno dei quali è costituito da 32 bit (Time Slots), cioè 64 bit dopo codifica BM.


(Immagine: Alessio Damato. File is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported)

Eseguendo un semplice calcolo si può trovare il bit rate complessivo:
64 bit codificati BM x 2 canali x 48000 campioni/sec = 6144000 bit/sec

Esistono tre tipi di preambolo: due per il subframe A (Left) e uno per il subframe B (Right).

I tre preamboli sono denominati:

    ‘B’ di valore 0xe8. Indica l’inizio di un Block costituito da 192 Frames. Indica il canale A.
    ‘M’ di valore 0xe2. Indica un subframe per il canale A, che non è il primo del Block.
    ‘W’ di valore 0xe4. Indica un subframe per il canale B.

Il flusso sarà quindi come segue:

1 2 3 … 192
BW MW MW … MW
BW MW MW … MW
BW MW MW … MW

Cioè il primo frame di un blocco sarà sempre BW, cioè 64 bit con preambolo B e 64 bit con preambolo W, poi ci saranno 191 frames di tipo MW, cioè 64 bit con preambolo M e 64 bit con preambolo W. Il ciclo si ripete ogni 192 frames.

Nota: la norma IEC958 definisce questi stessi preamboli come X, Y e Z.

Il programma implementa un semplice DDS software,con Phase Accumulator a 32 bit e tabella del seno a 10 bit. Rimando a riferimenti in rete per la spiegazione del DDS.

Per generare un flusso a 6.144MHz, ho utilizzato la SPI del STM32, ma ho dovuto cambiare il cristallo, originariamente 8MHz, per ottenere esattamente questa frequenza di flusso. Nella mia applicazione ho utilizzato un quarzo a 7.68MHz, diviso inizialmente per 5 ottenendo 1.536MHz, e poi moltiplicato per 16 dal PLL interno per ottenere 24.576MHz del clock principale. Come si può vedere controllando il datasheet, il micro è leggermente overcloccato (max 24MHz) ma questo non ha dato problemi di sorta. La SPI utilizza il clock principale diviso 4.

Naturalmente sono possibili molte altre combinazioni quarzo/divisori/moltiplicatori, con un foglio di calcolo è semplice e divertente ottimizzare la scelta. Purtroppo non è possibile ottenere con un solo cristallo tutte le tre frequenze standard 32kHz, 44.1kHz e 48kHz, a causa soprattutto della “stranezza” del 44.1kHz.

La SPI del micro è settata come MASTER (il micro genera il clock), e 16-bit, così da ridurre il carico di lavoro del micro.

L’uscita SPDIF viene prelevata dal pin PA7-MOSI, tramite un condensatore da 100nF, in serie ad una resistenza da 390 ohm chiusa a massa con una 94 ohm (2x47ohm in serie). Il condensatore serve ad eliminare la continua dal segnale emesso dal micro, che è compreso tra 0 e 3.3V, e quindi ha un valore medio di 1.65V. Il partitore resistivo attenua il segnale da 3.3Vpicco-picco a 0.5-0.6Vpp come richiesto dallo standard SPDIF, con impedenza di uscita di circa 75 ohm.
Per la connessione all’ampli sarebbe necessario un cavo coassiale da 75 ohm, ma un normale cavetto, schermato o non, funziona perfettamente (purchè non troppo lungo).

Su YouTube è reperibile il video del test del sistema completo. Notare che il mio ampli fa lampeggiare la scritta DIGITAL quando non c’è un flusso digitale in ingresso, mentre quando ne riconosce uno, la scritta diventa fissa e in alto a sinistra il canale commuta da A (analogico) a C1 (coaxial 1).

POSSIBILI SVILUPPI E CONCLUSIONI
Partendo da questa base, è possibile realizzare:

    – generatore audio portatile con uscita digitale, per testare impianti A/V.
    – generatore audio con uscita analogica, collegando un convertitore SPDIF->analogico come gli UDA1350 o UDA1351 della NXP.
    – analizzatore di frequenza, aggiungendo un microfono electret di qualità e relativo ampli.
    – riproduttore musicale digitale di alta qualità, memorizzando ad esempio i files in formato lossless (WAV, FLAC, ecc) su SD card connessa alla seconda porta seriale.
    – utilizzo del DMA interno per ridurre ulteriormente il carico del micro.

Che dire altro, con soli 11€+IVA vi portate a casa un’evaboard con microprocessore a 32-bit reali e 24MHz, con debugger real-time incluso, tool di sviluppo gratuiti…pensateci bene prima di montare a mano il solito micretto!

Ringrazio la Redazione per l’opportunità.

12 Comments

  1. mingoweb 9 febbraio 2011
  2. Fabrizio87 9 febbraio 2011
  3. mingoweb 9 febbraio 2011
  4. Fabrizio87 10 febbraio 2011
  5. mingoweb 10 febbraio 2011
  6. rberna 14 febbraio 2011
  7. rberna 14 febbraio 2011
  8. linus 10 febbraio 2011
  9. Alex87ai 10 febbraio 2011
  10. stewe 9 febbraio 2011
  11. Fabrizio87 9 febbraio 2011
  12. giuskina 9 febbraio 2011

Leave a Reply