LA CAMPANA

C'è chi legge questa notizia prima di te.
Iscriviti per ricevere articoli freschi.
E-mail
Nome
Cognome
Come vuoi leggere The Bell
Niente spam

Questo clone di Arduino offre uno speciale bootloader che consente di caricare il firmware tramite USB, senza utilizzare componenti esterni come l'adattatore ST-Link o USB-UART.

Oggi dovevo lavorare con un controller nudo da CooCox e senza stm32duino. Ma ecco il problema. Anche una semplice lampadina lampeggiante versata attraverso questo bootloader non funziona.

Facciamolo bene. Forse i miei calcoli sembrano essere banali. Ma ho appena iniziato a studiare i controller STM32 e ho ucciso almeno mezza giornata per trovare il problema. Improvvisamente, questo articolo ridurrà i tempi di sviluppo per qualcuno.

Non ho nulla contro ST-Link e altri debugger. Ma nel mio dispositivo finito non lo sarà, ma ci sarà sicuramente USB. Perché non prevedere immediatamente la possibilità di aggiornare il firmware tramite USB? Personalmente, trovo questo metodo conveniente. tanto più che comunque, ho già un cavo collegato a cui c'è alimentazione e seriale USB.

Vediamo come funziona il bootloader. Per iniziare con l'esempio dei controller AVR. Perché me lo sono ricordato? Sono passato da Arduino e inconsciamente mi aspettavo lo stesso comportamento. Ma in STM32 tutto è andato diversamente. Pertanto, voglio parlare della differenza tra questi due microcontrollori.

Così. Nei microcontrollori AVeg ATMega, una certa quantità di memoria può essere riservata al bootloader vicino alla fine del flash. Utilizzando i bit dei fusibili, è possibile controllare da quale indirizzo verrà avviato il programma. Se non è presente alcun bootloader, il programma si avvia dall'indirizzo 0x0000. Se c'è un bootloader, inizia da qualche altro indirizzo (diciamo, in ATMega32 con 0x3C00, se la dimensione del bootloader è 2k).

Quando il bootloader ha fatto il suo lavoro, trasferisce il controllo al programma principale dall'indirizzo 0x0000. Coloro. il programma inizia sempre a 0x0000. Il compilatore e il linker funzionano con il fatto che il codice si troverà all'inizio dello spazio degli indirizzi.

Nei microcontrollori STM32, non è così. Tutti i programmi iniziano da 0x0800000. Un bootloader non è così speciale. Questo è lo stesso programma che parte dallo stesso indirizzo iniziale. Nel processo, il bootloader può ricevere il firmware (tramite USB o UART, leggere da un'unità flash USB, ricevere da un satellite, ottenerlo da un sottospazio, qualunque cosa ...) e scriverlo su indirizzi superiori al bootloader stesso. E, naturalmente, alla fine del suo lavoro, trasferisci il controllo al programma principale.


Pertanto, durante la compilazione del firmware, è necessario sapere dove il bootloader scriverà il firmware e regolare gli indirizzi di conseguenza.

Questo è tutto con la teoria. Passiamo alla pratica. Di seguito sono riportate istruzioni dettagliate su come fissare il bootloader USB ai microcontrollori della serie STM32F1xx e forse anche ad altri.

Vi sono, tuttavia, alcune limitazioni ai circuiti. Qui, sfortunatamente, non sono forte. ITP necessita di un resistore pull-up da 1,5k per la porta PA12 (aka USB D +). Ciò consente al bootloader di connettersi e disconnettersi da USB al momento giusto.

  • Ora il microcontrollore è pronto per il flashing attraverso il bootloader USB. Ma devi ancora riparare il firmware stesso. E devi fare 2 cose:
    • Indica l'indirizzo iniziale del linker. In CooCox, questo viene fatto nelle impostazioni del progetto, scheda Collegamento, sezione Aree di memoria, Indirizzo iniziale IROM1. Il bootloader accetta i primi 8 kilobyte, il che significa che l'indirizzo iniziale del firmware sarà 0x0800000 + 0x2000 \u003d 0x08002000. Anche il campo Dimensione, probabilmente, dovrebbe essere ridotto di 8k.
    • Da qualche parte all'inizio del programma, prima di inizializzare la periferia, effettuare una chiamata

      NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x2000);

      AGGIORNAMENTO 17/05/2018: non esiste alcuna funzione NVIC_SetVectorTable () nella versione moderna di STM32Cube. È possibile invece correggere il difetto VECT_TAB_OFFSET nel file system_stm32f1xx.c (o simile per un altro microcontrollore)

  • Il riempimento del firmware può essere preso dal progetto stm32duino. Nella directory degli strumenti, cerca uno script chiamato maple_upload. Ho usato solo la versione di Windows - maple_upload.bat.
  • Esegui in questo modo:

    "maple_upload.bat" COM20 2 1EAF: 0003 "Percorso \\ To \\ Firmware.bin"
    Invece di COM20, è necessario sostituire la porta in cui è collegato il microcontrollore.

    Il versatore è una cosa molto tenera, non gli piacciono i percorsi relativi. quindi il percorso del firmware deve essere specificato completamente.

    1EAF: 0003 è VID e PID

    2 - questo è il parametro AltID, che indica che il firmware deve essere caricato a 0x08002000 (leggi).

  • Un altro po 'di sfumature. Prima di caricare il firmware, è necessario eseguire il bootloader. Il modo più semplice è premere il pulsante di ripristino. Successivamente, il bootloader verrà avviato e attenderà alcuni secondi per il firmware. Se nessuno ha avviato maple_upload in quel momento, il bootloader trasferirà il controllo al firmware principale.

    Ciò può causare inconvenienti. Se il microcontrollore si spegne e si blocca, non ascolta più la porta. Pertanto, non può ascoltare la sequenza di tasti e riavviare nel bootloader. Quindi ripristinare solo per aiutare.

    È tutto. Spero che il mio articolo faccia luce su come funziona il bootloader in STM32 e su come scaricare il firmware tramite una porta USB. Sfortunatamente, la soglia d'ingresso è ancora alta, ma all'improvviso il mio articolo aiuterà qualcuno a superarlo.

    È possibile eseguire il flashing di qualsiasi microcontrollore stm32 tramite USART_1 e altre interfacce, vedere i dettagli in. Per questo, MK ha uno speciale bootloader di sistema, che è cablato Memoria di sistema (area di memoria speciale) in fase di produzione, non può essere cancellato o modificato. Questo bootloader viene inizializzato "tirando" il pin BOOT_0 su "plus", dopodiché si aspetta che arrivi il firmware.

    Tramite USART è possibile scaricare qualsiasi file .bin o .hex.

    La descrizione è fatta sull'esempio della scheda Blue Pill, tuttavia, tutto quanto detto è vero per qualsiasi stm32.

    I board aziendali come Discovery e Nucleo possono anche essere inviati tramite USART.

    Per funzionare, è necessario un convertitore da USB a UART ...

    Se non esiste una cosa del genere, ci sono due opzioni per trasformare arduin in un convertitore ...

    svolta

    1 . Chiudere RIPRISTINA sul GND (potrebbe non guidare).
    2 . Scarica qui uno schizzo così semplice:

    Void setup () (pinMode (0, INPUT); pinMode (1, INPUT);) void loop () ()

    Per verificare se Arduin funziona come convertitore, chiudere RX e TX, aprire e inviare eventuali caratteri. Se sono tornati, allora tutto funziona.

    Prima di lampeggiare è necessario stringere il pin BOOT0 su "più", questo metterà MK in modalità "bootloader di sistema". Sulla scheda descritta, questo viene fatto spostando il ponticello ...

    Se la scheda è marcata

    Sulle schede di marca (Discovery, Nucleo), devi anche tirare il pin BOOT0 al massimo, ma non funzionerà in questo modo. Prendi il circuito della tua tavola e trova lì i ponticelli corrispondenti ...

    Devi cercare qualcosa del genere:

    Non ricordo da quale scheda provenga questo circuito, ma l'essenza è questa: in questo caso, il pin BOOT_0 tirato al "meno" attraverso la resistenza R16 e il ponticello SB16. Se si rimuove il ponticello SB16, il perno verrà tirato sul "più" attraverso il resistore R17 e sarà possibile farlo lampeggiare. Dopo il firmware, è necessario riportare tutto al suo posto.

    Il jumper può apparire come un resistore.

    Colleghiamo il convertitore e STM come segue ...

    immagine

    Converter Rx <-> PA9 STM
    Converter TX <-> PA10 STM
    Converter GND <-> GND STM

    ... e collega il convertitore e STM al computer.

    Istruzioni firmware per

    Se vuoi, puoi prendere ST dal sito (in fondo alla pagina).

    Fai clic su Ripristina sulla scheda.

    Vai alla cartella Dimostratore di caricatore flash e corri Flash Loader Demonstrator.exe

    Scegliere la porta COM del convertitore e fare clic Il prossimo...

    ATTENZIONE Rimuovere la protezione

    Tale messaggio ...

    ... significa che la scheda è bloccata. Non c'è niente di sbagliato, basta rimuovere la protezione con il pulsante Rimuovere la protezione e quindi fare clic su ok.

    Protezione rimossa.


    Se continua a produrre errori, o non è stato premuto Reset o qualcosa con il convertitore.

    Se il semaforo emette un semaforo verde, non esitare a fare clic Il prossimo...

    Clic Il prossimo...

    Al passo Scarica sul dispositivo specifica il percorso del file .bin o .hex desiderato e fai clic Il prossimo...

    Tutto è pronto, riportare il jumper nella posizione originale e premere Reset.

    Istruzioni firmware per

    Scarica e decomprimi da qualche parte.

    Dalla cartella corrispondente al tuo sistema operativo, copia il file stm32flash nella cartella principale.

    Questa utility è nelle rape di Ubuntu, non lo so in altre distro, quindi la pubblico.

    Prima di lampeggiare, premere sempre Reset sulla scheda.

    Nel terminale, dai il comando:

    ./stm32flash -w /home/dima/myfile.bin -v -g 0x0 / dev / ttyUSB0
    Il nome e il percorso del file saranno tuoi. Con questa utility è anche possibile eseguire il flashing dei file HEX.

    Se giura sui diritti, allora dai il comando ...

    Sudo chmod 777 / dev / ttyUSB0

    ... o esegui l'utilità tramite sudo.

    Protezione da scrittura

    Se appare un messaggio simile ...

    ... quindi dare due comandi a turno:

    ./stm32flash -u / dev / ttyUSB0 ./stm32flash -k / dev / ttyUSB0

    Il primo rimuove la protezione da scrittura, il secondo dalla lettura.

    Se avevi un bootloader Arduin, verrà sovrascritto, per ripristinarlo basta riempirlo con il metodo sopra

    Supponiamo che tu abbia lanciato il tuo dispositivo sul mercato e abbia paura che qualcuno inizi a copiarlo ... Effettivamente, basta collegare il programmatore al nostro dispositivo e leggere il firmware, ad esempio, tramite l'utilità ST-Link ( BersaglioCollegare).

    Ovviamente, puoi semplicemente strappare le gambe del microcontrollore ... ma gli sviluppatori di ST Microelectronics offrono un'alternativa migliore. Tutti gli MK hanno un sistema di protezione della lettura. La sua essenza è estremamente semplice: se un determinato valore è impostato in un registro speciale (byte opzione), la possibilità di eseguire il debug e leggere il firmware è disabilitata. In questa modalità, perderai anche la possibilità di far lampeggiare MK. Naturalmente, questa protezione può essere disabilitata modificando il valore nel registro dei byte Opzione, ma in questo caso la memoria del programma verrà sovrascritta, il che significa che nessuno può copiarla.

    È possibile modificare il valore nel registro utilizzando la stessa utilità ST-Link, BersaglioByte opzione ...Leggi la protezioneABILITARE.


    Disabilitare, rispettivamente, può essere fatto in modo simile. Questo non è molto conveniente se ci sono molti dispositivi. È possibile abilitare la protezione a livello di codice.

    Per implementare la protezione, è conveniente utilizzare la libreria periferica standard, in particolare stm32f10x_flash.c contiene la funzione di cui abbiamo bisogno. Il registro stesso, oltre a lavorare con la memoria flash, è descritto nel documento. Tuttavia, prima di questo ricordiamo come viene implementata la protezione dell'inclusione multipla di file header. Abbiamo usato direttive per il preprocessore come:

    • #define - la direttiva dice al preprocessore di sostituire la riga nel file, tuttavia, se l'argomento (ciò che è alla fine) non specifica l'identificatore stesso (quindi quello al centro) rimane nel sistema e può essere controllato da altre direttive (cioè, è possibile scrivere una condizione, con quale codice specifico verrà eseguito o viceversa);
    • #ifndef - la direttiva può essere letta come “se non definitivamente”, tuttavia un altro #ifdef - “se sicuramente” è più adatto a noi;
    • #endif è una direttiva che indica la fine di una condizione.

    Crea un identificatore che dirà che questo assembly è definitivo. Mentre questa riga è commentata, il codice inserito tra #ifdef e #endif non verrà eseguito.

    // # definisce RILASCIO

    Nell'assemblaggio finale, è sufficiente decommentare la linea e far lampeggiare il dispositivo.

    #ifdef STAMPA // codice qui #endif

    E ora all'essenza. Abbiamo già capito come lavorare con la memoria flash interna del microcontrollore. Prima di scrivere i bit di protezione, è necessario sbloccare l'accesso alla memoria, quindi è necessario eseguire le operazioni necessarie e bloccare nuovamente l'accesso. Si scopre quanto segue:

    #ifdef RELEASE #warning "La protezione è ON. Il debug è OFF" se (FLASH_GetReadOutProtectionStatus () \u003d\u003d RESET) (FLASH_Unlock (); FLASH_ReadOutProtection (ENABLE); FLASH_Lock ();) #endif

    Oggi proteggeremo il firmware su stm32 dalla lettura di hacker fantastici. Per non tirare la gomma, ecco un codice:

    #ifdef NDEBUG if (FLASH_GetReadOutProtectionStatus () \u003d\u003d RESET) (FLASH_Unlock (); FLASH_ReadOutProtection (ENABLE); FLASH_Lock ();) #endif

    Come puoi immaginare, il pezzo usa la libreria di stm. È molto comodo usare un codice del genere: il controller stesso imposta la sua protezione al primo avvio e il primo avvio è facile da organizzare dopo il firmware. Eccola, la libertà dalla tirannia delle micce!

    Sì, so dell'olivor su "biblioteca vs accesso diretto ai registri". La mia posizione qui è questa: se hai bisogno di più velocità, o c'è poca memoria, ma hai bisogno di un accesso diretto ai registri. Se la velocità non è importante e c'è molta memoria, è meglio usare una libreria - in questo modo il programma è scritto più veloce e più leggibile.

    Rimuovere la protezione
    Il controller che abbiamo protetto. Ma il problema è che - dobbiamo correggere il nostro programma e con la protezione installata non è possibile fare nulla con il controller - né leggere né scrivere. Come rimuovere la protezione? Ti avverto subito: i ragazzi di ST hanno fatto tutto bene e tutto il firmware è stato distrutto insieme alla protezione.

    Per rimuovere la protezione, abbiamo bisogno del programma di utilità st-link. Puoi scaricarlo.

    Avviamo il programma e selezioniamo questo elemento, o semplicemente premiamo ctrl-b:

    Nel campo "Leggi stato protezione, seleziona off". E fai clic sul pulsante Applica:

    Insieme al bit di protezione, viene cancellata anche l'intera memoria:

    Difendiamoci, siamo per un sicuro embed.



    Nel mio progetto uso il microcontrollore STM32F103C8 e il framework stm32duino. Questo clone di Arduino offre uno speciale bootloader che consente di caricare il firmware tramite USB, senza utilizzare componenti esterni come l'adattatore ST-Link o USB-UART.

    Oggi dovevo lavorare con un controller nudo da CooCox e senza stm32duino. Ma ecco il problema. Anche una semplice lampadina lampeggiante versata attraverso questo bootloader non funziona.

    Facciamolo bene. Forse i miei calcoli sembrano essere banali. Ma ho appena iniziato a studiare i controller STM32 e ho ucciso almeno mezza giornata per trovare il problema. Improvvisamente, questo articolo ridurrà i tempi di sviluppo per qualcuno.

    Non ho nulla contro ST-Link e altri debugger. Ma nel mio dispositivo finito non lo sarà, ma ci sarà sicuramente USB. Perché non prevedere immediatamente la possibilità di aggiornare il firmware tramite USB? Personalmente, trovo questo metodo conveniente. tanto più che comunque, ho già un cavo collegato a cui c'è alimentazione e seriale USB.

    Vediamo come funziona il bootloader. Per iniziare con l'esempio dei controller AVR. Perché me lo sono ricordato? Sono passato da Arduino e inconsciamente mi aspettavo lo stesso comportamento. Ma in STM32 tutto è andato diversamente. Pertanto, voglio parlare della differenza tra questi due microcontrollori.

    Così. Nei microcontrollori AVeg ATMega, una certa quantità di memoria può essere riservata al bootloader vicino alla fine del flash. Utilizzando i bit dei fusibili, è possibile controllare da quale indirizzo verrà avviato il programma. Se non è presente alcun bootloader, il programma si avvia dall'indirizzo 0x0000. Se c'è un bootloader, inizia da qualche altro indirizzo (diciamo, in ATMega32 con 0x3C00, se la dimensione del bootloader è 2k).


    Quando il bootloader ha fatto il suo lavoro, trasferisce il controllo al programma principale dall'indirizzo 0x0000. Coloro. il programma inizia sempre a 0x0000. Il compilatore e il linker funzionano con il fatto che il codice si troverà all'inizio dello spazio degli indirizzi.

    Nei microcontrollori STM32, non è così. Tutti i programmi iniziano da 0x0800000. Un bootloader non è così speciale. Questo è lo stesso programma che parte dallo stesso indirizzo iniziale. Nel processo, il bootloader può ricevere il firmware (tramite USB o UART, leggere da un'unità flash USB, ricevere da un satellite, ottenerlo da un sottospazio, qualunque cosa ...) e scriverlo su indirizzi superiori al bootloader stesso. E, naturalmente, alla fine del suo lavoro, trasferisci il controllo al programma principale.


    Pertanto, durante la compilazione del firmware, è necessario sapere dove il bootloader scriverà il firmware e regolare gli indirizzi di conseguenza.

    Questo è tutto con la teoria. Passiamo alla pratica. Di seguito sono riportate istruzioni dettagliate su come fissare il bootloader USB ai microcontrollori della serie STM32F1xx e forse anche ad altri.

    Vi sono, tuttavia, alcune limitazioni ai circuiti. Qui, sfortunatamente, non sono forte. ITP necessita di un resistore pull-up da 1,5k per la porta PA12 (aka USB D +). Ciò consente al bootloader di connettersi e disconnettersi da USB al momento giusto.

  • Ora il microcontrollore è pronto per il flashing attraverso il bootloader USB. Ma devi ancora riparare il firmware stesso. E devi fare 2 cose:
    • Indica l'indirizzo iniziale del linker. In CooCox, questo viene fatto nelle impostazioni del progetto, scheda Collegamento, sezione Aree di memoria, Indirizzo iniziale IROM1. Il bootloader accetta i primi 8 kilobyte, il che significa che l'indirizzo iniziale del firmware sarà 0x0800000 + 0x2000 \u003d 0x08002000. Anche il campo Dimensione, probabilmente, dovrebbe essere ridotto di 8k.
    • Da qualche parte all'inizio del programma, prima di inizializzare la periferia, effettuare una chiamata

      NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x2000);

  • Il riempimento del firmware può essere preso dal progetto stm32duino. Nella directory degli strumenti, cerca uno script chiamato maple_upload. Ho usato solo la versione di Windows - maple_upload.bat.
  • Esegui in questo modo:

    "maple_upload.bat" COM20 2 1EAF: 0003 "Percorso \\ To \\ Firmware.bin"
    Invece di COM20, è necessario sostituire la porta in cui è collegato il microcontrollore.

    Il versatore è una cosa molto tenera, non gli piacciono i percorsi relativi. quindi il percorso del firmware deve essere specificato completamente.

    1EAF: 0003 è VID e PID

    2 - questo è il parametro AltID, che indica che il firmware deve essere caricato a 0x08002000 (leggi).

  • Un altro po 'di sfumature. Prima di caricare il firmware, è necessario eseguire il bootloader. Il modo più semplice è premere il pulsante di ripristino. Successivamente, il bootloader verrà avviato e attenderà alcuni secondi per il firmware. Se nessuno ha avviato maple_upload in quel momento, il bootloader trasferirà il controllo al firmware principale.

    Ciò può causare inconvenienti. Se il microcontrollore si spegne e si blocca, non ascolta più la porta. Pertanto, non può ascoltare la sequenza di tasti e riavviare nel bootloader. Quindi ripristinare solo per aiutare.

    È tutto. Spero che il mio articolo faccia luce su come funziona il bootloader in STM32 e su come scaricare il firmware tramite una porta USB. Sfortunatamente, la soglia d'ingresso è ancora alta, ma all'improvviso il mio articolo aiuterà qualcuno a superarlo.

    LA CAMPANA

    C'è chi legge questa notizia prima di te.
    Iscriviti per ricevere articoli freschi.
    E-mail
    Nome
    Cognome
    Come vuoi leggere The Bell
    Niente spam