이글의 전부 또는 일부, 사진, 소스프로그램 등은 저작자의 동의 없이는 상업적인 사용을 금지합니다. 또한, 비상업적인 목적이라하더라도 출처를 밝히지 않고 게시하는 것은 금지합니다.



앞 글 STM32F103 DFU Bootloader 만들기에서 만든 bootloader로 펌웨어를 업데이트해 보겠습니다.

앞 글 STM32F103 DFU Bootloader 만들기에서 만든 bootloader를 Blue Pill 보드에 기록하고 ST-LINK Utility로 읽어보니까 bootloader는 0x0800 2F3C 번지까지 사용하고 있습니다. 따라서 펌웨어는 0x0800 3000부터 사용하면 됩니다. 다만 앞의 글에서 밝혔듯이 본 글에서는 STM32FC8T6의 정상 플래시 메모리 영역 밖에서 실행해보기 위해서, 펌웨어의 시작 번지를 0x0801 0000로 설정하고 있습니다. 일반적으로는 시작 번지를 0x0800 3000번지로 하기 바랍니다.


 



본 글의 설명은 True Studio에서 프로그래밍하는 경우를 가정하고 있습니다. 다른 툴을 쓰는 경우에도 방법은 조금 다르겠지만 내용은 동일 할 것으로 생각합니다.

전에 만들었던 프로젝트 RA8835 GLCD 제어하기(제6편)의 프로젝트롤 USB DFU bootloader를 통해서 업데이트 해 보겠습니다.

전체적인 흐름은 다음과 같습니다.

1. 펌웨어용 프로그램 만들기

2. DFU 파일로 변환(DFU file manager 이용)

3. 보드를 STM Device in DFU Mode로 부팅(Firmup_Pin 0로 설정)

4. DFUSe 프로그램으로 펌웨어 업데이트

 

 

 

 

1. 펌웨어 프로그램 만들기

 

① 프로젝트의 폴더에서 확장자가 .ld인 파일을 메모장 등으로 엽니다.

 

 

② 다음의 부분을 찾습니다.

 

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
FLASH (rx)     : ORIGIN = 0x8000000, LENGTH = 128K
}

위의 내용 중에서 FLASH (rx) 행을 다음과 같이 수정합니다. 0x8010000은 앞의 글 STM32F103 DFU Bootloader 만들기의 ⑤에서 USBD_DFU_APP_DEFAULT_ADD의 값으로 입력한 값입니다.

FLASH (rx)     : ORIGIN = 0x8010000, LENGTH = 64K


펌웨어가 0x8010000번지부터 시작하므로 남은 플래시 메모리 용량은 64KB입니다. 만약 펌웨어를 0x8003000 번지부터 시작하려면 0x8010000 대신에 0x8003000을 입력하고 LENGTH = 116K로 입력해야 합니다. 물론 이렇게하려면 앞글의 bootloader를 만들 때에도 USBD_DFU_APP_DEFAULT_ADD 값도 0x8003000으로 입력했어야 합니다.



② 인터럽트 벡터 테이블을 펌웨어 프로그램 시작 지점으로 옮겨야 합니다. [Src] 폴더의 system_stm32f1xx.c 파일을 열어 매크로 VECT_TAB_OFFSET을 찾아 다음과 같이 바꾸면 인터럽트 벡터 테이블이 펌웨어 프로그램 시작 지점인 0x8010000 번지로 옮겨집니다. 만약 펌웨어를 0x8003000 번지부터 시작한다면 VECT_TAB_OFFSET 값을 0x00003000U로 해야 합니다.

#define VECT_TAB_OFFSET  0x00010000U

 

③ 프로젝트를 컴파일하여 HEX 파일을 만듭니다. True Studio의 Build Analysis 창에서 다음과 같이 Start address가 설정한 바와 같은지 확인합니다.

 




<2021.01.13.> STM32CubeMx가 버전업되면서 달라진 내용이 있어서 추가합니다.

언제부터인지 모르지만 제 글을 보고 따라해보셨던 분들이 혼란을 겪으셨을 듯합니다. 그동안 별로 공부도 하지 못했고, 기껏해야 예전에 만들었던 프로젝트 복사해서 사용해서 인지하지 못하고 있었습니다.


오랫만에 프로젝트를 만들어 부트로더와 함께 사용해보려니 동작하지 안았습니다. 부트로더 없이 0x8000000 번지부터 시작시키면 잘 되는데, 부트로더를 올리고 0x8003000 번지부터 동작시키면 아예 동작하지 않는 상태가 됩니다.


원인은 STM32CubeMx를 버전이 바뀌면서 만들어 주는 코드가 달라졌기 때문입니다.

② 과정에서 인터럽트 벡터 테이블을 펌웨어 프로그램 시작 지점으로 옮기는 방법이 약간 달라졌습니다.


다음은 예전의 STM32CubeMx가 만들어 주던 system_stm32f1xx.c에서 벡터 테이블을 지정하는 부분을 캡처한 것입니다.


 

보시는 바와 같이 한 군데만 수정하면 되었습니다.



다음은 최근의 STM32CubeMx가 만들어 주는 system_stm32f1xx.c에서 백터 테이블을 지정하는 부분을 캡처한 것입니다.



97행의 /*define USER_VECT_TAB_ADDRESS */의 주석을 해제하고, 111행에 인터럽트 벡터 테이블이 있는 주소값을 입력해야 합니다. SRAM으로 인터럽트 벡터 테이블을 옮길 때에는 102행의 주석도 해제하고, 106행에 인터럽트벡터 테이블이있는 SRAM 주소값을 입력해야 합니다. 예제로 사용하는 프로그램은 플래시 메모리에 있으므로 102행과 106행은수정할 필요가 없습니다.

 ***이후에도 추가로 약간의 코드 수정을 해야 펌웨어 프로그램이 정상적으로 동작하므로 다음의 글을 꼭 보시기 바랍니다. STM32F103 DFU BOOTLOADER로 펌웨어 업데이트하기 내용 업데이트






2. DFUSe 프로그램 설치

 

 

① DFUSe 프로그램 다운로드 및 설치

stmicroelectronics 홈페이지의 여기에서 DFUSe 프로그램을 다운로드받아 설치합니다. 다운로드 받을 때에 홈페이지 계정이 있으면 로그인하면 되고, 없으면 간단히 인적 사항을 넣어야 합니다. 프로그램 설치에 특이 사항은 없습니다. DFUSe 프로그램을 설치하는 과정의 화면들를 나열합니다.

 

 

 

 

 



② DFU 파일 만들기

DFUSe 프로그램을 설치하면 STMicroelectronics 프로그램 그룹 안에 Dfu file manager가 같이 설치됩니다. 이 프로그램을 이용해서 HEX 파일을 DFU 파일로 변환합니다.

 

 

DFU 파일을 만들 것이므로 [OK] 버튼을 누릅니다.

 

 

 

[Product ID]에 앞의 글STM32F103 DFU Bootloader 만들기 ⑦에서 설정했던 DF11을 입력하고 [S19 or Hex...] 버튼을 클릭합니다.

 

 

 

위의 1. 펌웨어 프로그램 만들기에서 생성한 HEX 파일을 선택하고 [열기] 버튼을 클릭합니다.

 

 

 

[Generate] 버튼을 틀릭합니다.

 

 

 

적절한 파일명을 입력하고 [저장] 버튼을 클릭합니다.

 

 

 

[확인] 버튼을 클릭합니다.

 

이렇게하여 HEX 파일로부터 DFU 파일을 만들었습니다.

 

 

 

DFU 파일을 성공적으로 만들었으면, Blue Pill 보드를 DFU 모드로 부팅시킵니다. 앞 글에서 부팅DFU 모드로 시키는 방법은 두 가지가 되도록 bootloader를 만들었습니다. 첫번째는 Firmup_Pin인 PC14를 low 상태로 하고 전원을 연결하면 됩니다. 두번째는 프로그램이 내부를 검색해서 펌웨어가 없으면 자동으로 DFU 모드로 부팅합니다.

 

 

 

3. DFUSe 프로그램으로 펌웨어 업데이트하기

 

 

다음과 같은 방법으로 DFUSe 프로그램을 이용해서 펌웨어를 업데이트합니다.

 

 

 



[STM Device in DFU Mode]가 나오지 않는다면, DFU 드라이버가 설치되지 않았을 가능성이 많습니다. 아래의 4.에 따라 드라이버를 설치하면 됩니다.


DFUSe 프로그램을 실행시킨 후에 [Available DFU Devices]에 [STM Device in DFU Mode]가 있는지, 오른쪽의 [DFU Mode] 난에 [Vendor ID]는 0483, [Product ID]는 DF11이 맞는지 확인한 다음에 아래쪽의 [Choose...] 버튼을 클릭합니다.

 

 

 

앞의 2. 단계에서 만든 dfu 파일을 선택한 후에 [열기] 버튼을 클릭합니다.

 

 

 

[Vendor ID], [Product ID]가 맞는지 확인하고 [Upgrade] 버튼을 클릭합니다.

 

 

 

[예] 버튼을 클릭하여 펌웨어를 업데이트합니다.

 

 

 

업데이트에 성공했다는 메시지가 나옵니다.

 

 



4. DFU 드라이버 설치하기



Windows 10 장치관리자의 [범용 직렬 버스 컨트롤러]에 [STM Device in DFU Mode]가 나타나지 않는다면, 다음 그림과 같이 DfuSe 프로그램이 설치된 폴더 내에 있는 [Driver] 폴더를 찾아서 자신의 운영체제에 맞는 드라이버를 설치해야 합니다.

 




DfuSe 프로그램 설치 폴더를 특별히지정하지 않았다면 [C:\Program Files(x86)\STMicroeletronics\Software\DfuSe v3.0.6\Bin\Driver\Win10] 폴더 안에 있습니다. windows 10 64bit 버전을 사용한다면 dpinst_amd64.exe를 32bit 버전을 사용한다면 dpinst_x86.exe를 각각 관리자 권한으로 실행하면 드라이버가 설치됩니다.


드라이버가 설치되면 재부팅 필요없이 [범용 직렬 버스컨트롤러] 안에 [STM Device i DFU Mode] 항목이나타날 것입니다.





업데이트가 끝난 다음에 ST-Link Utility로 Blue Pill 보드에 있는 STM32F103C8T6의 내용을 읽어 왔습니다.

 

 

Device flash size : 64KBytes로 되어 있으나 64KB 바깥 영역인 0x0801 0000 이후의 메모리 공간에 잘 기록되어 있는 것을 확인할 수 있습니다.

 

전원을 연결하면 펌웨어 프로그램이 정상으로 동작하는 것도 확인되었습니다.

 

펌웨어 업데이트 핀인 PC14를 Gnd에 연결하고 전원을 투입하면 PC에 [STM Device in DFU Mode]로 잡히면서 펌웨어 업데이트 대기 상태로 들어갑니다.

 

모든 기능이 정상적으로 동작함을 확인하고 본 글을 마칩니다.

 


블로그 이미지

엠쿠스

Microprocessor(STM32, AVR)로 무엇인가를 만들어 보고자 학습 중입니다.

,