Ci sono alcune cose che non capisco sul processo di avvio del microcontrollore STM32F4.
La mia comprensione è la seguente:
- L'avvio di ARM Cortex-M4 prevede il valore di inizializzazione del puntatore dello stack e i vettori di interruzione attivi
0x00000000 + SCB->VTOR
, mentreSCB->VTOR
viene azzerato al ripristino. - Non c'è memoria in quella posizione. La memoria flash inizia alle
0x08000000
, SRAM alle0x20000000
. - Per rendere possibile l'avvio, µC può mappare il flash o l'intervallo di memoria SRAM su
0x00000000
. L'intervallo di memoria da mappare è definito dallo stato dei pin di avvio.
Le mie domande:
Perché il manuale di riferimento STM32F4 dice a pagina 69 che
Quando il dispositivo si avvia da SRAM, nel codice di inizializzazione dell'applicazione, è necessario riposizionare la tabella vettoriale in SRAM utilizzando la tabella delle eccezioni NVIC e il registro offset.
? Dal mio punto di vista questo non è necessario, poiché l'intera area di memoria è comunque aliasata. È interessante notare che questo non sembra essere richiesto quando la regione del flash viene rimappata nello
0x0
spazio.L'unico uso per l'avvio da SRAM posso pensare se è quello di ridurre i cicli di scrittura sul flash durante lo sviluppo. Prima di rilasciare µC dal reset, scrivere il programma su SRAM usando il debugger e quindi avviare da lì. Tuttavia, poiché si dispone dell'accesso al debugger, non ci sarebbero restrizioni su dove avviare comunque. Quindi perché avere questa funzione?
Il fatto che la posizione di avvio sia derivata dai pin indica (almeno a mio avviso) che questa funzione non deve essere utilizzata durante lo sviluppo ma nell'operazione finale. E nell'operazione finale, SRAM è chiaro al momento dell'avvio. Quindi non ha senso eseguire l'avvio da SRAM.