打印
[CW32F030系列]

如何在 CW32F030 上实现 IAP 功能实现远程升级

[复制链接]
573|45
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
forgot|  楼主 | 2023-7-11 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IAP 是 In Application Programing 的首字母缩写,在应用编程,即在程序运行的过程中进行编程(升级程序,更新固件)。IAP 是用户自己的程序在运行过程中对 Flash 部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。

IAP 功能的实现,一般将程序分为两个部分,即:Bootloader 和 APP。Bootloader 程序用于上电时判断程序是进入 IAP 升级流程还是进入 APP 应用程序执行过程。其一般放置在 FLASH 的开始部分

CW32F030 的 Flash 起始地址为 0x00000000,划分 0x00000000 ~ 0x00001FFFF 这 8Kbyte 的空间用于存放Bootloader 程序,APP 的起始地址选择为 0x00002000。CW32F030 采用 ARM® Cortex®-M0+ 内核,具有向量表偏移寄存器 VTOR,故其从 Bootloader 中实现向 APP中跳转较为简单,仅设置向量表偏移即可。

参考代码
int main(void)
{
volatile uint32_t u32Ticks, u32ElapsedTicks;
RCC_Configuration(); // 配置系统的工作时钟,SYSCLK=HCLK=PCLK=64MHz
InitTick(SystemCoreClock); // 配置 SYSTICK 频率为 1ms
GPIO_Configuration(); // 配置 PA01 引脚为按键 KEY1 的输入
u32Ticks = GetTick();
do
{
u32ElapsedTicks = GetTick() - u32Ticks;
if (!PA01_GETVALUE()) // 检测按键
{ // 按下按键
break;
}
} while(u32ElapsedTicks < 1000); // 等待 1s
if (u32ElapsedTicks < 1000)
{ // 1s 内有按键按下,进入串口升级流程
UART1_Configuration(); // 配置串口,波特率 115200
SerialDownload(); // 通过 YMODEM 协议下载升级程序
}
else
{ // 超时,从 boolloader 程序向用户 APP 程序跳转
__disable_irq(); // 关中断
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) // 判断跳转的地址是否
有合法程序存在
{
// 向用户的 APP 程序进行跳转
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); // ResetHandle 函数的地址
Jump_To_Application = (func_ptr_t) JumpAddress; // 将地址强制转换为函数指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress); // 设置用户 APP 程序的栈地址
Jump_To_Application(); // 跳入用户 APP 程序的 ResetHandle 处
}
}
while (1);
}


以 MDK-ARM 为例,编译时注意如下选项:
1. 设 置 Bootloader 程 序 的 起 始 地 址 和 占 用 ROM(FLASH) 空 间 的 大 小, 本 例 中 Bootloader 从 地 址0x00000000 处执行,占用 7.46Kbyte 的空间,故分配 8Kbyte(size=0x2000)的 FLASH 空间保留给bootloader。

2. 链接时,使用 IDE 的对话框配置。

APP 程序可以先按正常程序的设计流程进行设计和调试,等调试测试通过后,需要进行如下的修改:
1. 在对系统初始化时,修改中断向量表的偏移地址如下图将 VECT_TAB_OFFSET 修改为 0x00002000,这个偏移量就是用户的程序准备在 FLASH 中存放的地址,本例设置为 0x00002000。这样用户程序的中断向量表就被重定位到 0x00002000 处,与 ARM®Cortex®-M0+ 内核默认的中断向量表地址 0x00000000 相区分。

2. 修改编译配置,START 填入的值,即为 APP 程序在 FLASH 中存放的起始地址,也是中断向量表需要偏移的位置。

3. 链接时,使用 IDE 的对话框配置。


使用特权

评论回复
沙发
pssyx| | 2023-7-11 13:47 | 只看该作者
远程如何实现?可有实用的构想?

使用特权

评论回复
板凳
forgot|  楼主 | 2023-7-11 13:57 | 只看该作者
pssyx 发表于 2023-7-11 13:47
远程如何实现?可有实用的构想?

可以直接通过串口进行远程升级,比较简单,当然也可以通过以太网升级

使用特权

评论回复
地板
guijial511| | 2023-7-11 20:26 | 只看该作者
内部flash如果足够,APP分成两个区存储最好,一个用于存放出厂固件,一个用于存放当前运行固件。

使用特权

评论回复
5
forgot|  楼主 | 2023-7-12 09:02 | 只看该作者
guijial511 发表于 2023-7-11 20:26
内部flash如果足够,APP分成两个区存储最好,一个用于存放出厂固件,一个用于存放当前运行固件。 ...

是的。 这样设计会比较安全,可以防止升级失败而导致变砖

使用特权

评论回复
6
再见十分钟| | 2023-7-12 09:03 | 只看该作者
RAM空间是不是可以不用进行特殊的划分?

使用特权

评论回复
7
小暖| | 2023-7-12 09:05 | 只看该作者
APP中的向量表偏移一定不能忘记,吃过大亏

使用特权

评论回复
8
普通话补丁| | 2023-7-12 11:26 | 只看该作者
看不到IDE对话框配置的图啊

使用特权

评论回复
9
村支书| | 2023-7-13 08:58 | 只看该作者
有keil工程可以下载吗?

使用特权

评论回复
10
前车后炮| | 2023-7-18 08:41 | 只看该作者
正好要用到这个 IAP 功能实现远程升级,学习一下,不知道用串口行不行的

使用特权

评论回复
11
小耳朵图图| | 2023-7-25 09:54 | 只看该作者
学习了,感谢分享

使用特权

评论回复
12
kenny01| | 2023-7-25 09:56 | 只看该作者
挺好用的,谢谢分享

使用特权

评论回复
13
happypcb| | 2023-7-25 10:22 | 只看该作者
不错不错

使用特权

评论回复
14
tpgf| | 2023-8-9 18:17 | 只看该作者
这种远程升级的最远距离是收到什么的限制呢

使用特权

评论回复
15
nawu| | 2023-8-10 09:18 | 只看该作者
如果升级失败了的话 如何处理呢 会不会没办法运行老程序了呢

使用特权

评论回复
16
aoyi| | 2023-8-10 09:51 | 只看该作者
如何保证在远程升级时候的数据传送不出问题呢

使用特权

评论回复
17
tfqi| | 2023-8-10 11:48 | 只看该作者
除了iap远程升级  还要其他方式可以进行远程升级吗

使用特权

评论回复
18
磨砂| | 2023-8-10 12:09 | 只看该作者
IAP就是在线升级程序,有一个前提,就是程序分为两部分,从bootloader启动,跳转到APP部分

使用特权

评论回复
19
晓伍| | 2023-8-10 13:45 | 只看该作者
IAP看起来很简单,但是落实到细节处并不简单。由于涉及到程序升级,如果覆盖APP的是错误的代码,那么设备就废了,这就是重大事故了。所以对IAP过程的安全把控是非常严的

使用特权

评论回复
20
小夏天的大西瓜| | 2023-8-26 22:35 | 只看该作者
远程调试还是很方便的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1257

主题

10849

帖子

51

粉丝