本文主要是用以实现 STM32 BootLoader 功能。支持串口命令行功能,可用于引导内核、带boot 参数区,支持串口升级内核等功能。
代码下载路径: https://github.com/lza1205/n_boot
先说原理:
片上flash空间分配:
STM32 片上flash,一般地址是在 0x8000000 。上电后系统会从 0x8000000 地址开始读取程序并执行。
所以我们的 BootLoader 放在 0x8000000 地址上,0x8003000 存放我们的 boot 参数。然后我们 的 内核(AP)程序可以放到 0x8003800 地址。所以整个片上flash 的构造如下:
boot参数区的内容:
/* boot 系统参数 */
struct boot_var{
INT32U start_timeout; //内核启动延时
INT32U mach; //机器ID
INT32U boot_addr_base; //boot地址
INT32U boot_size; //boot代码段大小
INT32U boot_var_addr_base; //boot 参数地址
INT32U boot_var_size; //boot参数段大小
INT32U kernel_addr_base; //AP 内核地址
};
STM32 boot 跳转到 0x8003800 启动程序代码:
/************************************************************************
时间:2014.3.23
作者: lza1205
基于stm32 的boot 该文件是cpu相关的代码,不同平台需要修改
************************************************************************/
uint8_t __cpu_goto_app(uint32_t Addr)
{
pFunction Jump_To_Application;
__IO uint32_t JumpAddress;
if (((*(__IO uint32_t*)Addr) & 0x2FFE0000 ) == 0x20000000)
{
/* 地址要偏移4 */
JumpAddress = *(__IO uint32_t*) (Addr + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* 使用app的栈 */
__set_MSP(*(__IO uint32_t*) Addr);
/* 跳转到用户函数入口地址 */
Jump_To_Application();
}
return 1;
}
代码目录文件说明:
boot.c —— 是整个 stm32 BootLoader 的 核心代码。其中最核心的函数是 n_boot_memu ,它是整个 boot 的入口,我们可以通过理解整个函数来了解整个boot过程
cpu_c.c —— 是具体芯片相关的,CPU 相关代码,需要移植,主要实现 uint8_t __cpu_goto_app(uint32_t Addr) 函数,用于跳转到内核
command.c —— 实现串口命令行功能,类似于 uboot 一样,可以输入一些串口命令,实现我们的操作。目前支持的串口命令如下:
flash.c ——实现 片上flash 相关操作,读写擦除等
xmodem.c 、xmodem_crc.c 、xmodem_hw.c ——实现串口升级 内核的功能。
可以在串口按住回车键,然后上电,之后输入 s ,启动传输bin文件升级功能。secureCRT选择send Xmodem。之后选择内核文件,点击发送即可升级。