[APM32F0] 软件ISP跳转串口升级程序

[复制链接]
 楼主| Fordhs168 发表于 2024-9-20 22:03 | 显示全部楼层 |阅读模式
本帖最后由 Fordhs168 于 2024-9-20 22:20 编辑

#技术资源#
    STM32-APM32   芯片内部存在一个固化的ISP固件,用于串口升级,固件存放在芯片系统存储区,每款芯片的系统存储区地址不同(具体可以查看对应芯片手册),系统存储区大小以及ISP固件大小也有差异。
    使用ISP升级,一般需要硬件配合,BOOT0拉到高电平,结合ISP上位机使用串口实现程序升级。本章主要描述无视BOOT0的状态,使用软件直接跳转到内部ISP固件区,实现程序升级。
    以APM32F030C8为例,系统存储区地址为0x1FFFEC00,大小为3K。具体芯片对应系统存储区地址查手册!
    ISP第一个握手信号是0x7F,MCU的ISP固件接收到且正确后会回复0x79。具体详细通信协议可以使用抓包工具查看,或者查看ISP协议资料(可以查看STM32的AN3155、AN2606等应用笔记
  1. uint8_t data[1];
  2. #define ISP_ADDR  0x1FFFEC00
  3. typedef  void (*pFunction)(void);//定义一个指针,指向程序入口
  4. pFunction Jump_To_ISPlication;

  5. void Jump_to_ISP(void)
  6. {
  7.     uint32_t address;
  8.      uint32_t JumpAddress;
  9. //    FMC_Unlock();
  10.     address = ISP_ADDR;
  11.     JumpAddress = *(__IO uint32_t*)(address + 4);
  12.     Jump_To_ISPlication = (pFunction) JumpAddress;
  13.     __set_MSP(*(__IO uint32_t*) address);
  14.     Jump_To_ISPlication();
  15. }

  16. int main(){
  17.     //系统时钟初始化
  18.     //串口1初始化,PA9 PA10
  19.     //配置串口中断接收,将接收到的数据赋值给data[0]
  20.   while (1)
  21.     {
  22.         if(data[0]==0x7f)//此处根据具体应用,可以设置按键进入等
  23.          {
  24.             __disable_irq();
  25.             Jump_to_ISP();
  26.          }
  27.     }
  28.   }




sesefadou 发表于 2024-10-3 08:01 | 显示全部楼层
实施数据校验机制,如CRC校验,以确保数据传输的准确性。
tifmill 发表于 2024-10-3 10:28 | 显示全部楼层
考虑数据传输的效率,选择合适的数据包大小和传输速率。过大的数据包可能导致传输错误增加,而过小的数据包则会降低传输效率。
houjiakai 发表于 2024-10-3 11:24 | 显示全部楼层
在进行升级前,应当备份当前的固件,以便在升级失败时可以恢复。
minzisc 发表于 2024-10-3 12:57 | 显示全部楼层
虽然软件ISP可以在不改变BOOT0状态的情况下进行,但某些情况下可能仍然需要硬件配合,如设置BOOT0引脚的状态。
youtome 发表于 2024-10-3 14:16 | 显示全部楼层
查阅芯片手册,确定ISP固件在系统存储区的地址。
对于APM32F030C8,系统存储区地址为0x1FFFEC00,大小为3K。
phoenixwhite 发表于 2024-10-3 16:05 | 显示全部楼层
查阅MCU的官方文档或应用笔记,了解ISP固件的具体实现和通信协议细节。
nomomy 发表于 2024-10-3 17:47 | 显示全部楼层
考虑升级过程的安全性,防止未经授权的升级或恶意攻击。可以采用加密、数字签名等安全机制来确保升级文件的真实性和完整性。
jkl21 发表于 2024-10-3 19:32 | 显示全部楼层
采取必要的安全措施,防止未授权的访问或恶意攻击。
i1mcu 发表于 2024-10-3 21:07 | 显示全部楼层
设计回滚机制,以便在新固件存在缺陷时能够恢复到旧版本。
daichaodai 发表于 2024-10-3 23:06 来自手机 | 显示全部楼层
ISP是通过串口来实现升级应用程序得
lzbf 发表于 2024-10-4 13:20 | 显示全部楼层
确认BOOT引脚(如BOOT0、BOOT1)的配置是否正确,以便进入ISP模式。
fengm 发表于 2024-10-4 14:55 | 显示全部楼层
添加错误处理机制,以应对可能出现的通信错误或数据丢失。
sanfuzi 发表于 2024-10-4 16:30 | 显示全部楼层
在升级过程中,对传输的数据进行校验是非常重要的。可以使用校验和、CRC(Cyclic Redundancy Check,循环冗余校验)等方法对数据进行校验,确保数据的完整性和正确性。
robertesth 发表于 2024-10-4 18:08 | 显示全部楼层
标设备的电源稳定,避免在编程过程中出现电压波动。
febgxu 发表于 2024-10-4 19:43 | 显示全部楼层
串口的波特率、数据位、停止位和校验位等参数设置正确。这些参数必须与升级程序和目标设备的要求相匹配,否则可能导致通信失败。
cemaj 发表于 2024-10-4 21:17 | 显示全部楼层
在进行ISP升级时,可能需要禁用全局中断以确保升级过程中不会被其他中断打断。在某些情况下,还需要处理与ISP相关的特定中断服务例程。
mickit 发表于 2024-10-4 22:51 | 显示全部楼层
在升级过程中,稳定的电源供应是必要的,以避免因电压波动导致的升级失败或设备损坏。
alvpeg 发表于 2024-10-5 09:38 | 显示全部楼层
实现稳定的软件跳转机制,确保在升级完成后能够正确地从升级程序跳转到新的应用程序。跳转过程中需要注意保存关键数据和状态,以避免数据丢失和系统异常。
backlugin 发表于 2024-10-5 11:15 | 显示全部楼层
每款芯片的系统存储区地址可能不同,需要查阅对应芯片的数据手册以获取确切的地址。例如,对于APM32F030C8芯片,系统存储区的地址为0x1FFFEC00。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

29

帖子

0

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