stm32的bootloader思考

stm32的bootloader思考

本文章主要是关于自己在尝试编写stm32的bootloader时候,对遇到的问题,查阅的资料,设计代码测试的一些感想。

1. stm32的启动流程

stm32在上电的时候,首先需要选择上电后,代码起始的执行位置,以stm32f103为例,根据boot0,boot1的选择来选择不同的上电起始位置。我个人一般是选择是boot0 = 0,boot1 = 0,如下图所介绍,上电后,从0x800 0000开始执行第一行代码。
图片1-1
在这里插入图片描述在选好首次执行代码的位置后,单片机上电后先从0x800 0000处获取msp的栈指针(此处的值个人猜测是编译器自己计算得到的),然后从0x800 0004处获取复位函数的地址,然后跳转到复位函数中,从复位函数先执行SystemInit函数,此函数中有一个重要的寄存器VTOR,此寄存器是向量表偏移寄存器。至此,然后执行main函数,至此,代码开始启动。

2.keil生成rom的映射表

从0x800 000开始首先是中断向量表,然后是代码段,最后是一些需要初始化给ram的一些数据量。详细可以看.map文件查看映射。

3.ram的映射表

在这里插入图片描述
上图是我在(工程名).map中截取出来的ram映射图,可以看到先是data段,然后是bss段,最后是stack,在0x800 0000中的MSP的地址就是0x20001b68+0x400(0x400是启动文件中设置的栈大小为0x400,而栈是自上而下生长的,所以栈顶指向高处)。

4.VTOR详解

在这里插入图片描述
此寄存器是用来重新映射中断向量表,在stm32中此值的设置必须是0x200的倍数,原因如下。
在这里插入图片描述

5.编写app

下面开始编写app程序,首先确定app程序存放的位置,假设是在0x800 400区域,在编译生成代代码前需要做的事情是将使用的rom区域设置为0x800 4000,如下图所示:
在这里插入图片描述
此外还需要编写VTOR寄存器,从第二点可知,rom的起始位置就是中断向量表,所以VTOR的需要设置为0x800 4000,表示从此处开始,是中断向量表的安放位置。其他的代码基本不要动

6.编写bootloader

app编写完成,下面是编写bootloader,代码烧录在0x800 0000,如下所示,是一个简单的示例:

int main(void)
{		
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	uart_init(115200);	
	delay_init();	   	 	
	while(1)
	{	 
		iap_load_app(0X8004000);//0x800 4000是app程序的起始位置。
	}   	   
}

void iap_load_app(u32 appxaddr)
{
	printf("%d\r\n",(*(vu32*)appxaddr));
	/*此处代码是判断在0x800 4000存放的数据是否是真确的msp指针数据
	从数据手册可以得知,ram的起始位置是0x20000000,大小是20k。*/
	if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)	
	{ 
		jump2app=(iapfun)*(vu32*)(appxaddr+4);		//获取到第二个字
		MSR_MSP(*(vu32*)appxaddr);				//设置msp的指针数据
		jump2app();									//跳转到app的reset函数,(函数指针的运用)
	}
}		

7.流程总结

执行环境:
boot0=0,boot1=0
执行流程:

  • 单片机上电硬件自动跳转到0x800 0000(bootloader代码起始位置)获取到msp的指针,设置栈地址,然后跳转到0x800 0004,获取到reset函数,从reset函数中进入main函数,开始执行代码。
  • 在main函数中执行到iap_load_app函数,首先判断设置app程序的起始地址,然后判断起始地址的栈地址是否合格,如果合格,就重新设置msp指针,然后执行app的reset函数,类似于一开始上电的步骤。
  • 如果有中断,比如串口中断到来,那么根据设置好的VTOR寄存器,定位到app的相应的中断向量位置,获取到相应的中断处理函数。
  • 如果没有在0x800 0000位置烧写代码,只在0x800 4000处烧写app程序,那么单片机就会由于找不到reset函数,从而跑飞。
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值