Dear All,
I use LPC1778 and try to divide internal flash memory for my handmade bootloader and firmware. And when i set another IROM1 start address for my firmware (for example 0x1000) i see SWD Communication Failure message in window "Building Output". After that i can't debug or update my mcu. Can use only ISP. Why changing IROM1 start address is stopping MCU? What i have to do to run my code from any address? P.S. When i use LPC2367 there is no these problems. P.P.S. My version 4.53
I trying apply RAM_MODE, REMAP commands for my startup file. But doesn't work. With best regards, Vladimir.
Did you program the Vector Table Offset Register and start your Firmware from your bootloader?
The addresses need to be changed:
// <h> Vector Table // ================= // // <o0> Vector Table Base Address // Vector Table Base Address // Default: 0x90000 // #define NVIC_VectTab_FLASH 0x90000 #define SP_OFFS 0 #define RESET_OFFS 4 // </h> int main() { void (*user_code_entry)(void); register uint32_t MSP __ASM("msp"); // put bootloader stuff here SCB->VTOR = NVIC_VectTab_FLASH; user_code_entry = (void (*)(void))(( *((unsigned int *)(NVIC_VectTab_FLASH + RESET_OFFS))) ); MSP = *((unsigned int *)(NVIC_VectTab_FLASH + SP_OFFS)); user_code_entry(); while(1); // should never reach this ... }
Sorry if i said incorrectly. There is no bootloader at this moment. It's possible to run programm from another address without bootloader? Or i have to write it, for normal work?
With regards, Vladimir.
Then you must set the Regs via .ini file. See any Cortex-M RAM project in Boards\ folder.
How do you suppose that the processor would know:
1. that you have code at "another address", and
2. what that address is?
Ok, if processor don't know his start address. How it's possible to let him know?
With best regards, Vladimir.
see my two posts.
a) bootloader b) via .ini file that sets the Registers.
I add .ini file as initialization file in debug/simulator. //--------------------------------------------------------------------------------------------- FUNC void Setup (void) { SP = _RDWORD(0x10000000); // Setup Stack Pointer PC = _RDWORD(0x10000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x10000000); // Setup Vector Table Offset Register - VTOR }
LOAD %L INCREMENTAL // load the application
Setup(); // Setup for Running
g, main
//---------------------------------------------------------------------------------------------
And try to run my programm in simulator. But it doesn't work even in simulator... It's stoped in 1st instruction :
0x00000000 0000 MOVS r0,r0
Where is my mistake??? Does anyone knows?
With best regards, Vladimir
Is that really what your .ini file looks like?
Of course it isn't. No doubt you are in awe of my superior intellect and know you will never attain similar heights, but you must at least be able to clamber up the fist step and post code so others can read it.
I'am sorry if i reviled you. But specialists on this site recomend me to find and add .ini file in project. And i just don't know how to correctly post code.
Thank you very much! It's really looks better. I add .ini file as initialization file in debug/simulator.
FUNC void Setup (void) { SP = _RDWORD(0x10000000); // Setup Stack Pointer PC = _RDWORD(0x10000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x10000000); // Setup Vector Table Offset Register - VTOR } LOAD %L INCREMENTAL // load the application Setup(); // Setup for Running g, main
I removed .ini file. And created bootloader with next code:
#define NVIC_VectTab_FLASH 0x10000 #define SP_OFFS 0 #define RESET_OFFS 4 int main (void) { //========== NEW BOOTLOADER FOR CORTEX-M3 ================= void (*user_code_entry)(void); register uint32_t MSP __ASM("msp"); SCB->VTOR = NVIC_VectTab_FLASH; user_code_entry = (void (*)(void))(( *((unsigned int *)(NVIC_VectTab_FLASH + RESET_OFFS))) ); MSP = *((unsigned int *)(NVIC_VectTab_FLASH + SP_OFFS)); user_code_entry(); }
And after burning my programm from: 0x10000 address I see next message:
SWD Communication Failure.
Where is my mistake? Please help.
Dear Keil Support! I wrote simple bootloader. And seems it's work. But when i download my firmware(0x10000 address) via button "Download". My bootloader is not start. And i see SWD communication error. But most interesting, that durind downloading it is write some data in 0x300 address. And after that my bootloader is not start. It's possible to fix it?
Hi Vladimir,
I think it would be the best if you directly contact our support team by creating a support request. There you can also upload your code that we can check & discuss it with you.
This forum is a User2User forum, and not regularly monitored by our support team.
BR, /th.
I sorry, but i'am made big mistake. I use some variables with __attribute__((at(0xxxx))) And durind writing main firmware bootloader was cleared too. Now it's work fine. Thank you veru much for help! Big thanks 'Thorsten Arm' for bootloader code!