Cortex M3 용 부트 로더
-
13-12-2019 - |
문제
MBE 1768 보드를 MBED에서 (COTREX M3 CPU와 함께) 사용하고 있습니다. 여기에서 뭔가를 달성하려고 노력하고 있습니다. 주로 SD 카드에서 사용자 응용 프로그램을 업그레이드하고 두 가지 프로그램을 작성하고 있습니다. 첫 번째 부트 로더 / 나노 - 커널 및 사용자 앱 (HelloWorld는 시작을 위해 수행) :
- Bootloader / Nano-kernel 0x00 주소가 실행되면 일부 수표를 수행하고 결국 SD 카드 에서 바이너리 파일을 그립니다.
- Bootloader / Nano-kernel은 0x9000 주소 0x9000 에서이 바이너리를 복사하지만이 공간은 Bootloader / Nano-kernel에서는 bootloader / nano-kernel에서 사용되지 않으므로
- 부트 로더는 0x9000 + 4 에서 사용자 응용 프로그램으로 이동합니다.
SD 카드는 운동하기 쉽고 점프 부분에 문제가 발생합니다. 점프 기능의 코드가 있습니다.
void run(void) {
void (*user_code_entry)(void);
unsigned *p;
SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);
// Load contents of second word of user flash - the reset handler address
// in the applications vector table
p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000
user_code_entry = (void (*)(void))p;
// Jump to user application
user_code_entry();
.
}
그래서 사용자 응용 프로그램이 시작 주소를 0x9000으로 변경하는 사용자 응용 프로그램을 컴파일했습니다 (저는 KEIL UVISION4를 사용하고 있습니다. FlashMagictool을 사용하여 내 보드를 프로그래밍 한 다음 수동으로 0x9004 (0x9000 + 4)로 수동으로 점프합니다 (0x9000 + 4), 사용자 응용 프로그램이 실행되었으므로 사용자 응용 프로그램이 0x9000에서 실행될 수 있으므로 사용자 응용 프로그램이 실행됩니다. < / P>
그러나 Bootloader / Nano-kernel을 실행하면 사용자 응용 프로그램으로 이동하지 않으며 불행히도 디버그 할 수 없으므로 무슨 일이 일어나는지 확신하지 못합니다. 나는 또한 사용하지 않으려 고 노력했습니다. SD 복사 부분이므로 Bootloader를 먼저 프로그래밍하여 기본적으로 0x9004로 점프하십시오. 그런 다음 0x9000에 앉아있는 사용자 응용 프로그램을 프로그래밍합니다. 보드를 재부팅하면 부트 로더가 실행되지만 user-앱으로 이동하지 않습니다. 나는 메모리를 점검했으며, 두 프로그램 (부트 로더 + 사용자 앱)이 올바른 위치와 올바른 위치에있는 것으로 보입니다.
여기에 뭔가를 놓치고 있습니다. 내가보아야 할 저수준 코드가 있습니까? 나는 온라인 문서를 읽었고, 내가 발견 한 예제에서, 그들은 내가하는 것과 같은 방식으로 사용자 코드로 점프하고있다.
해결책
Cortex M3은 엄지 모드에서만 실행할 수 있습니다.따라서 항상 address +1
로 점프해야합니다. 그렇지 않으면 오류가 발생합니다.
그냥 시도해보십시오 :
user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);
다른 팁
NXP 사이트에서 AN10866 문서를 읽으십시오.PC와 스택 포인터를로드 한 다음 재설정 인터럽트로 이동합니다.
__asm void boot_jump( uint32_t address ){
LDR SP, [R0] ;Load new stack pointer address
LDR PC, [R0, #4] ;Load new program counter address
}
void execute_user_code(void)
{
/* Change the Vector Table to the USER_FLASH_START
in case the user application uses interrupts */
SCB->VTOR = USER_FLASH_START & 0x1FFFFF80;
boot_jump(USER_FLASH_START);
}
.