Domanda:
Ho davvero bisogno di mettere il microcontrollore stm32 in modalità bootloader per programmarlo?
iMohaned
2017-10-28 00:10:45 UTC
view on stackexchange narkive permalink

Ho iniziato ad imparare il microcontrollore stm32 per un po 'di tempo usando una scheda di sviluppo molto piccola "stm32f103c8t6" (o pillola blu). quando ho iniziato, ho imparato da alcuni tutorial che devo cambiare un jumper per programmarlo.

enter image description here (La foto è uno screenshot tratto da un tutorial casuale, ma ogni tutorial che ho visto lo diceva anche)

enter image description here

Il jumper - per quanto ne so - cambia solo la modalità di avvio del processore da caricare dalla memoria di sistema (il bootloader) che ha effetto solo se riavvio la scheda per avviare l'avvio da lì.

Non so come dovrebbe essere una "modalità di programmazione" poiché sto utilizzando un programmatore st-link esterno che utilizza SWD.

enter image description here

Quindi la mia domanda qui, esiste davvero una cosa chiamata "modalità di programmazione"? e in tal caso, come funziona esattamente?

Vale anche la pena ricordare che ho appena provato a programmarlo e il programma ha funzionato come dovrebbe (spero di non aver sbagliato nulla: d).

Quattro risposte:
duskwuff -inactive-
2017-10-28 01:06:22 UTC
view on stackexchange narkive permalink

Devi solo mettere il microcontrollore in modalità bootloader se intendi programmarlo tramite UART, utilizzando il bootloader.

In generale, puoi programmare il microcontrollore su SWD in qualsiasi momento.

Le eccezioni principali sono se il microcontrollore esegue un programma che disabilita SWD impostando un bit SWJ_CFG in AFIO->MAPR (ad esempio, per utilizzare i pin associati come GPIO) o se l'MCU funziona in modalità a basso consumo senza i flag DBGMCU appropriati impostati per mantenere attiva l'interfaccia di debug in quelle modalità.In uno di questi casi, mettere il microcontrollore in modalità bootloader è una soluzione semplice, poiché l'interfaccia SWD è attiva (e le modalità di sospensione non vengono utilizzate) mentre il bootloader è in esecuzione.

Non hai nemmeno bisogno di giocare con i pin BOOT0 / 1 per farlo.Ho riavviato con successo il bootloader ROM su diverse famiglie STM32 attraverso un'attenta codifica.I perni BOOT sono utili ma non assolutamente necessari.
Nota anche che il bootloader della ROM supporta diversi tipi di interfacce, non solo UART.Sebbene il `103 abbia l'USB, questa non è una delle interfacce supportate dal bootloader della ROM.Nelle successive varianti STM32 lo è.
@ChrisStratton Non è necessariamente così semplice come le varianti "successive", ma essenzialmente hai ragione.[Nota applicativa ST AN2606] (http://www.st.com/resource/en/application_note/cd00167594.pdf) ha una lunga carrellata di quali parti STM32 hanno quali bootloader e quali funzioni sono supportate.
@akohlsmith che non è una scienza missilistica (6-7 righe di codice da invocare).Ma il bootloader interno è un po 'inutile in quanto non controlla se l'immagine è corretta, non fornisce alcuna decrittazione dell'immagine caricata e non funziona se proteggi la memoria.Nei dispositivi di produzione uso i miei: scriverli è abbastanza semplice e diretto.
@duskwuff-inactive- dopo l'accensione, questo boot loader attende per sempre un programma tramite UART?o controlla il programma e continua a eseguire il codice esistente?
youtooth
2017-10-28 01:08:53 UTC
view on stackexchange narkive permalink

Se stai usando un programmatore ST-Link (SWD), non hai bisogno di mettere la scheda in "modalità di programmazione".

Un bootloader è ciò che consente al chip di "scaricare" ed eseguire un nuovo programma.Il jumper "modalità di programmazione" utilizza i pin BOOT per segnalare al bootloader della ROM che ha bisogno di prepararsi a scaricare un nuovo programma, altrimenti il chip inizierà a eseguire il programma che è già in memoria.Poiché stai utilizzando SWD per la programmazione, il bootloader della ROM non è necessario.

[modifica]: come Chris Stratton e duskwuff sottolineano di seguito, il bootloader ROM STM32F103 non supporta la programmazione tramite USB, solo UART, e non può essere cancellato.Esiste un bootloader flash utente separato che può essere caricato sulla scheda che supporta la programmazione tramite USB (ad esempio per l'uso con l'IDE di Arduino), ma non utilizza i pin BOOT (quindi non è influenzato dail jumper "modalità di programmazione").

Il bootloader coinvolto qui è in ROM (o, almeno, flash non modificabile dall'utente).È separato dal flash dell'utente e non può essere cancellato tramite SWD.
@duskwuff, grazie per la correzione!Stavo pensando a un chip diverso.
** Questo non è corretto ** - il bootloader ROM di fabbrica sull'STM32F103 ** non supporta l'USB **, anche se su molte versioni successive di STM32 lo fa.Pertanto, qualsiasi bootloader USB funzionante per il `103 dovrebbe risiedere nella flash dell'applicazione piuttosto che nella ROM, e quindi per inserirla, i pin di avvio dovrebbero essere impostati per un avvio flash normale, * non * un bootloader ROM.
@ChrisStratton, grazie per la correzione!Apparentemente ho usato solo parti STM32 che supportavano USB / DFU per il bootloader di fabbrica, quindi non sapevo che non fosse supportato su questo chip.
Anche "solo UART" non è corretto - supporta una gamma di interfacce, ma non (sul `103) USB.
@ChrisStratton, secondo la [specifica STM32F103x8] (http://www.st.com/content/ccc/resource/technical/document/datasheet/33/d4/6f/1d/df/0b/4c/6d/CD00161566.pdf/files/CD00161566.pdf/jcr:content/translations/en.CD00161566.pdf) e [AN2606] (http://www.st.com/content/ccc/resource/technical/document/application_note/b9/9b/16 / 3a / 12 / 1e / 40 / 0c / CD00167594.pdf / files / CD00167594.pdf / jcr: content / Translations / en.CD00167594.pdf), sembra che solo USART1 sia supportato per il bootloader su questo chip.Potete fornire un collegamento che mostri le altre interfacce che supporta?
A.K.
2017-10-28 01:18:04 UTC
view on stackexchange narkive permalink

Ci sono forse molti modi per programmare la scheda, utilizzando diversi strumenti. Uno di questi, che sembra abbastanza facile, è usare ST-Link V2 (google it) e OpenOCD.

  1. Lascia entrambi i ponticelli di avvio su "0". Collegare i pin SWDIO, SWCLK, GND ai pin appropriati di ST Link. Applicare l'alimentazione alla scheda prestando attenzione se è 5 V o 3,3 V. L'ST-Link ha comodamente un'uscita a 3,3 V che può essere utilizzata. Poiché la scheda riceve 5 V dal connettore USB, non collegare altri pin di alimentazione contemporaneamente alla porta USB. Può essere utile avere un cavo con 4 terminali sul lato ST-Link e sdoppiato 3 + 1 terminali sul lato scheda. La scheda dovrebbe accendere un LED e potrebbe iniziare a lampeggiare con l'altro, se è programmato.

  2. Avendo installato OpenOCD, le versioni più recenti potrebbero avere meno bug (ad es. almeno 0.9.x o meglio 0.10.x). Le versioni precedenti, come quelle incluse nelle distribuzioni Linux, potrebbero avere problemi con es. ripristinare la configurazione e richiedere di armeggiare con i file di configurazione.

  3. [opzionale] Se esegui Linux e non ti senti a tuo agio con OpenOCD come root, crea un file in /etc/udev/rules.d con il seguente contenuto:

      SUBSYSTEMS == "usb", ATTRS {idVendor} == "0483", ATTRS {idProduct} == "3748", MODE = "0664", GROUP = "stlink"
    

Ciò consentirà ai membri del gruppo stlink di accedere al dispositivo ST-Link. Crea questo gruppo e aggiungici ad esso. Puoi usare qualsiasi gruppo che ti è comodo.

  1. Supponendo un host Linux e un'installazione OpenOCD predefinita a livello di sistema, controlla se la connettività è corretta, l'MCU è attivo e OpenOCD può comunicare con esso:

      openocd -f interface / stlink-v2.cfg -f target / stm32f1x_stlink.cfg
    

A seconda della versione di OpenOCD, potrebbe funzionare anche quanto segue:

  openocd -f interface / stlink-v2.cfg -f target / stm32f1x.cfg
 

Se le cose vanno bene, OpenOCD stamperà alcune informazioni sull'MCU (voltaggio, numero di punti di interruzione HW, ecc.) e continuerà a funzionare.

  1. Potrebbe essere possibile eseguire OpenOCD come demone e utilizzare telnet per usarlo, ma penso che sia più conveniente avviarlo ogni volta. Supponendo che tu abbia un binario correttamente compilato, diciamo blinky.bin , puoi programmarlo nell'MCU con il seguente script:

      OPENOCD = "openocd -f interface / stlink-v2.cfg -f target / stm32f1x_stlink.cfg"
    $ OPENOCD -c "init" -c "reset halt" -c "stm32f1x mass_erase 0" -c "flash write_bank 0 blinky.bin 0" -c "reset run" -c "shutdown"
    

Nota che all'interno di questo script c'è il nome del file che dovrai modificare. Probabilmente è una buona idea iniziare con qualcosa di veramente semplice.

Quanto sopra presuppone principalmente Linux come host, ma i passaggi dovrebbero essere concettualmente simili in Windows, dopo aver installato i driver e aver apportato modifiche a come le cose sono installate, come percorsi e così via.

Andrew Straw
2020-05-31 16:56:21 UTC
view on stackexchange narkive permalink

Dalla scheda tecnica del prodotto DS5319 PDF, Rev 17 (datata agosto 2015), sezione 2.3.8, Modalità di avvio:

All'avvio, i pin di avvio vengono utilizzati per selezionare una delle tre opzioni di avvio:

  • Avvio da Flash utente
  • Avvio dalla memoria di sistema
  • Avvio da SRAM incorporata

Il boot loader si trova nella memoria di sistema. È solito per riprogrammare la memoria Flash utilizzando USART1. Per ulteriori dettagli fare riferimento a AN2606.

Dall'introduzione di AN2606 PDF (rev 42, datato dicembre 2019): "Il bootloader è archiviato nella memoria ROM di avvio interna (memoria di sistema) dei dispositivi STM32. È programmato da ST durante produzione. Il suo compito principale è quello di scaricare il programma applicativo nella memoria Flash interna attraverso una delle periferiche seriali disponibili (USART, CAN, USB, I2C, SPI, ecc.) Per ogni interfaccia seriale viene definito un protocollo di comunicazione, con un set di comandi e sequenze compatibili. Questo documento si applica ai prodotti elencati nella Tabella 1. Sono indicati come STM32 in tutto il documento. "

Il capitolo sul bootloader dei dispositivi STM32F10xxx dice "Una volta inizializzata, la configurazione di USART1 è: 8 bit, parità pari e 1 bit di stop." "Pin PA10: USART1 in modalità di ricezione", "Pin PA9: USART1 in modalità di trasmissione".

Poi c'è AN3155, che descrive il protocollo USART effettivo, che viene avviato quando l'STM32 riceve il byte 0x7F .



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...