news 2026/4/23 14:38:52

单片机 IAP(可实现OTA), ISP, ICP

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单片机 IAP(可实现OTA), ISP, ICP

以赛元单片机为例讲解:

IAP(In-Application Programming,在应用中编程)是一种允许微控制器在运行用户程序的同时,通过软件手段对自身FLASH存储器进行编程(擦除/写入)的技术。

一、IAP的核心定义

与传统编程方式的对比

编程方式如何编程是否需要外部工具应用场景
ICP
(In-CircuitProgramming)
通过编程器/调试器需要专用编程器工厂量产、初次烧录
ISP
(In-SystemProgramming)
通过BootLoader+通信接口需要上位机软件板级测试、维修升级
IAP
(In-ApplicationProgramming)
用户程序自身操作无需外部工具
(可通过网络等)
远程升级、参数存储

关键区别

  • ICP/ISP:需要停止用户程序,进入特殊模式

  • IAP:不停止用户程序,在运行中更新FLASH

二、IAP的典型应用场景

1. 固件在线升级(OTA/FOTA)

// 用户程序中的IAP升级流程 void UserApp_Main(void) { while(1) { // 正常执行应用程序功能 Process_User_Tasks(); // 检查是否需要升级(如通过网络、串口) if(Check_Upgrade_Request()) { // 调用IAP函数,自我更新 Prepare_For_IAP_Update(); IAP_Erase_And_Program_New_Firmware(); Reboot_System(); // 重启运行新程序 } } }

2. 动态数据存储

// 使用IAP功能存储运行参数 void Save_Runtime_Parameters(void) { // 在FLASH中存储数据(非易失性) IAP_Erase_Sector(DATA_SECTOR_ADDR); IAP_Program(DATA_SECTOR_ADDR, parameters, sizeof(parameters)); // 可以继续运行,无需重启 Continue_Normal_Operation(); }

3. 自编程实现功能切换

// 通过IAP修改程序自身行为 void Dynamic_Feature_Enable(void) { // 例如:解锁高级功能 if(license_valid) { // 修改特定FLASH位置,使能功能 IAP_Program(FEATURE_FLAG_ADDR, ENABLE_CODE, 4); } }

三、IAP的工作原理

1. 硬件基础

  • 自编程能力:芯片FLASH控制器支持自我编程

  • 独立总线:指令总线和数据总线分离(哈佛架构)

  • 特殊寄存器:IAP操作专用控制寄存器

2. 操作流程(以赛元单片机为例)

// 典型的IAP操作序列 uint8_t IAP_Program_Flash(uint32_t addr, uint8_t *data, uint16_t len) { // 步骤1:解锁IAP功能(特定序列) IAP_CONTR = 0x5A; // 解锁密钥1 IAP_CONTR |= IAP_EN; // 使能IAP // 步骤2:设置操作模式 IAP_CMD = IAP_PROGRAM_CMD; // 编程命令 IAP_ADDRH = (addr >> 8); // 地址高字节 IAP_ADDRL = (addr & 0xFF); // 地址低字节 // 步骤3:写入数据 for(uint16_t i = 0; i < len; i++) { // 注意:不同架构写法不同 *((__xdata uint8_t *)addr + i) = data[i]; } // 步骤4:触发操作(特定序列) IAP_TRIG = 0xA5; IAP_TRIG = 0x5A; // 立即执行 // 步骤5:等待完成并检查状态 while(IAP_CONTR & IAP_BUSY); // 等待完成 // 步骤6:重新锁定 IAP_CONTR = 0; // 禁用IAP return IAP_STATUS; // 返回操作状态 }

3. 关键限制与注意事项

// IAP操作的重要限制 void IAP_Important_Limits(void) { // 1. **不能擦除/写入正在执行的代码** // 会导致崩溃或未定义行为 // 2. **必须按页/扇区操作** // FLASH最小擦除单位是扇区(如512字节) // 3. **需要特殊电压/时钟条件** // 有些芯片要求特定电压下才能IAP // 4. **操作期间中断影响** // 通常需要关闭中断或使用特殊处理 }

四、IAP vs BootLoader

很多人混淆这两个概念,其实它们不同但相关

1. BootLoader + IAP 组合方案

┌─────────────────────────────────────────────────┐ │ FLASH 存储器 │ ├──────────────┬────────────────┬─────────────────┤ │ BootLoader │应用程序区│ 备份区/参数区 │ │ (8KB) │ (56KB) │ (8KB) │ └──────────────┴────────────────┴─────────────────┘ ↑ ↑ ↑启动代码通过IAP更新自己通过IAP读写数据

2. 工作模式对比

/* 方案A:传统BootLoader更新(ISP)*/ 上电 → BootLoader → 检查升级 → 接收新固件 → 写入APP区 → 跳转APP /* 方案B:IAP自我更新 */ APP运行 → 检测升级 → 接收新固件 → IAP写入自身 → 重启验证

3. 混合方案(推荐)

// 分阶段IAP实现 void Smart_IAP_System(void) { // 阶段1:BootLoader(不可更新) // 负责最基础的恢复和紧急更新 // 阶段2:应用程序(可IAP更新) // 包含主要功能,支持自我更新 // 阶段3:备份应用程序 // 当主应用程序损坏时回滚 }

五、IAP的具体实现步骤

1. 安全准备阶段

bool Prepare_For_IAP_Update(void) { // 1. 验证新固件的合法性 if(!Verify_Firmware_Signature(new_firmware)) { return false; } // 2. 检查FLASH空间 if(!Check_Flash_Space_Available()) { return false; } // 3. 保存关键状态到RAM Save_Critical_State_To_RAM(); // 4. 禁用不必要的中断和外设 Disable_Interrupts_And_Peripherals(); return true; }

2. 双缓冲区更新策略

//避免更新失败变砖的常用方案void Safe_IAP_Update(void) { // FLASH分区布局: // 区A: 当前运行程序 (v1.0) // 区B: 下载缓存区 (空) // 区C: 备份程序 (v1.0备份) // 步骤1:下载新固件到区B Download_To_Sector_B(new_firmware); // 步骤2:验证区B的程序 if(Verify_Sector_B() == PASS) { // 步骤3:复制当前程序到区C(备份) Copy_Sector_A_To_Sector_C(); // 步骤4:擦除区A并写入新程序 IAP_Erase_Sector_A(); IAP_Program_Sector_A_From_Sector_B(); // 步骤5:验证并决定 if(Verify_Sector_A() == PASS) { // 成功:运行新程序 Reboot_And_Run_New_Firmware(); } else { // 失败:从区C恢复 Restore_From_Sector_C(); } } }

3. 通信协议设计

// IAP通信协议示例 typedef struct { uint8_t start_flag; // 0xAA uint8_t command; // 命令字 uint32_t address; // FLASH地址 uint16_t length; // 数据长度 uint8_t data[256]; // 数据载荷 uint16_t crc16; // CRC校验 uint8_t end_flag; // 0x55 } IAP_Packet_t; // 常用命令集 #define IAP_CMD_CONNECT 0x01 // 连接 #define IAP_CMD_ERASE 0x02 // 擦除扇区 #define IAP_CMD_WRITE 0x03 // 写入数据 #define IAP_CMD_READ 0x04 // 读取验证 #define IAP_CMD_EXECUTE 0x05 // 执行新程序 #define IAP_CMD_RESET 0x06 // 复位系统

六、实际开发注意事项

1. 中断处理策略

// 方法1:完全禁用中断(简单但可能丢数据) void IAP_Operation_With_IRQ_Disabled(void) { EA = 0; // 关闭全局中断 Perform_IAP_Operation(); EA = 1; // 恢复中断 } // 方法2:重映射中断向量到RAM(高级方案) void IAP_Operation_With_IRQ_Remapped(void) { // 1. 复制中断向量表到RAM Copy_IVT_To_RAM(); // 2. 重映射中断到RAM中的向量表 Remap_Interrupt_Vector_To_RAM(); // 3. 执行IAP操作(中断可正常响应) Perform_IAP_Operation(); // 4. 恢复原中断向量 Restore_Original_IVT(); }

2. 电源稳定性要求

// IAP期间必须保证电源稳定 void Check_Power_Before_IAP(void) { // 1. 检查电压 if(Get_VCC_Voltage() < MIN_IAP_VOLTAGE) { Postpone_IAP_Operation(); return; } // 2. 启用看门狗防止死锁 Enable_Watchdog_Timeout(IAP_TIMEOUT); // 3. 可能需要的特殊操作 if(Chip_Requires_Special_IAP_Voltage()) { Enable_IAP_Voltage_Regulator(); Wait_For_Voltage_Stable(); } }

3. 错误恢复机制

// 实现可靠的IAP错误处理 IAP_Status_t Robust_IAP_Update(void) { IAP_Status_t status = IAP_SUCCESS; for(uint8_t retry = 0; retry < MAX_RETRIES; retry++) { status = Try_IAP_Operation(); switch(status) { case IAP_SUCCESS: return IAP_SUCCESS; case IAP_VOLTAGE_ERROR: Adjust_Power_Supply(); break; case IAP_VERIFY_ERROR: // 验证失败,重新传输 Request_Data_Retransmission(); break; case IAP_ADDRESS_ERROR: // 地址错误,不可恢复 return IAP_FATAL_ERROR; default: Delay_ms(RETRY_DELAY_MS); break; } } // 所有重试失败 Enter_Recovery_Mode(); return IAP_MAX_RETRIES_EXCEEDED; }

七、IAP的高级应用

1. 差分升级(减少数据传输量)

// 只传输变化的部分,不是整个固件 void Differential_IAP_Update(void) { // 1. 计算当前固件和新固件的差异 Calculate_Delta(current_firmware, new_firmware, &delta); // 2. 仅传输差异数据 Transmit_Delta_Data(delta); // 3. 在设备端应用差异 Apply_Delta_To_Current_Firmware(delta); }

2. A/B分区无缝切换

// 实现无感知固件更新 void Seamless_A_B_Switching(void) { // 分区A: v1.0 (当前运行) // 分区B: v2.0 (已更新) // 1. 在后台更新分区B Update_Partition_B_Background(); // 2. 验证分区B的完整性 if(Verify_Partition_B() == PASS) { // 3. 更新引导标志(下次启动到B) Update_Boot_Flag_TO_B(); // 4. 正常完成本次运行 // 下次重启自动运行新版本 } }

3. 远程IAP(物联网设备)

// 通过网络进行IAP更新 void Remote_IAP_Over_Network(void) { // 1. 接收更新通知(MQTT/HTTP/CoAP) if(Received_OTA_Update_Command()) { // 2. 安全验证 if(Authenticate_Update_Server()) { // 3. 分段下载固件 while(!Download_Complete()) { Download_Next_Fragment(); Store_Fragment_To_Flash(); } // 4. 验证并切换 if(Verify_Downloaded_Firmware()) { Schedule_Reboot_For_Update(); } } } }

八、总结:IAP的核心价值

  1. 现场升级能力:无需返厂或使用专用工具

  2. 产品生命周期管理:可以持续改进和修复bug

  3. 参数非易失存储:替代部分EEPROM功能

  4. 功能动态配置:通过更新改变设备行为

  5. 降低维护成本:远程解决问题,减少现场服务

关键要点

  • IAP是自我编程能力,不是特定的编程方法

  • 必须考虑安全性可靠性,防止设备变砖

  • 通常与BootLoader配合实现更稳健的更新机制

  • 需要深入了解芯片的FLASH架构限制

IAP是现代嵌入式系统的标配功能,尤其对于需要远程维护或长期现场运行的设备至关重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 23:15:50

AI搞不定问题?RAG检索增强生成技术深度解析,让你的大模型从此不再“一本正经地胡说八道“

一、什么是在线检索? 在RAG(检索增强生成)系统中,在线检索流程是指当用户提出问题时,系统实时查找相关知识并生成答案的完整过程。就像你去图书馆问管理员问题,管理员立即帮你找到相关书籍并总结答案给你。 二、完整流程拆解 1. 用户提问 这是一切的起点。用户输入自然语言…

作者头像 李华
网站建设 2026/4/23 9:50:15

美团LongCat-Video:136亿参数视频生成新突破

美团LongCat-Video&#xff1a;136亿参数视频生成新突破 【免费下载链接】LongCat-Video 项目地址: https://ai.gitcode.com/hf_mirrors/meituan-longcat/LongCat-Video 近日&#xff0c;美团官方发布了其最新的视频生成模型LongCat-Video&#xff0c;这是一款拥有136亿…

作者头像 李华
网站建设 2026/4/23 7:46:46

【国产大模型黑马突围】:Open-AutoGLM的7个关键突破点你必须知道

第一章&#xff1a;Open-AutoGLM会和chatgpt一样火近年来&#xff0c;大语言模型的开源生态迅速崛起&#xff0c;Open-AutoGLM作为一款具备自主推理与代码生成能力的开放模型&#xff0c;正吸引越来越多开发者的关注。其设计理念融合了AutoGPT的任务分解机制与GLM系列模型的强大…

作者头像 李华
网站建设 2026/4/23 9:45:48

Qwen3-VL-FP8:终极多模态AI视觉语言模型

导语&#xff1a;Qwen3-VL系列推出FP8量化版本&#xff0c;在保持原始模型性能的同时实现算力成本大幅降低&#xff0c;推动多模态大模型向更广泛的产业应用迈出关键一步。 【免费下载链接】Qwen3-VL-30B-A3B-Instruct-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/Qwe…

作者头像 李华
网站建设 2026/4/23 9:45:36

【Open-AutoGLM是否需要root权限?】:深度解析免Root部署方案与安全边界

第一章&#xff1a;Open-AutoGLM是否需要root权限&#xff1f;Open-AutoGLM 是一个面向自动化任务与自然语言交互的开源框架&#xff0c;其设计目标是支持在普通用户环境下安全运行&#xff0c;因此默认情况下**不需要 root 权限**即可完成大部分核心功能。该框架通过用户级服务…

作者头像 李华
网站建设 2026/4/23 9:48:45

基于python语言的考试信息报名系统_5n9zn--论文_pycharm django vue flask

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 基于python语言的考试信息报名系统_5n9zn–论文_pycharm djan…

作者头像 李华