[CW32F030系列] 在 CW32F030的IAP 应用

[复制链接]
808|2
 楼主| lzbf 发表于 2022-12-11 08:00 | 显示全部楼层 |阅读模式

前言

IAP 是 In Application Programing 的首字母缩写,在应用编程,即在程序运行的过程中进行编程(升级程序, 更新固件)。

IAP 是用户自己的程序在运行过程中对 Flash 部分区域进行烧写,目的是为了在产品发布后可以方便地通过 预留的通信口对产品中的固件程序进行更新升级。

1 功能实现

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

CW32F030 的 Flash 起始地址为 0x00000000,划分 0x00000000 ~ 0x00001FFFF 这 8Kbyte 的空间用于存放 Bootloader 程序,APP 的起始地址选择为 0x00002000。

CW32F030 采用 ARM® Cortex®-M0+ 内核,具有向量表偏移寄存器 VTOR,故其从 Bootloader 中实现向 APP 中跳转较为简单,仅设置向量表偏移即可。

本应用中 Bootloader 采用 UART1 作为 IAP 的通讯接口,以 Ymodem 协议进行文件的传输。APP 程序通过 SYSTICK 定时器计时,并通过中断的方式每 200ms 对口线 PB09 翻转一次,驱动 LED1 闪烁。

2 Bootloader 程序设计

2.1 参考代码、

  1. int main(void)
  2. {
  3. volatile uint32_t u32Ticks, u32ElapsedTicks;
  4. RCC_Configuration(); // 配置系统的工作时钟,SYSCLK=HCLK=PCLK=64MHz
  5. InitTick(SystemCoreClock); // 配置 SYSTICK 频率为 1ms
  6. GPIO_Configuration(); // 配置 PA01 引脚为按键 KEY1 的输入
  7. u32Ticks = GetTick();
  8. do
  9. {
  10. u32ElapsedTicks = GetTick() - u32Ticks;
  11. if (!PA01_GETVALUE()) // 检测按键
  12. { // 按下按键
  13. break;
  14. }
  15. } while(u32ElapsedTicks < 1000); // 等待 1s
  16. if (u32ElapsedTicks < 1000)
  17. { // 1s 内有按键按下,进入串口升级流程
  18. UART1_Configuration(); // 配置串口,波特率 115200
  19. SerialDownload(); // 通过 YMODEM 协议下载升级程序
  20. }
  21. else
  22. { // 超时,从 boolloader 程序向用户 APP 程序跳转
  23. __disable_irq(); // 关中断
  24. if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) // 判断跳转的地址是否
  25. 有合法程序存在
  26. {
  27. // 向用户的 APP 程序进行跳转
  28. JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); // ResetHandle 函数的地址
  29. Jump_To_Application = (func_ptr_t) JumpAddress; // 将地址强制转换为函数指针
  30. __set_MSP(*(__IO uint32_t*) ApplicationAddress); // 设置用户 APP 程序的栈地址
  31. Jump_To_Application(); // 跳入用户 APP 程序的 ResetHandle 处
  32. }
  33. }
  34. while (1);
  35. }


2.2 程序编译

以 MDK-ARM 为例,编译时注意如下选项:

1. 设 置 Bootloader 程 序 的 起 始 地 址 和 占 用 ROM(FLASH) 空 间 的 大 小, 本 例 中 Bootloader 从 地 址 0x00000000 处执行,占用 7.46Kbyte 的空间,故分配 8Kbyte(size=0x2000)的 FLASH 空间保留给 bootloader。如下图:

2. 链接时,使用 IDE 的对话框配置,如下图:

3 APP 程序设计

APP 程序可以先按正常程序的设计流程进行设计和调试,等调试测试通过后,需要进行如下的修改:

1. 在对系统初始化时,修改中断向量表的偏移地址

如下图将 VECT_TAB_OFFSET 修改为 0x00002000,这个偏移量就是用户的程序准备在 FLASH 中存放 的地址,本例设置为 0x00002000。这样用户程序的中断向量表就被重定位到 0x00002000 处,与 ARM® Cortex®-M0+ 内核默认的中断向量表地址 0x00000000 相区分。

2. 修改编译配置

如下图,START 填入的值,即为 APP 程序在 FLASH 中存放的起始地址,也是中断向量表需要偏移的位置。

3. 链接时,使用 IDE 的对话框配置,如下图:

4 演示

上 位 机 采 用 Windows 的 超 级 终 端, 设 置 串 口 波 特 率 为 115200bps,8 位 数 据 位,1 位 停 止 位。 下 位 机 CW32F030C8T6 StarKit 复位后,按下 KEY1 后,超级终端将有如下显示:

屏幕不断显示字符“C”,提示下位机准备接受文件。选择“传送”-“发送文件”,如下图:

在出现的对话框中选取用户的 APP 文件,并将协议选择为“Ymodem”,并点击“发送”,如下图:

程序传输完成后,屏幕将有如下提示:

此时,CW32F030C8T6 StarKit 板上的 LED1 将以 200ms 的间隔闪烁,说明用户程序已正常运行。


Bowclad 发表于 2022-12-23 17:16 | 显示全部楼层
Bootloader 中向 APP 中跳转怎么实现啊?
Undshing 发表于 2022-12-26 11:43 | 显示全部楼层
Bowclad 发表于 2022-12-23 17:16
Bootloader 中向 APP 中跳转怎么实现啊?

配置地址跟大小
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

5633

帖子

3

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