IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【STM32备忘录】一、STM32的IAP升级示例和要点 -> 正文阅读

[嵌入式]【STM32备忘录】一、STM32的IAP升级示例和要点

知识点

  • flash写入
  • 跳转到升级程序
  • 中断向量表偏移
  • keil设置

flash写入

  1. 内存大小端。我觉得叫高低端更好记,stm32内存中,数据低位存放在地址低端,所以是小端。按字节写入的时候按照bin文件字节顺序写入,如果按字或半字写入,则按小端排好后写入flash。
  2. flash擦除。flash写入前需要先擦除,这里按页擦除,需要知道一页多少字节。我用的是stm32f103vet6,一页2K字节
    在这里插入图片描述
    HAL库页擦除示例:
		uint32_t PageError;
		FLASH_EraseInitTypeDef my_erase_app;

		my_erase_app.TypeErase = FLASH_TYPEERASE_PAGES; //擦除方式
		my_erase_app.PageAddress = erase_addr;  		//地址
		my_erase_app.NbPages = 1;						//页数
		HAL_FLASH_Unlock();
		HAL_FLASHEx_Erase(&my_erase_app, &PageError);
		HAL_FLASH_Lock();
  1. flash写入。擦除后写入flash,HAL库写flash示例:
		HAL_FLASH_Unlock();
		HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, erase_addr, dat); //写入方式,地址,数据
		HAL_FLASH_Lock();
  1. 其他:flash在解锁后擦除,擦除后可以在擦除范围内连续写入,操作后上锁

跳转到目标程序

示例:

(*((void(*)()) (*((volatile uint32_t*)(APP_ADDR+4)))))();

说明:

  1. APP_ADDR+4,升级程序地址加4即复位向量位置,先把APP_ADDR+4强转为地址:
(volatile uint32_t*)(APP_ADDR+4);
  1. 引用即读出flash中的数据,即复位向量地址:
*((volatile uint32_t*)(APP_ADDR+4));
  1. 把复位向量地址强转为函数指针:
(void(*)())(*((volatile uint32_t*)(APP_ADDR+4)));
  1. 引用该函数指针:
(*((void(*)())(*((volatile uint32_t*)(APP_ADDR+4)))))();
  1. 好了,如果flash中APP_ADDR+4位置数据有效就可以跳过去了
  2. 其他:堆栈栈顶检查,跳过去用户程序前可以先做一些检查,如APP_ADDR处,即升级程序写入的flash地址,开始四个字节存放的是栈顶地址,栈顶地址=0x2000 0000 + (rwdata+zidata),官方IAP程序这样写:
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      JumpToApplication = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      JumpToApplication();
    }

注意0x2FFE0000 这个值,加64K(0x10000)的SRAM的话,刚好等于0x2FFF0000。这个值可以根据自己芯片的SRAM大小修改到合适值,SRAM比64K小的话不修改也可以

中断向量表偏移

在更新程序中偏移中断向量表

SCB->VTOR = APP_ADDR;

KEIL设置

根据自己的应用分别设置BootLoader程序和用户程序的起始位置和大小:
在这里插入图片描述
对用户程序,生成bin文件命令(如果找不到fromelf.exe指定绝对路径试试,我的在这个位置:C:\Keil_v5\ARM\ARMCC\bin):

fromelf --bin -o "$L@L.bin" "#L"

在这里插入图片描述

总结

两个程序,BootLoader程序通过接口把要升级的用户程序bin文件写入flash,然后跳过去执行,最后在用户程序设置中断向量表

实验程序链接(需积分)

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:22:24  更:2022-04-06 23:24:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:26:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码