2017-01-04 4 views
0

내 애플 리케이션으로 점프 부트 로더를 작성했습니다. 먼저 간단한 블링키 (blinky-led) 앱으로 시도해보십시오. => 부트 로더에서 앱으로 이동할 수 있습니다.STM32F2 부트 로더 문제

이제 실제 앱으로 건너 뛰고 싶습니다. 응용 프로그램은 물론 혼자 노력하지만 난 내 부트 로더에서 뛰어 때 응용 프로그램은, 즉시 인터럽트가 활성화되어 나의 점프 코드를 충돌 :

__disable_irq(); 
SCB->VTOR = (uint32_t)0x0800BA00; 
JumpAddress = *(__IO uint32_t*) (0X0800BA04); 
JumpToApplication = (pFunction) JumpAddress; 
__set_MSP(*(__IO uint32_t*) 0X0800BA00); 
JumpToApplication(); 

내가 잘못 알고하지 않는 이유의 활성화 앱이 중단되면 중단됩니다.

는 응용 프로그램으로 이동하기 전에, 당신이 부트 로더에서 초기화 한 모든 초기화를 해제해야

답변

1

당신의 도움을 주셔서 감사합니다. 부트 로더가 인터럽트와 함께 USART를 사용하는 경우이 USART를 비활성화 (예 : RCC->AHBxRST/RCC->APBxRST 레지스터 사용)하고 해당 인터럽트를 비활성화해야합니다. 인터럽트가 활성화 된 상태에서 응용 프로그램으로 이동해야합니다. 응용 프로그램은 정상적인 재설정 후 칩을 가져와야합니다.

응용 프로그램 ST에서이 쓰레기 코드를 사용하는 경우는,이 ​​코드는 하지 리셋을 수행하는지 확인 SPL 또는 HAL라고 SCB-> VTOR 다시 0 또는 0x8000000을에, 일반적으로는 않기 때문이라고 SystemInit()에서 Reset_Handler()에서 main() 전에

동의어 - 신청서 주소가 확실합니까? 0x800ba00 (46.5kB) ... 꽤 멀리 가까운 페이지 경계 32KB와 48KB로부터 부트 코드 & 응용 프로그램 코드의

+0

답장을 보내 주셔서 감사합니다. 주변 장치와 연관된 모든 인터럽트를 비활성화했습니다. 당신이 제안한대로 그들을 재설정해야합니까? 점프하기 전에 일반 인터럽트를 다시 활성화해야합니다. SystemInit()에서 VECT_TAB_OFFSET을 0xBA00으로 설정했습니다. 앱이 인터럽트를 활성화해도 여전히 작동하지 않습니다. 다른 아이디어있어? 주소에 관해서는 그 주소에 맞는 링커 응용 프로그램 파일을 작성하는 것이 좋습니다. – caius

+0

@caius - 응용 프로그램을 0x800ba00에 배치하도록 링커에 지시 할 수 있지만 해당 주소로 해당 응용 프로그램을 깜박이면 0x8008000 (32kB)에서 메모리가 지워집니다. 그래도 여전히 작동하지 않는다면 문제를 디버그해야한다고 생각합니다. 적절한 레지스터의 값을 확인하고 정확히 "충돌"("예상대로 작동하지 않음"또는 "하드 오류로 점프"또는 sth else), 등등. –

+0

시간 내 주셔서 다시 한 번 감사드립니다. 디버깅을 시도 할 것이지만 앱으로 건너 뛰는 방법을 모르겠습니다. 주소에 대해서는 내가 제안한대로 0x8008000에서 지울 것입니다. 그것을 지우지 않으면 위험이 무엇인지 이해하려면? – caius

0

세트 시계 설정 - 코드가 아닙니다 동안 일반적으로 페이지 경계에서 응용 프로그램을 넣어 같은

+0

). 대답이 아닌 댓글처럼 보입니다. – LethalProgrammer