1. st회사 홈페이지에서 AN4657 다운로드 받아서 대충 아무대나 압축 푼다.
2. 압축 푼 폴더 AN4657-STM32Cube_IAP_using_UART 에서Inc폴더 찾아서 common.h, flash_if.h, menu.h, ymodem.h 복사
3. STM32CubeIDE에서 원하는 프로젝트 Inc폴더에 붙여넣기
4. 다시 압축 푼 폴더 AN4657-STM32Cube_IAP_using_UART 에서 Src폴더 찾아서 common.c, flash_if.c, menu.c, ymodem.c 복사
5. STM32CubeIDE에서 원하는 프로젝트 Src폴더에 붙여넣기
6. main.c파일 아래처럼 내용 수정
#include "common.h"
#include "flash_if.h"
#include "menu.h"
#include "ymodem.h"
extern pFunction JumpToApplication;
extern uint32_t JumpAddress;
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) //이건 PA0에 버튼스위치 연결해서 버튼 누르면 부트로더로 실행되고, 안누르면 원래 펌웨어가 실행되게 했음.
{
/* If Key is pressed, execute the IAP driver in order to re-program the Flash */
FLASH_If_Init();
/* Display main menu */
Main_Menu ();
}
else
{/* Keep the user application running */
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
/* Jump to application */
JumpToApplication();
}
}
7. common.h파일에서 #include "stm3210c_eval.h" 주석처리
8. common.c, menu.c, ymodem.c의 파일에 extern UART_HandleTypeDef huart1; 외부변수 처리
9. common.c, menu.c, ymodem.c의 모든 파일에 UartHandle 변수명을 huart1 변수명으로 교체(Replace All)
10. flash_if.h파일에서 APPLICATION_ADDRESS가 0x08004000 확인
11. 컴파일하고 보드에 다운로드한 다음 PA0에 연결된 스위치 누른 상태에서 보드 전원키면 아래처럼 IAP부트로더 실행됨
12. 키보드 1누르면 다운로드 대기 상태
13. 메뉴 -> 전송 -> YMODEM -> 보내기에서 실행시킬 펌웨어.bin파일 보내고 완료되면 키보드 3누르면 실행됨