Newsgroup: it.hobby.elettronica.digitale
Titolo: STM32F2,se non parto da 0x8000000 non va systick interrupt

Ciao,
chiedo aiuto al ng e in particolar modo al gentile F.Sacchi,che già mi ha 
aiutato latre volte a riguardo.
Delimito il problema:
Programmino che fa 3 beep beep via PWM
Se lascio che il linker piazzi il codice e la tabella dei vettori facendo 
riferimento all'indirizzo di default 0x8000 000 tutto funziona regolarmente.
 
Voglio ora forzare il tutto a funzionare partendo da es:0x8002 000
per fare questo modifico il file .icf dove si istruisce il linker a generare 
del codice da piazzare in certi indirizzi assoluti(vedi sotto)
 
 
entrando nel debug del file modificato sembra(a me) tutto ok:
all'indirizzo 0x8002 000 + 1*4 c'è  l'indirizzo a cui si trova 
effettivamente la routine del ResetHandler
all'indirizzo 0x8002 000 +15*4 c'è l'indirizzo a cui si trova effettivamente 
la routine del SystickHandler
 
Parte il debug,il programma mi gira,ma....non entra mai nell'interupt di 
Systick
Perchè???????????
 
 
Nelle impostazioni del debugger impongo allora di usare un macrofile in cui 
c'è solo
 
execUserReset()
{
  MSP = *(int*)0x08002000;
  PC =    *(int*)0x08002004;
}
 
ma non cambia molto
 
 
Grazie
 
 
 
 
indicate da  " /*<<<<<<<<<<<<<<<*/ "
  le linee che ho modificato da 0x8000 000 a 0x8002 000
inoltre ho aumentato __ICFEDIT_region_ROM_end__   = 0x080FFFFF;
Il file .icf è riportato sotto
 
 
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08002000;     /*<<<<<<<<<<<<<<<*/
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08002000; 
/*<<<<<<<<<<<<<<<*/
define symbol __ICFEDIT_region_ROM_end__   = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20020000;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x200;
/**** End of ICF editor section. ###ICF###*/
 
 
define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to 
__ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to 
__ICFEDIT_region_RAM_end__];
 
define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__ 
{ };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__ 
{ };
 
initialize by copy { readwrite };
do not initialize  { section .noinit };
 
/*place at address mem:0x08000000 { section .Flasher };*/
 
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
 
place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };
 
 
 
 

 /*place at address mem:0x08000000 { section .Flasher };*/
 
Perché è commantato? Non è che ti sei dimenticato di modificare 
aggiungere qualcosa?
 
Ciao!
 
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org
 


 
la parte commentata č una parte aggiunta da me secondo indicazioni IAR, e 
poi tolta.
Secondo le indicazioni IAR se voglio caricare in flash ANCHE una seconda 
applicazione,es. un bootloader e metterlo in un certo indirizzo fisico devo 
prima farlo compilare e linkare separatamente,impostando l'output converter 
in modo da generarne un' immagine binaria,senza alcuna formattazione tipo 
.hex o s19.Questa immagine puň avere un nome a piacere,io ho usato 
"Flasher".
L'idea era quella di mettere questa plima applicazione all'indirizzo 
0x8000000 ,partire da quella e poi saltare all'applicazione principale,che 
avrebbe potuto essere una nuova versione  caricata in flash dal bootloader 
oppure no.
Vedendo poi che non riuscivo nemmeno a fare girare senza anomalie solo la 
2nda applicazione quando questa partiva da indirizzo flash diverso da 
0x8000000 ho commentato la parte in questione.
 
Grazie ancora per avermi fatto notare questi punti.
Continuo e se dovessi risolvere posterň la soluzione ad un problema 
certamente creato da me senza saperlo
 
buonanotte
 
 
 
 
 
 

>
 
Credevo ci pensasse il  già citato file .icf agenerare il necessario codice 
,invece il registro VTOR contenente l'eventuale offset della tabella dei 
vettori puntava ancora a
0x8000000,cambiandone il contenuto a mano durante il debug o tramite 
istruzione prima ancora di arrivare al main risolve il problema.
 
Grazie ancora per l'aiuto a Francesco Sacchi e a chi avesse dedicato tempo a 
leggere questo thread 
 
 

 leggere questo thread
 
Di nulla, anche perché non č che abbia poi fatto molto :-)
