• STM32 IAP相关的FLASH数据读取和跳转


    一、STM32 FLASH 分区

    以STM32G484RE举例,固件烧录到FLASH的起始地址进行保存,理论上可烧录的最大文件为512Kb,实际项目中固件一般不会这么大,所以空余的一部分可用作数据的保存。

    项目Value
    FLASH的起始地址0x8000000
    FLASH的容量0x80000 512KB

    FLASH分区如下,
    将0x8000000作为运行BootLoader程序,最大为64KB,
    将0x80100000作为System数据存储区域,可保存系统配置文件、时间等数据最大为64KB,
    将0x80200000-0x80400000作为UserAPP_1程序的保存地址,大小为128KB,
    将0x80400000-0x80600000作为UserAPP_2程序的保存地址,大小为128KB,
    将0x80600000-0x80800000作为UpdataBin 程序的保存地址,大小为128KB,
    在这里插入图片描述
    STM32 KEIL中各分区对应的代码配置应与分区地址对应

    BootLoader:0x8000000

    在这里插入图片描述
    UserApp_1:0x8020000

    在这里插入图片描述

    二、BootLoader程序

    开机上电运行FLASH起始地址0x8000000 处保存的BootLoader程序,检查FLASH内是否有新的升级文件需要更新,流程具体任务如下所示
    在这里插入图片描述

    三、UserAPP程序

    UserAPP就是用户项目的主要代码,

    1.主函数内,第一行,执行下述语句,设置偏移量

    SCB->VTOR = FLASH_BASE | 0x20000;//设置偏移量  对应当前APP程序的分区地址
    
    • 1

    2.将升级原始文件切片、加密按照传输协议封装打包,通过串口、SPI、以太网、蓝牙、WIFI、IIC等方式进行传输

    3.在UserAPP中设计线程,接收UpdataBin更新文件,保存到上面分区的 UpdataBin 0x8060000中,大小不超过128KB

    4.接收完成后 ,变更Parpam保存的参数,使能更新状态标志,

    5.直接调用系统API函数 进行软件复位 重新启动 代码从BootLoader开始运行

    四、Flash数据的读取

     typedef volatile uint32_t  vu32;  //四字节对齐的数据类型
     (vu32*)appxaddr  //将 appxaddr 地址强制转换为指针 
    *(vu32*)appxaddr //取 appxaddr 指针指向地址保存的值
    
    uint32_t ReadWord(uint32_t faddr)
    {
    	return *(vu32*)faddr; //可根据强制转换的类型来更改一次读取的长度 vu32 4字节 vu64 8字节
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    五、BootLoader到UserAPP的跳转

    typedef  void (*iapfun)(void);				//定义一个函数类型的参数.   
    iapfun   jump2app; 
    //设置栈顶地址
    //addr:栈顶地址
    __asm void MSR_MSP(uint32_t addr) 
    {
    	MSR MSP, r0 			//set Main Stack value
    	BX r14
    }
    
    void iap_load_app(uint32_t appxaddr)
    {
    	if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)	//检查栈顶地址是否合法.
    	{ 
    		jump2app=(iapfun)*(vu32*)(appxaddr+4);		//用户代码区第二个字为程序开始地址(复位地址)		
    		MSR_MSP(*(vu32*)appxaddr);					//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
    		jump2app();									//跳转到APP.
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    Spring Cloud Feign--使用Nacos作为Ribbon的负载均衡策略
    怎么把Epub转换成PDF格式?分享两种简单好用的转换方法
    网页转长图插件html2canvas【前端】
    hadoop 大数据环境配置 ssh免密登录 centos配置免密登录 hadoop(四)
    阿里云服务器x86计算架构ECS规格大全
    独立站如何精准引流及提高订单转化率
    哔哩哔哩前端笔试(卷1)
    3D Web轻量化工具HOOPS Web Platform助力Rapid DCS快速上市碳估算产品!
    用来生成二维矩阵的dcgan
    基于Python实现的电梯进程及调度管理
  • 原文地址:https://blog.csdn.net/qq_41975640/article/details/128035614