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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> Ambiq Apollo3使用内建SBL进行固件升级 -> 正文阅读

[嵌入式]Ambiq Apollo3使用内建SBL进行固件升级

Apollo3系列MCU出厂时内置了一段代码,官方名叫:SBL(Secure BootLoader)
这段代码在片上FLASH的0x0000地址,占用空间48KB。
这就是为什么我们在KEIL里面看到的IROM起始地址是0xC000。
这段代码实现了开机通过UART、I2C、SPI下载用户程序的功能,同时还实现了IAP固件升级功能。

今天研究的就是它的IAP固件升级功能。
在阅读了大量文档和SDK代码之后,工作过程大概是这样的:

1.在MCU的内部FLASH规划出至少3个区域:
????????固件区: 正常跑的固件程序,起始地址0xC000
????????升级区: 新固件下载到这里。
????????描述区: 记录新固件在FLASH的地址,只需要1个扇区:8KB
2.准备好编译出来的固件文件firmware
3.使用create_cust_image_blob.py脚本对firmware进行处理,生成新文件image
4.把image下载到规划的升级区
5.把升级区的地址写到描述区
6.把描述区的地址写到OTACTRL_OTAPOINTER寄存器,并把OTA标志位写1
7.软件重启MCU后,SBL会根据OTACTRL_OTAPOINTER的信息进行固件升级。

知道大概流程之后就来看一看实现的细节:

1.MCUCTRL_OTAPOINTER寄存器
????????贴个文档里的图:
????????OTAPOINTER[31:2] = 描述区的地址,此地址必须为FLASH地址8KB对齐,忽略低2位
????????OTAPOINTER[1]? ? ? = 1,表示SBL升级,下次重启后会升级SBL自身
????????OTAPOINTER[0]? ? ? = 1,表示OTA有效,下次重启后会触发升级


?2.升级描述区
? ? ? ? 升级描述区占用1个FLASH扇区,1个扇区=8KB
????????贴个文档里的图:

? ? ? ? 描述区是一个32bit为单位的数组,每个单位是一个描述符,如果有多个描述符,就是可以一次性升级多个文件,最后一个描述符为0xFFFFFFFF表示结束。一般情况下固件升级我们只需要一个文件,所以只需要填写一个描述符就够了。
????????描述符BIT[31:2]表示升级文件所在的地址.
? ? ? ? 描述符BIT[1]表示升级结果,1=失败,0=成功
? ? ? ? 描述符BIT[0]表示升级状态,1=挂起,0=完成
? ? ? ? 升级之前,BIT1和BIT0都要置1,这样SBL才会处理这条升级描述。


3.制作升级文件
? ? ? ? 编译器生成的binary文件是不能直接用于升级的,SBL只能识别包含特定文件头的文件。
这个文件的格式如文档中描述,下图是NonSecure Main格式:

? ? ? ? 从图中可以看出来,头件头部多了很多字段,还支持数据加密,一般情况下使用这种格式已经完全满足项目需要了。
????????Secure Main的文件头更复杂一些,已经没有兴趣再看下去了。
? ? ? ? 官方SDK中已经提供了一个python脚本来制作这种文件。

文件路径:/sdk/tools/apollo3_scripts/create_cust_image_blob.py
调用参数:--bin input.bin -o output.bin --version 0xEFFF?--magic-num 0xcb --load-address 0xc000
--bin指定编译器生成的原始bin文件
-o指定输出的新文件名
--load-address指定升级文件的目标地址(编译器配置的IROM起始地址)
--magic-num指定文件类型,0xcb表示主程序固件
--version这个参数为可选参数,可以指定固件版本,范围0-0x7FFF,保存在W29的低15bit,

4.代码实现
? ? ? ? 官方SDK中提供了一些有用的代码来实现我们的固件升级。
下面两个是实现内部FLASH的擦除与编程的接口,下载新固件的时候会用到。

//擦除,以8KB为单位进行擦除
int am_hal_flash_page_erase(uint32_t ui32ProgramKey, uint32_t ui32FlashInst,?uint32_t ui32PageNum);

//写入,以4字节为单位写数据
int am_hal_flash_program_main(uint32_t ui32ProgramKey, uint32_t *pSrc, uint32_t *pDst, uint32_t ?NumberOfWords);

下面两个是实现添加OTA描述符的接口,下载完新固件之后,需要用到

//初始化OTA描述区
uint32_t am_hal_ota_init(uint32_t ui32ProgamKey, uint32_t *pOtaDesc);

//添加OTA描述符
uint32_t am_hal_ota_add(uint32_t ui32ProgamKey, uint8_t imageMagic, uint32_t *pImage);


最后是软重启MCU的几种方法

//SDK提供的软件复位函数
am_hal_reset_control(AM_HAL_RESET_CONTROL_SWPOI, 0);

//CMSIS接口的软件复位函数
NVIC_SystemReset();

关于固件升级,今天就研究到这里了。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:54:31  更:2021-12-23 15:55:38 
 
开发: 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/27 18:31:05-

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