[应用相关] IAP

[复制链接]
2417|20
 楼主| goodluck09876 发表于 2018-10-6 16:37 | 显示全部楼层 |阅读模式
IAP是In Application Programming的 首 字 母 缩 写,
IAP是用户的程序在运行过程中对 User Flash的部分区
域进行烧写,目的是为了在产 品 发 布 后 可 以 方 便 地 通 过
预留的通信 口 对 产 品 中 的 固 件 程 序 进 行 更 新 升 级。 通
常在用户需要实现IAP功能时,需 要 在 设 计 固 件 程 序

 楼主| goodluck09876 发表于 2018-10-6 16:37 | 显示全部楼层
编写两个项目代码,第一个项 目 程 序 不 执 行 正 常 的 功 能
操作,而只是通过某种通信 管 道(如 USB、USART)接 收
程序或数据,执 行 对 第 二 部 分 代 码 的 更 新,被 称 作 引 导
程序,该部 分 代 码 必 须 通 过 JTAG 或ISP 烧 入;第 二 个
项 目 代 码 才 是 真 正 的 功 能 代 码,即 APP程 序,该 部 分 代
码 可 以 使 用JTAG 或ISP烧 入,也 可 以 利 用 第 一 部 分 代
码IAP功能写入。
 楼主| goodluck09876 发表于 2018-10-6 16:37 | 显示全部楼层
Ymodem协议
Ymodem 协议作为上位机和 STM32通信的桥梁,它
具有完善的握手机制和出错管理机制,可以大幅提高IAP
的成功率。
Ymodem 协议是一种发送并等待的协议,即 发 送 方
发送一个数据包以后,都要 等 待 接 收 方 的 确 认。将 文 件
分块的大小定位1 024字节,传输请求由上位机发起
 楼主| goodluck09876 发表于 2018-10-6 16:38 | 显示全部楼层
每·26·个传输帧 由 帧 头、数 据 段、帧 尾 组 成,帧 格 式 如 图 1 所
示。上位机软件将数 据 以 每 次 1 024 字 节 加 上 包 头、包
号、包号补码、末 尾 加 上 CRC 校 验 字 段,打 包 成 帧 格 式传送
 楼主| goodluck09876 发表于 2018-10-6 16:38 | 显示全部楼层
 楼主| goodluck09876 发表于 2018-10-6 16:38 | 显示全部楼层
对于STM32来说,因为它的中断向量表位于程序存
储器的最低地址区,为了使第1部分代码能够正确地响应
中断,通常会安排第1部分代码处于 Flash的开始区域,而
第2部分代码紧随 其 后,STM32 中 断 向 量 分 布 如 图 3 所示
 楼主| goodluck09876 发表于 2018-10-6 16:39 | 显示全部楼层
 楼主| goodluck09876 发表于 2018-10-6 16:39 | 显示全部楼层
 楼主| goodluck09876 发表于 2018-10-6 16:39 | 显示全部楼层
STM32的IAP技术原理:
1)STM32复位后,从地址为0x8000004处取出复位中
断向量的地址,并跳转执行复位中断服务程序,随后跳转
至IAP程序的 main函数,如图3中标号①、②所示。
2)执行完IAP后(APP程序如图3中以灰色底纹方格
表示,地址始于0x8000004+N+M)跳转至新写入程序的
复位向量表,取出新程序的复位中断向量的地址,并跳转
执行新程序 的 复 位 中 断 服 务 程 序,随 后 跳 转 至 新 程 序
 楼主| goodluck09876 发表于 2018-10-6 16:40 | 显示全部楼层
main函数,其过程如图3的标号③所示。新程序的 main函数具有永不返回的特性,即一旦进入 APP程序,便不会再运行IAP的任何代码。
 楼主| goodluck09876 发表于 2018-10-6 16:40 | 显示全部楼层
IAP功能实现流程如图4所示。根据 Ymodem 协议,数据固定以每帧1 024字节传输,接收端对每帧都会进行CRC校验,以确保数据接收的准确性,数据准确无误才会写入指定的flash区域。
 楼主| goodluck09876 发表于 2018-10-6 16:40 | 显示全部楼层
 楼主| goodluck09876 发表于 2018-10-6 16:41 | 显示全部楼层
设 置 程 序 起 始 位 置 的 方 法 是 (keil uvision4 集 成 开
发 环 境 )在 工 程 的 “Option for Target… .”界 面 中 的
“Target”页里 将 “IROM”的 “Start”列 改 为 “程 序 起 始
位 置”。
IAP中断向量表设置如下:
void NVIC_SetVectorTable(u32NVIC_VectTab,u32
Offset);
void NVIC_SetVectorTable(0x8000000,0x00);//偏
移量0x00
APP中断向量表设置如下:
void NVIC_SetVectorTable(u32NVIC_VectTab,u32
Offset);
void NVIC_SetVectorTable(0x8000000,0x8000);//
偏移量0x8000
 楼主| goodluck09876 发表于 2018-10-6 16:41 | 显示全部楼层
内置flash有1MB的存储空间,分为12个扇区,前两个扇区(32K)预留给IAP 程序,其余的 10个扇区分配给APP程序,因此每次更新 APP程序之前,都要先擦除分配给 APP程序flash空间。
 楼主| goodluck09876 发表于 2018-10-6 16:42 | 显示全部楼层
如果IAP程序被破坏,采集器必须返厂拆开机器才能
重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。
针对这样的需求,STM32在对 Flash区域实行读保护的同
时,自动地对 Flash区的前4页设置为写保护,这样可以有
效地保证IAP 程 序 (第 一 部 分 代 码)区 域 不 会 被 意 外 地
破坏。
colin2135 发表于 2018-10-7 15:28 | 显示全部楼层
这字体看得真难受。
磨砂 发表于 2018-10-8 09:32 | 显示全部楼层
一般情况下用不到是吗
labasi 发表于 2018-10-8 15:30 | 显示全部楼层
非常感谢楼主分享啊
renzheshengui 发表于 2018-10-8 16:09 | 显示全部楼层
第一次听说这个 了解下
Snoopy2000 发表于 2019-11-29 18:09 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部