STM32 实现 BootLoader功能(奉上源码)

本文主要是用以实现 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。之后选择内核文件,点击发送即可升级。

发布了139 篇原创文章 · 获赞 54 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/aa120515692/article/details/104016708
今日推荐