2016-10-31 08:46 AM
Hi,
I want STM32L476 to jump to User program located at 0x80004000 if button is not pressed. Please check the flow chart as below; 1. I would like to know how can I remap the Vector table to RAM?2. What RAM address to use for Remaping Vector table and why?3. User program which will be stored at 0x8004000; need to have any specific build process to generate .hex/.bin files? i.e. is ther any configuration of Start address or initial clock to define before copile and build?Thanks regards #vector-table #in-app-programming2016-10-31 09:00 AM
The address for the APP image and vector table would be 0x08004000. This is frequently set up in SystemInit()
SCB->VTOR = 0x08004000;This is a topic area that's been covered here many times, review perhaps older posts, and the IAP examples furnished by ST.2016-10-31 09:10 AM
Hi Clive,
Thank you for the responce;I have read several post including yours ( about M0 does not have this VTOR register etc..) however,it is not clear that in which app (boot load or user app) I need to do the remapping?For Coretx M3/M4 processor there is no need to use RAM for Remaping vector table?The flash can be used directly for remaping vector table?the user app image(.hex/.bin) which will be flashed by IAP needs to be compile for 0x8004000 address or for 0x8000000 ?Please share some knowledge...Thanks2016-10-31 09:29 AM
On an M0 you'd need to use the base of RAM (0x20000000) cause that's the only thing other than 0x08000000 that is mappable at zero.
The M3/M4 need a suitably aligned memory, depending of the vector table size, that can be programmed into SCB->VTOR. On the F4, and likely the L4, this would need to be a 512-byte boundary. 0x08004000 fits this. You can set the address at a suitable time, most effectively BEFORE you generate interrupts or faults that would need the table to be in the correct spot. ie don't leave random crap running as you hand control from loader to application.You'd need to link the code for operation at the 0x08004000 base address, the addresses IN the vector table are ABSOLUTE so you can't have them point to some other random base addresses, it would need to match the addresses you've fixated in the image.Review M3/M4 Technical Reference Manuals, or Joesph Yiu treatment of such.2016-10-31 09:49 AM
Hi clive,
thanksI've noticed the code check for value of :20008000 in Application start address(i.e. 0x8004000).Why is this value required? The image being comipled does not have 20008000 instead 20000740 or other value.What is significance of 20008000 value?/* Test if user code is programmed starting from address ''APPLICATION_ADDRESS'' */if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)2016-10-31 11:23 AM
It is not checking that it is 0x20008000, it is looking at the Initial Stack Pointer (SP) Entry in the Vector Table, and confirming it points to RAM. It is a crude test, one could write a better version.
If it were 0xFFFFFFFF for example, it would be invalid, and suggest it is an erased flash memory2016-11-01 04:41 AM
Hi,
I have attached all my codes; please review. Two programs Program A and B; Prog A is the Application Image Prog B suppost be bootload program Prog A has Memory address assigned to 0x08004000 in system_stm32l4xx.c file, However not sure if it assigned correctly! After reset, when Button is Pressed MCU goes in Prog B (at 0x08000 000)and toggles LED at 1s However when button is not pressed, MCU doesn't seems to be running program from 0x0800400 SP shows 0x200000410 PC shows 0x0800049C (shouldn't it be 0x08004000 ?) Please check the debug log in attachments. Anything I'm missing here? ________________ Attachments : Debug_of_PB_to_PA.PNG : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I0nG&d=%2Fa%2F0X0000000bil%2FZ.I46FFt.UBJjl1rWi_3Ro9V0c53imRNkkpGykrNSGI&asPdf=falseFlow.PNG : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I17o&d=%2Fa%2F0X0000000bim%2FghNX8TealJdgkna.WFiQkqsWMhKvRnSu38vCY1ni2zk&asPdf=falsePA_at_08004000.PNG : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I0tP&d=%2Fa%2F0X0000000bik%2FOJ8AbQaXDTtmVWZ0KXzllOdQImAAi7yZmAlpzAl9.TI&asPdf=falsePB_at_08000000.PNG : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I16c&d=%2Fa%2F0X0000000bij%2FzKhDm3bDGFjuVhygD15N8TXtgeRKj3kkaDEaUvbfrF4&asPdf=falseProgram_A.txt : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I17j&d=%2Fa%2F0X0000000bih%2FQd_dofcvOyH9qW_5oN.g8BGnNAArmg6YSYecS8.wXec&asPdf=falseProgram_A_system_stm32l4xx.txt : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I17L&d=%2Fa%2F0X0000000bif%2FIrAtfHBVYNouYNYMHxXkamQUY9yTpszFjaEqDvplmII&asPdf=falseProgram_B.txt : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I17e&d=%2Fa%2F0X0000000big%2FlunrsCvjGjzQVk2mreu4VF8hdw5.6wtthdt_fL.aYtE&asPdf=false2016-11-01 05:50 AM
It would seem apparent that you are not building/linking the code for 0x08004000, you would need to address that in the Target pane, or the scatter file the linker is using.
The address of the PC will not be 0x08004000, but an address above that. The vector table is not executable code.2016-11-02 02:14 AM
Hi Clive,
Could you please explain in-app-process in steps? I'm assuming that; Prog B (bootloader) starts at 0x0800 0000 does HAL_init and Clock configuration then runs some user code(check for button press and then blinking LED at 1 sec in my case) if button not pressed it will Jump the application to 0x0800 4000 now here is the catch; When it says Jump to0x0800 4000..what happens actually? PC will have value0x0800 4000 ? or it will just remap0x0800 4000 to 0x0800 0000? and what about SP ? How can i Debugto see if it is actually Jumping to 0x0800 4000 successfully or not? I'm using Keiland ST CubeMxwith HALlibraries. How can I figure out if the problem is with .Bin Image of the prog Aor with the code of Prog B? I'm attaching .Bin of Prog A for reference. Is it possible for you to check if it is copied properly to run from address 0x0800 4000? Thanks ________________ Attachments : PA.bin : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I163&d=%2Fa%2F0X0000000bii%2F7s5ssgQIP0bM7ydotcorCYj10hyVIkcMQYf2tDCGFZ0&asPdf=false2016-11-02 02:37 AM
FYI,
Prog A
has Memory address assigned to0x08004000
insystem_stm32l4xx.c
file using#define VECT_TAB_OFFSET 0x4000
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
If you see thehttp://i63.tinypic.com/s3giaa.png
;http://i63.tinypic.com/s3giaa.png
After the line:__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);the Value of SP changes from 0x2000 0410 to 0x2000 04080x2000 0408 is the value of mem address
0x08004000
and the of Prog A while 0x2000 0410 is value of mem address 0x0800 0000 i.e. Prog B.Does that mean the Program jups to 0x0800 4000 but is not running the code properly?Please shed some light....