2016-10-18 2 views
1

IAR에서 stm32l0 용 사용자 정의 부트 로더를 추가하는 적절한 단계는 무엇입니까? 다음 질문은 명확하지 않습니다.IAR에서 stm32l0 용 부트 로더 작성 시작

  • 새로운 IAR 프로젝트를 만들 수 있습니까?
    • 그렇다면 일반적인 프로젝트처럼 부트 로더를 작성하고 원래의 .icf 파일을 변경하여 부트 로더를위한 작은 ROM과 작은 RAM 영역을 만드십시오.
    • 아니요, ICF 파일 및 코드와 별도로 IAR proejct에서 구성해야하는 항목은 무엇입니까?
  • 내가 무엇을 생각해야합니까?

문제가 발생했습니다.

__region_ROM_start__ = 0x08000000; 
__region_ROM_end__ = 0x08008FFF; 

는 그래서 ICF는 부트 로더 프로젝트에 대해 다음과 같습니다 :

__region_Bootloader_ROM_start__ = 0x08009000; 
__region_Bootloader_ROM_end__ = 0x08009FFF; 

와 RAM의 약 0xFF에 대해 같은 일

는 그래서 ICF는 주요 프로젝트에 대한 것입니까?

+0

부트 로더는 신중가 플래시에 할당되는 경우 고려해야 제외하고, 어떤이 프로그램하도록되어 플래시의 일부, 다른 모든 프로젝트와 같다. – Lundin

+0

여기에 도착한 사람들을위한 유용한 링크 : https://www.iar.com/support/tech-notes/general/creating-a-bootloader-for-cortex-m/ –

답변

4

RAM을 제한 할 필요는 없습니다. 응용 프로그램으로 전환 할 때 새로운 런타임 환경이 설정되고 RAM이 재사용되므로 RAM을 모두 사용할 수 있습니다.

부트 로더를 위해 예약 한 플래시는 재설정 주소에서 시작하는 전체 플래시 페이지 여야합니다. STM32L0은 플래시 페이지가 매우 작기 때문에 낭비가 최소화되어야하지만 다음과 같은 경우에는 변경하지 않아도됩니다. 부트 로더가 커지면 새 시작 주소에 대한 응용 프로그램 코드를 다시 작성해야하며 이전 응용 프로그램 이미지는 더 이상로드 할 수 없게됩니다. 그래서 약간의 헤드 룸을 제공하는 것을 고려하십시오.

부트 로더는 다른 STM32L0xx 프로젝트와 마찬가지로 빌드 될 수 있습니다. 응용 프로그램 코드 ROM 구성은 부트 로더 위의 주소에서 시작해야합니다.

Boot ROM Start: 0x0800 0000 
Boot ROM End:  0x0800 03FF 
Application Start: 0x0800 0400 
Application End: Part size dependent. 

부트 로더 자체는 업데이트가 업데이 트 사용할 수는 다음 응용 프로그램 데이터를 읽고으로 작성해야하는 경우, 사용할 수 있는지 결정하는 수단이 있어야합니다 그래서 예를 들어 당신이는 1Kbytes 부트 로더가 말 응용 프로그램 플래시 메모리가 있으면 활성화 된 인터럽트를 비활성화해야합니다. 사용 된 주변 장치를 모두 초기화하지 않아도됩니다 (응용 프로그램으로 전환 할 때 활성 상태로 유지되면 문제가 발생할 수 있음). 응용 프로그램 코드가 작성됩니다.

부트 로더와 응용 프로그램이 모두 동일한 클럭 구성에서 실행되어 응용 프로그램의 구성을 최소화하고 부트 로더에 의존 할 수 있습니다. 이는 공간을 절약하지만 유연성은 떨어집니다. 예를 들어, 내부 RC 오실레이터를 사용하여 부트 로더를 실행 시키면, 애플리케이션 속도와 클로킹 요구 사항이 다르며 다른 외부 오실레이터 주파수가 다른 여러 하드웨어 설계에 이식 할 수 있습니다.

애플리케이션으로의 전환은 Cortex- M은 단순히 벡터 테이블을 응용 프로그램의 벡터 테이블로 전환 한 다음 프로그램 카운터를로드해야합니다. 후자는 작은 어셈블리 코드가 필요합니다.

다음 인라인 어셈블리 함수 주어 : 부트 로더 따라서, 애플리케이션 이미지로 스위칭

__asm void boot_jump(uint32_t address) 
{ 
    LDR SP, [R0]  ;Load new stack pointer address 
    LDR PC, [R0, #4] ;Load new program counter address 
} 

:

다음은 일부 M0 +에 대한 적응 그러나 가능하지 필요할 수 텍스 M3위한
// Switch off core clock before switching vector table 
SysTick->CTRL = 0 ; 

// Switch off any other enabled interrupts too 
... 

// Switch vector table 
SCB->VTOR = APPLICATION_START_ADDR ; 

//Jump to start address 
boot_jump(APPLICATION_START_ADDR) ; 

여기서 APPLICATION_START_ADDR은 응용 프로그램 영역의 기본 주소입니다. 이 주소는 초기 스택 포인터 및 리셋 벡터로 시작하는 응용 프로그램 벡터 테이블의 시작입니다. boot_jump() 함수는이를 SP 및 PC 레지스터에로드하여 재설정시 시작된 것처럼 응용 프로그램을 시작합니다. 응용 프로그램의 재설정 벡터에는 응용 프로그램의 실행 시작 주소가 포함됩니다.

당신의 요구는 다를 수 있지만 제 경험에 따르면 XMODEM을 사용하고 Intel Hex 형식의 이미지를 디코딩하는 직렬 부트 로더 (UART 사용)는 약 4Kb의 플래시를 필요로합니다. STM32L0에서 좀 더 간단한 것을 사용하고 싶을 것입니다 - 원시 바이너리 데이터를 단순히 스트림으로 보내고 하드웨어 흐름 제어를 사용하면 1Kb가 가능합니다 (플래시를 지우고 프로그래밍하는 데 시간이 걸리고 CPU가 실행을 멈추기 때문에 데이터 흐름을 제어해야합니다) STM32에서 플래시 메모리를 쓰는 동시에 STM32에서 명령을 가져올 수 없으므로).

은 참조 : How to jump between programs in Stellaris