This training material is based on the below reference project:
Important !!!
Address is configurable
APROM App codestart / sizeAPROM Boot codebase address example:0x3000These addresses are project-dependent and NOT fixed by hardware , adjust them according to:
- actual project application code size requirement
- actual project boot code feature size
The values used in this project
0x3000,0x1FFFCare one validated reference only.
| Region | Address | Size | Purpose |
|---|---|---|---|
| APROM Application | 0x0000_3000 ~ 0x0001_FFFF |
0x1D000 |
app code |
| APROM checksum | 0x0001_FFFC |
4 bytes | app code checksum address (CRC32) |
| Boot code in APROM | 0x0000_0000 ~ 0x0000_3000 |
12 KB | boot code |

| UART | Function | Used in |
|---|---|---|
| UART0 PB12/PB13 | ISP protocol | Boot only , to upgrade app code |
| UART1 PA8/PA9 | printf / progress log | Boot + App |
main.c
└─ main
├─ SYS_Init
├─ ISP_Init
├─ ISP_check_app
└─ while1
└─ ISP_process
isp_config.c ← ★ Custom ISP state & policy
isp_user.c ← UART RX / CMD handler

isp_user.c → packet handlingisp_config.c → CRC check / boot decision / ISP behavior


Boot code project uses a single scatter file: uart_iap.sct.
The linker layout for:

App code project uses a single scatter file: APROM_application.sct.
The linker layout for:

| Target | Output |
|---|---|
| APROM_BOOT | APROM_Bootloader.bin @ 0x0000 |
LOAD_ROM_1 0x00000000 0x3000
{
APROM_Bootloader.bin 0x00000000 0x3000
{
startup_m2a23.o (RESET, +FIRST)
.ANY (+RO)
}
SRAM 0x20000000 0x6000
{
* (+RW, +ZI)
}
}
| Target | Output |
|---|---|
| APROM_APP | APROM_application.bin @ 0x3000 |
LOAD_ROM_1 0x3000 0x1D000
{
APROM_application.bin 0x3000 0x1D000
{
startup_m2a23.o (RESET, +FIRST)
.ANY (+RO)
}
SRAM 0x20000000 0x6000
{
* (+RW, +ZI)
}
}
0x0000_3000 ~ 0x0001_FFFB0x0001_FFFCAPROM_Bootloader.bin → APROM @ 0x0000

APROM_application.binAPROMReset and RunStart


#define LDROM_DEBUG(format, args...) printf("\033[1;36m" "[LDROM]" format "\033[0m", ##args)
Progress bar width=10:
[LDROM] [#####-----] 50%
isp_config.c
APPROM: 0x0000_0000 ~ 0x0000_3000 0x3000 bytesAPROM_Bootloader.bin boot code stage, linked at APROM@0x0000refer to uart_iap.sct
APPROM: 0x0000_3000 ~ 0x0002_0000 0x1D000 bytesAPROM_application.bin app code linked at 0x0000_3000, size ≤ 0x1D000, includes CRC wordrefer to APROM_application.sct



generateChecksum.bat
@echo off
setlocal
call checksum_config.cmd
set SREC=srec_cat
set APP_BIN=obj\APROM_application.bin
set TMP_IMG=obj\_aprom_crc_tmp.bin
echo ========================================================
echo Generate CRC32 (ABSOLUTE address semantics)
echo --------------------------------------------------------
echo APP_START = %APP_START%
echo APP_SIZE = %APP_SIZE%
echo CRC_ADDR = %CRC_ADDR%
echo APP_BIN = %APP_BIN%
echo ========================================================
:: =========================================================
:: Derived values (DO NOT EDIT)
:: =========================================================
:: Relative offset inside app-only binary
set CRC_SIZE=4
set /a CRC_OFFSET=CRC_ADDR - APP_START
set /a CRC_END=CRC_ADDR + CRC_SIZE
set /a CRC_OFFSET_END=CRC_OFFSET + CRC_SIZE
:: --------------------------------------------------------
:: Step 1: Build temporary APROM image and calculate CRC
:: (Used only for CRC calculation / dump)
:: --------------------------------------------------------
%SREC% ^
%APP_BIN% -binary ^
-offset %APP_START% ^
-fill 0xFF %APROM_BASE% %APROM_SIZE% ^
-crop %APROM_BASE% %CRC_ADDR% ^
-crc32-l-e %CRC_ADDR% ^
-o %TMP_IMG% -binary
if errorlevel 1 goto err
:: --------------------------------------------------------
:: Step 2: Write CRC back to app-only binary (relative offset)
:: --------------------------------------------------------
%SREC% ^
%APP_BIN% -binary ^
-fill 0xFF 0x0000 %APP_SIZE% ^
-crop 0x0000 %CRC_OFFSET% ^
-crc32-l-e %CRC_OFFSET% ^
-o %APP_BIN% -binary
:: --------------------------------------------------------
:: Step 3: Dump checksum (last 4 bytes) to terminal
:: --------------------------------------------------------
echo.
echo ---- CRC32 @ %CRC_ADDR% (HEX dump) ----
%SREC% ^
%APP_BIN% -binary ^
-crop %CRC_OFFSET% %CRC_OFFSET_END% ^
-o - -HEX_Dump
if errorlevel 1 goto err
echo.
echo CRC written back to app-only binary successfully.
exit /b 0
:err
echo CRC generation FAILED
exit /b 1
checksum_config.cmd (the only file need to modify)
@echo off
:: =========================================================
:: Flash absolute layout (DESIGN INTENT)
:: =========================================================
set APROM_BASE=0x0000
set APROM_SIZE=0x20000
set APP_START=0x3000
set APP_SIZE=0x1D000
:: CRC is always at the last 4 bytes of APROM
set CRC_ADDR=0x1FFFC