Domanda

Vorrei avere due applicazioni nel mio flash STM32, una è sostanzialmente un avvio e l'altra l'applicazione 'principale'. Ho capito come caricarli ciascuno in diverse aree di flash e dopo aver preso un dump della memoria tutto sembra nel posto giusto.

Quindi quando eseguo un reset carica l'avvio, tutto quello che fa al momento è passare all'applicazione. Debug dell'avvio, tutto sembra funzionare correttamente. Tuttavia, i problemi arrivano dopo che ho fatto il salto all'applicazione, esegue solo un'istruzione (assembly) e quindi torna indietro all'avvio. Dovrebbe rimanere nell'applicazione a tempo indeterminato.

La mia domanda è quindi: dove dovrei "saltare" nell'app?

Sembra che ci siano alcuni punti potenziali, come i vettori di interruzione, il gestore di reset, la funzione principale dell'app. In realtà ho provato tutti quelli senza successo.

Speriamo che abbia un senso, aggiornerò la domanda in caso contrario.

grazie per il tuo aiuto! Richard

Aggiornamenti:

  • Ho avuto un gioco nel debugger e ho cambiato manualmente il contatore del programma con il principale dell'applicazione, e questo ha funzionato molto bene, quindi mi fa pensare che ci sia qualcosa di sbagliato nel mio salto, perché il programma non funziona il contatore continua dopo il salto?
  • In realtà sembra essere il PSR, la 'T' viene ripristinata sul salto, se lo imposto nuovamente dopo il salto continua con l'app come desidero
  • Ok ha trovato una soluzione, sembra che il PC LSB sia impostato su 1 quando si esegue una diramazione o rientra nella modalità 'ARM' (istruzione a 32 bit anziché istruzioni a 16 bit come nella modalità 'pollice' Piuttosto un piccolo oscuro problema, grazie per avermi permesso di condividerlo con te!
È stato utile?

Soluzione

Assicurati di passare a un indirizzo in cui l'LSB è 1. Vedi questo sito per una spiegazione: http://www.embedded.com/columns/beginerscorner/15200241?_requestid=162471

Altri suggerimenti

Potresti voler cercare lo IAP (programmatore in-application) che ti permette di caricare il codice dallo psort RS232 su stm32. Ho iniziato a utilizzare e poiché fornisce il codice sorgente, è molto semplice modificarlo per i tuoi scopi. fondamentalmente dopo un reset è possibile codificare IAP per eseguire il bootload, ad esempio, dall'indirizzo 0x08002000 o dall'indirizzo 0x08003000. quindi tutto ciò che devi fare è impostare un flag nel codice dell'applicazione, quindi dire riavvia e la nuova applicazione verrà eseguita, spero che ciò sia di aiuto.

Richard,

Stavo cercando di fare la stessa cosa in cui ci sei riuscito, ma ho avuto problemi. Stavo usando IAR IDE e ho aggiornato il file * .icf (nella directory "proj") per mettere la mia applicazione a 0x08002000 e ho caricato un progetto separato su 0x08000000 che fa semplicemente un salto all'indirizzo nel vettore di reset a 0x08002004. Il codice di avvio si è avviato e sembra saltare all'avvio dell'applicazione, ma l'applicazione non è riuscita durante l'inizializzazione IAR, finendo in una trappola ILLEGAL INSTRUCTION.

Dopo aver fatto un singolo passaggio attraverso il codice dell'applicazione, ho scoperto di aver dimenticato di impostare l'indirizzo di base del vettore di interrupt su quello dell'applicazione. Puntava ancora a 0x08000000 e quindi il codice è diventato pazzo. Aggiungere una chiamata per impostare l'indirizzo vettoriale prima di abilitare qualsiasi interruzione ha risolto il mio problema ed è necessario se si desidera che un'applicazione venga spostata in flash.

Ira.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top