2017-11-23 8 views
0

arm-none-eabi-gcc 5.3을 사용하여 STM32L4 용 바이너리를 생성했습니다. 부트 로더를 사용하여 프로그램을 플래시하고 있습니다. 문제는 내가 전체 파일을 깜빡 일지 모르겠다. 나는 유효한 CRC가 없다. 플래시는 0x800000000x80040000 (부트 로더와 메인 프로그램은 2 뱅크)에서 시작됩니다. 현재 0x80040004가 0x800400000x80080000 사이에 있으면 프로그램이 플래시됩니다. 하지만 프로그램이 유효한지 어떻게 확인할 수 있습니까? 플래시에 기록해야하는 바이너리의 크기가 어디인지 알 수 없으므로 마지막 정수를 확인할 수 있습니다. BIN에서ARM에서 전체 프로그램이 플래시되었는지 확인하는 방법은 무엇입니까?

다음은 처음 몇 바이트 (죄송합니다, 전체 파일을 게시 할 수 없습니다) : enter image description here 마지막 바이트 프로그램되지 않은 (프로그램이 72704 바이트가) 0x80051C00입니다.

+0

나는 확실하지 않다 파일 내용이 모두 유용하지만 질문 내용에 대한 오프 사이트 링크를 게시하지 마십시오. – Clifford

+0

마지막 몇 개를 확인하면 중간에있는 내용이 올바른지 확인할 수 있습니다. 당신은 바이너리에 무언가를 추가하고, 끝을 채우기/채우기로 채우고, 그 다음에 체크섬/crc를 추가하여 검증 또는 런타임으로 로더 끝에서이 작업을 수행해야합니다. 런타임 시작 코드는 전체 공간을 검사합니다. 또는 이전 옵션은 호스트에서 mcu를 프로그래밍 할 때 읽은 다음 다시 확인합니다. –

+0

이 애플리케이션 노트 [AN277] (http://www.keil.com/appnotes/files/an277.pdf)는 바이너리 이미지에 CRC를 추가하는 방법에 대한 아이디어를 제공 할 수 있습니다. 이 예제는 Keil 도구를 사용하지만 다른 도구 체인에 적용 할 수 있습니다. – kkrambo

답변

1

전송 중에 데이터 연결이 손실 될 가능성이 가장 높은 오류로 이미지가 부분적으로 만 기록됩니다. 전송 프로토콜에 일종의 데이터 무결성 검사가 포함되어야하지만 데이터가 수신되면 프로그래밍 오류가 발생할 가능성은 거의 없습니다. 이를 위해 단순히 16 진수 레코드의 체크섬을 확인하거나 XMODEM-CRC 또는 XMODEM-1K와 같은 CRC 오류 검사 프로토콜을 사용할 수 있습니다.

부분적으로로드 된 응용 프로그램 이미지를 시작하지 않으려면 간단합니다. 주소 순서 또는 심지어 데이터가 도착하는 순서로 플래시를 프로그래밍 할 필요가 없습니다. 따라서 0x80040004의 리셋 벡터에 대한 데이터가 수신되면 RAM에 유지하고 마지막으로 프로그래밍하십시오. 프로그래밍이 완료되지 않은 경우 리셋 벡터 값은 항상 0xFFFFFFFF를 될 것입니다 그런 식으로 :

의사 코드 : 스타트 업 코드에서 다음

WHILE receiving data 

    IF program_address in range 
     // Write all data except address at reset vector 
     IF program_address == 0x80040004 
      start_address = program_data 
     ELSE 
      write(program_address, program_data) 
     ENDIF 
    ENDIF 
ENDWHILE 

// Write reset vector *LAST* 
write(0x80040004, start_address) 

:

IF @0x80040004 == 0xFFFFFFFFFF 
    NO APPLICATION - DO SOMETHING! 
ELSE 
    START APPLICATION 
ENDIF 
+0

그건 내가 지금하고있는 일이다. – Razi91

+1

@ Razi91 :하지만 그것은 당신이 당신의 질문에 묘사 한 것이 아닙니다. 이 솔루션에 대해 만족스럽지 않은 점은 무엇입니까? 그것은 강력합니다. – Clifford