[2022/02/10] 프로토콜 설명 추가, jar실행방법 추가, download방법 추가.
[2022/02/05] 처음 시작
소나무 기운 , 전자제품 개발/생산
MPLAB X IDE, MCC 8-bit bootloader
8bit MCU PIC16F15376을 이요한 Bootloader 제작을 해 보도록 하겠습니다.
MPLAB X IDE의 MCC(Microchip code configuration), XC8을 이용하여 간단하게 작업이 가능합니다.
조금 자세히 bootloader를 다뤄보겠습니다.
개요
ㅁ 부트로더의 구성은 3부분으로 나뉩니다.
1. Host Application - PC에서 구동되는 프로그램으로 MCU와 serial 통신으로 연결됩니다.
2. Device Bootloader - MCU에서 End Application의 관리를 담당합니다. ( End Application 검증, 다운로드, 실행 등 )
3. Device End Application - 제품의 목적에 맞게 구동되는 사용자 프로그램입니다.
host application은 새로운 hex파일을 로딩합니다. Serial을 통하여 Bootloader와 명령어를 이용하여 End Application을 업데이트 할 수 있습니다.
MCU에 전원이 들어오면 부트로더는 End App으로 이동할 지 Host App과 통신하여 End App을 업데이트 할지 결정합니다.
이와 관련되는 내용은 대부분 MCC(Microchip Code Configure)를 이용하여 간편하게 적용할 수 있습니다.
ㅁ bootloader의 기본 사항
- End Application이 정상적인 상태인지를 검사.
- Host APP과의 통신 기능
- End Application을 Update를 위한 Flash 삭제/쓰기 기능
- End Application실행하는 기능
ㅁ bootloader의 옵션 사항 ( 보안상 필요한 경우에만 적용 )
- End Application영역 이외의 메모리 읽기 쓰기 기능.
- End Applicataion영역 읽기 기능.
- End App의 손상여부 확인 및 복구 기능.
- Bootloader는 언제 End-App으로 제어권을 이동할 것이가? ( 언제 Jump할 것인가? )
- End App에서 언제 bootloader로 제어권을 이동할 것인가? ( 명령이 올때? 리셋되어 부팅될때? )
옵션 및 부품
bootloader 생성시 다음과 같은 중요한 결정사항이 있습니다.
- End-App이 정상적인지 검사할 것인가?
- Host App과 어떠한 명령을 주고 받을 것인가?
- EEProm의 읽기 쓰기 명력을 지원할 것인가?
ㅁ Reset vector 로 End-App 검사하기
End-App의 새로운 Reset Vector 주소에 값이 있으면 End-App이 정상이라고 판단하고,
Flash가 지워진값 0x3FFF로 되어 있으면 End-App 라이팅되지 않았다고 생각하고
Bootloader에 머물러 Host-App의 통신을 기다린다.
ㅁ Variable을 이용한 End-App 검사하기
- 변수에 bootloader의 상태를 기록하여 처리한다.
- 상태는 3가지로 표현된다. * 삭제/공백 상태, * End-App 정상 상태, * Bootloader 부팅 요청
- End-App상태에서 정상 동작 중 펌웨어 업데이트가 필요하면(통신을 통한 명령등 ) Bootlaoder 부팅 요청 상태로 변경후 MCU를 Reset한다.
- bootloader는 부팅시 변수를 확인하여 Bootloader부팅 요청 상태이면 bootloader에 머물고 업데이트를 시작한다.
- 변수의 상태를 Bootloader부팅요청 --> 삭제/공백 상태로 변경하고 Host-App과 통신을 대기한다.
- Host-App과의 통신으로 End-App의 업데이트를 완료하면 변수를 삭제/공백 --> End-App정상상태로 변경한다.
- MCU를 Reset한다.
ㅁ Checksum을 이용한 End-App 검사하기
- 특정 메모리 영역에 End-App영역의 checksum 값을 계산하여 저장해 놓는다.
- MCU는 부팅시 bootloader는 End-App의 checksum을 계산하고 저장되어 있는 checksum값과 비교하여 같을때만 End-App으로 이동한다.
- checksum이 저장값과 다를 경우 bootloader에 남아서 Host-App의 명령을 기다린다.
- 업데이트 후에는 checksum을 계산하여 특정 메모리 영역에 저장한다.
ㅁ 부팅시 일정시간 대기 방법
- MCU의 부팅후 bootloader에서 일정시간 ( 1 ~ 2초 )동안 Host-App의 명령이 있는지 대기한다.
- 일정시간 안에 명령이 오기 시작하면 End-App 업데이틀 시작한다.
- 그렇지 않고, 일정시간 명령이 없으면 End-App으로 jump하여 이동한다.
ㅁ IO Pin을 검사하여 진입하기
- bootloader는 부팅시 특정 IO핀을 확인하여 High(혹은 Low)이면 bootloader에 남아 Host-App의 명령을 기다린다.
- 그렇지 않으면 End-App으로 이동하여 동작을 시작한다.
ㅁ COMMUNICATION METHOD
- 기본 통신 방식은 UART가 기본입니다.
- 이 디바이스에서는 I2C, SPI, USB등은 지원하지 않습니다.
ㅁ VERIFICATION OF BOOTLOAD INTEGRITY
- Host-App에서 메모리 읽기 기능이 가능하다면 메모리를 읽어서 쓴 내용과 비교해 본다.
- 16bit checksum기능을 이용하여 쓴 내용의 checksum을 비교한다.
ㅁ SELF PROTECTION
- bootloader 영역은 쓰거나 지우기 명령이 듣지 않도록 처리한다.
- bootloader 영역의 hardware protection을 걸어둔다.
ㅁ IO PIN INDICATOR
- IO핀을 지정하여 현재의 상태가 bootloader 상태인지. End-Application인지 표시할 수 있다.
- IO핀을 설정한 핀은 LED를 연결하여 상태를 표시한다.
ㅁ ENABLE READ FLASH
- End-App부분의 보호를 위해서 Flash읽기 기능을 옵션으로 처리되어 있으므로 필요시 적용 가능하다.
- Host-Application은 보안상 이 기능을 지원하지 않는다.
ㅁ ENCRYPTION
- 통신에서 오고가는 데이터를 암호화 할 수 있습니다. (현재는 지원 안함)
- 키를 가지고 암호화 하여 처리할 수 있습니다. (현재는 지원 안함)
HEX 파일
ㅁ 인텔 hex파일 포멧
ㅁ PIC16F1XXX 설명
- Intel HEX file은 byte-oriented, PIC16은 word-oriented
- Hex파일에서 사용하는 주소를 2로 나누면 word어드레스가 된다.
- 바이트 어드레스 0x0F90은 워드 어드레스로 0x07C8이 된다.
- word address는 low바이트가 먼저 나옵니다.(little endian)
- PIC는 각각의 memory map이 다릅니다.
ㅁ PIC18F 설명
- PIC18F 비다이스는 byte-oriented입니다.
MCC bootloader generator
ㅁ GENERATE BOOTLOADER
MCC만으로 작업이 가능합니다.
1. bootloader 프로젝트를 생성합니다.
2. XC8 컴파일러를 선택합니다.
3. MCC를 시작합니다.
4. System Module에서 socillator를 설정합니다. 일반적으로 안정적인 통신을 위해 빠른것이 좋습니다.
5. ESUART선택, "Enable EUSART", "Enable Transmit", "Enable Continuous Receive" 선택, baud rate는 상관 없습니다. bootloader는 auto boud rate를 사용합니다. 인터럽트는 사용하지 않습니다.
6. Memory Peripheral에서 따로 선택할 것 은 없습니다.
7. Bootloader를 선택하여 UART, EUSART1, check reset vector, Application reset vector를 선택합니다. IO Pin Indicator, I/O Pin Entry, Software Protection을 enable합니다.
8. Pin Manager를 선택합니다. bootloader항목에서의 핀을 선택합니다.
9. 해당 IP Pin의 Analog 선택버튼이 해제되었는지 확인합니다.
10. generate버튼을 눌러 코드를 생성합니다.
11. 마지막으로 프로젝트 설정을 합니다. 프로젝트 설정 > XC8 Linker > Memory model > ROM ranges의 값을 0x6FF로 적용합니다. 컴파일 해 본후 메모리 사이즈를 참고하여 크기를 정합니다. 저는 0x700만큼을 잡았습니다.
12. bootloader는 시험할 준비가 되었습니다.
Merge Bootloader with the Application (End-App과 Bootloader 합치기)
End-App을 제작할때는 bootloader와 관련이 있습니다.그러기 위해서 End-App을 만들기 전에 Bootloader project configurations를 바꿔줘야 합니다.
ㅁ MPLAB X Project 설정
bootloader의 configuration을 두가지로 적용합니다.
한가지는 옵션비트를 넣는 조건, 또 한가지는 넣지 않는조건입니다.
Manage Configurations...를 눌러 설정합니다.
Duplicate를 누르면 Configuration이 두개가 됩니다. Rename 버튼을 눌러 이름을 바꿔줍니다.
NoConfigurations, WithConfiguration 두가지 입니다.
NoConfiguration > XC8 Global Options > XC8 Compiler > Preprocessing and message > Define macro에 OMIT_CONFIGURATIONS라고 입력합니다.
device_config.c 파일을 수정합니다. OMIT_CONFIGURATIONS가 선언되면 컴파일 되지 않도록 처리한다. Device의 설정값을 포함하거나 포함하지 않도록 처리한다. 이것은 End-App이 컴파일 될때 자동으로 선택되어 OMIT_CONFIGURATIONS가 선언되도록 한다.
ㅁ END - APPLICATION Porject 설정
End - App은 3가지 builde Configurations가 있습니다.
* Stand-Alone 모드 : bootloader없이 단독으로 실행되며 개발진행시 사용한다.
* Offset 모드 : bootloader 영역을 지난 End-App영역 ( 0x700번지 )부터 배치되도록 한다. Host-App을 이용하여 다운로드 하는 파일이 Offset모드로 컴파일된 HEX파일이다.
* Combined 모드 : bootloader와 End-App이 하나의 파일로 합쳐진 파일입니다. 제품을 생산하거나 할때 두가지 프로그램을 한번에 라이팅할 수 있도록 생성하는 파일입니다.
1. 프로젝트를 생성합니다.
2. MCC를 실행시킵니다. system module을 설정합니다.
PIN Module를 선택하여 LED가 연결된 핀을 출력으로 만듭니다. APP의 기능은 LED를 깜박이는 기능입니다.
위에서 언급한 3가지의 configurations를 만듭니다. Offset, Combine, StandAlone 3가지입니다. Duplicate, Rename기능을 이용합니다.
Additional options > CodeOffset을 0x700으로 적습니다.
memory model > 700-3FFF로 정해 줬습니다. Offset에서 메모리 끝 0x3FFFF로 적습니다.
두번째로 Combine옵션에서는 위의Offset Configurations의 설정과 같이 사용합니다. 또 한가지 추가 합니다.
Loading > 에서 bootloder 프로젝트를 추가해준다. Configurations은 위에서 정한 NoConfiguration을 사용한다.
마지막으로 Stand-Alone 모드는 Offset 값을 지워서 0번지부터 사용하도록 한다.
Bootloader Host Application ( PC용 )
bootloader host Application은 Hex파일을 보내는 프로그램입니다.
ㅁ 작업 방법
이 프로그램에서는 Device Family, 통신포트 등을 선택하고, HEX파일을 내려본낸다.
통신을 하여 버전을 가져오고, Flash를 지우고, Flash를 쓰고, Flash의 checksum을 확인하여 정상적으로 써졌는지 확인한다. 통신 에러가 발생시 3번 재시도 한다. Consol이나 윈도우 쉘에서 Log를 볼수 있다. log파일로도 표시된다.
ㅁ 사전 요구 사항
bootloader는 0번지부터 사용되며, End-App은 0x700번지부터 사용하도록 설정하여 컴파일 합니다.
필요시에는 EEP-ROM데이터도 같이 컴파일하여 쓰기 할 수 있다.
ㅁ 실행 방법
UnifiedHost프로그램이 있는 곳에서 아래와 같이 입력한다.
java -jar .\UnifiedHost-1.17.0.jar
ㅁ 세부 단계
1. 통신포트 설정한다. 보레이트는 자동감지되므로 적당한 것을 고른다. 19200권장.
2. 디바이스 패밀리를 선택한다. PIC16선택 합니다.
3. Bootloader Offset address : 0x700 , Program memory size : 0x4000 선택한다. EEPROM과 Config Offset address등은
4. HEX파일 선택
5. Program Device 버튼을 누른다.
ㅁ The Host Application 동작 순서
1. 순서 : 버전 가져오기, flash지우기, flash쓰기, checksum확인, 완료.
Bootloader Protocol (프로토콜)
ㅁ 명령어 (COMMAND SET)
ㅁ 기본 명령어 상세 설명.
- 명령어 구조 : 모든 명령은 최소 9바이트이다. 일반적인 명령구조는 다음과 같다.
[auto boud(1)] [Command] [Data Length(2)] [Unlock Sequence(3)] [ Address(4)] [Data(5)]
1. auto boud : 오토보레이트를 위한 값.
2. Data Length : [2]바이트 - [Low][High]
3. Unlock Sequence : 0x55, 0xAA - 쓰기/지우기 명령시 0x00, 0x00 쓰기명령령 아님
4. Address : [4]바이트 [Low][High][Upper][Extended]
5. Data : [0 - 64] byte - Data Length 만큼
- Return Code Values
1. [0x01] - Command Successful
2. [0xFF] - Comamnd Unsupported
3. [0xFE] - Address Error
ㅁ 옵션 명령어 설명. (자세한 사항은 아래 참고문헌 문서 참고)
- Get Version [0x00] :
장치와 통신을 설정하고 여러가지 정보를 전달
bootloader Version, Max Packet size, Device ID, Erase row size, Write latch size, Config words
- Erease Flash [0x03] :
지울 플래시 주소, 지울 플래시 사이즈
성공하면 0x01
- Write Flash Memory :
주소와 데이터 64바이트를 보내서 플래시에 쓴다.
성공하면 0x01
- Calculate CheckSum :
주소와 데이터 크기
데이터길이, 주소, 성공여부, checksum
- Reset Device :
소프트 리셋을 하도록 한다.
명령을 받았으면 0x01
- Read Flash : (option command)
사용자 프로그램을 읽을 수 있으므로 옵션
데이터 길이와 주소 ( 데이터 길이는 최대 64byte )
데이터 길이, 주소, 성공여부, 데이터
- Write EE Data : (option command)
EEP-ROM 쓰기 명령.
데이터길이, 주소, 데이터( 최대 5바이트 )
데이터길이, 주소, 성공여부
- Read EE Date : (option command)
EEP-ROM 읽기 명령.
데이터 길이, 주소
데이터 길이, 주소, 데이터
- Read Config Words : (option command)
READ CONFIG 명령.
데이터 길이, 주소
데이터 길이, 주소, 성공여부, 데이터 15바이트
- Write Config Words : (option command)
WRITE CONFIG 명령.
데이터 길이, 주소, 데이터 14바이트
데이터 길이, 주소, 성공여부
- Switching between Application and bootloader :
두가지 방법이 있다.
reset vector로 이동하는 방법
스텍 오버플로우가 발생할 수 있다. MCU에 따라 스텍레벨을 제어할 수 있다.
soft reset하는 방법
UnifiedHost의 Checksum 에러
ㅁ HEX파일을 UnifiedHost프로그램으로 다운로드 시 Checksum 에러 발생
체크썸에러가 발생한다. 틀린것은 없다.
다른 프로그램 찾아본다.
https://github.com/ChaoA51933/pic16f15244_bootloader/blob/main/scripts/pic16_uploader.py
GitHub - ChaoA51933/pic16f15244_bootloader
Contribute to ChaoA51933/pic16f15244_bootloader development by creating an account on GitHub.
github.com
이 파이썬 프로그램을 이용한다.
같이 있는 bat파일을 살펴보면
python ./pic16_uploader.py ../app_pic16f15244.X/dist/Offset/production/app_pic16f15244.X.production.hex 0x2000 COM10 9600
이렇게 되어 있다. 이것을 수정하여 PIC16F15376에 맞도록 수정한다.
python ./pic16_uploader.py ../NUSI_DI.X\dist\Offset\production/NUSI_DI.X.production.hex 0x4000 COM8 9600
경로만 잘 맞춰 주면 되겠다.
마무리
checksum에러 발생 처리 방법
파이썬 프로그램 사용하여 다운로드 하기
참고문헌

틀린 부분이나 질문은 댓글 달아주세요.
즐거운 하루 보내세요. 감사합니다.
'Microchip PIC' 카테고리의 다른 글
MPLAB X IDE D드라이브에 설치하고 XC8컴파일러 등록하기 (0) | 2023.06.12 |
---|---|
Device list of supported MCC ( MPLAB Code Configurator ) (2) | 2022.04.21 |
Intel HEX file format (0) | 2022.02.03 |
java 버전 낮추기, 삭제 후 재설치 방법 (오라클 회원가입 필요) (0) | 2022.02.03 |
C language printf() 정리 (0) | 2022.01.26 |
댓글