关于MCU的BootLoader的一些理解

文章详细解释了STM32单片机在IAP(在应用编程)过程中,对Addr_App指针与0x2FFE0000进行位与操作的目的是验证指针是否指向RAM的有效区域。同时,阐述了MSP初始值与程序在RAM中的地址关系,以及中断向量表的重新映射概念。
摘要由CSDN通过智能技术生成

一、关于STM32单片机IAP升级中if(((*(__IO uint32_t*)Addr_App) & 0x2FFE0000) == 0x20000000)语句的理解

参考自:https://blog.csdn.net/weixin_45394120/article/details/122732203?spm=1001.2014.3001.5502

疑问:

1、为什么要用Addr_App里的数据跟0x2FFE0000相与呢?

因为Addr_App指向的数据是RAM地址,而0x20000000是RAM的首地址,假如你的STM32单片机RAM有128K,那RAM的末地址就是0x2001FFFF。所以与0x2FFE0000相与就是确保Addr_App指向的数据在0x20000000~0x2001FFFF之间;假如你的STM32单片机RAM有64K,那RAM的末地址就是0x2000FFFF。则只要与0x2FFF0000相与确保Addr_App指向的数据在0x20000000~0x2000FFFF之间;

2、为什么Addr_App里存的是RAM地址呢?

MSP的初始值是程序占用RAM的大小,按地址理解就是MSP的初始值是程序在RAM中的末地址+1。

小结:

程序存储在flash的首地址指向的是MSP的初始值,而这个初始值是程序占用RAM的大小,也是程序在RAM中的末地址+1。

二、关于中断向量表的重新映射

参考来自:(90条消息) stm32带BootLoader情况下,需要重新映射中断向量表_Surpas-HC的博客-CSDN博客_stm32重映射中断向量表

从ARM官网上的信息得知(Documentation – Arm Developer ),在Coretext-M3与Coretext-M4核中,在System Control Block中存在一个向量表偏移量寄存器 VTOR(0xE000ED08),系统产生中断后,内核通过这个寄存器的值来找到中断向量表的地址,进而执行中断例程代码,当然,此寄存器的值是可以修改的,它的默认值为0。实际上在大部分的M3和M4的工程中,一般都是在SystemInit函数中对此寄存器的值进行设置,当此之前,它的值为默认值0,由于映射关系,实际上就是指向映射地址,比如0x0800 0000. 如下图所示: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值