【STM32】IAP

本文深入解析STM32的IAP(在应用编程),探讨ICP、中断向量表、中断向量表偏移量等概念。介绍了程序内存布局,包括Code、RO-data、RW-data、ZI-data段,以及ROM和RAM的使用。通过实例分析,阐述了如何利用JLink-flash工具理解程序内存操作。

首先先明白几个概念
IAP:In applicating Programing,在应用编程
ICP:In-Circuit Programming,在线编程
我自己理解的话,ICP就是平时用仿真器直接下载程序的方式。应用程序直接从FLASH的0x0800 0000开始执行,只需要应用程序一个代码。
IAP则需要两个代码(应该是两类代码),BootloaderAPP程序。Bootloader作用是先接受到(通过各种通信方式)需要更新的APP文件,然后写入到指定位置(FLASH或者SRAM,SRAM好像不用写入,这个不太懂,)。

所以需要对代码执行过程进行学习,再了解几个概念。
起始地址:FLASH或者SRAM物理起始地址,FLASH为0x8000 000,SRAM为0x2000 0000。
中断向量表:各种中断响应程序。应该就是发生中断时(异常事件)判断是哪种中断,并进入对应中断服务程序。中断向量表起始地址(0x8000 0004)复位中断向量,复位中断服务程序执行完成后会跳转到main()函数。在ICP中只有一个程序,也就只有一个中断服务向量表。而在加入Bootloader后即存在两个代码,对应FLASH中的不同位置上,有两个中断向量表。
中断向量表偏移量:在加入Bootloader后,同一个FLASH中存在两个中断向量表,但在APP中发生中断时,PC指针扔强制跳转到0X0800 0004中断向量处,而不是新程序的中断向量表。要想执行APP程序中的中断服务程序就需要对中断向量表进行偏移。
ICP正常运行代码

<think>嗯,用户想找关于STM32 IAP的实现教程或者示例代码。首先,我需要理解IAP是什么。IAP即应用内编程,允许微控制器在运行时更新自身程序,这对于固件升级非常有用,不需要外部编程器。然后,用户提到的STM32系列,特别是F103C8T6和H7系列,这两个型号可能有不同的实现方法。 接下来,我应该回顾系统级指令,确保回答符合要求。比如,数学公式要用$...$,但这里可能用不到太多数学内容。中文回答,结构清晰,生成相关问题,引用已有的资料。用户提供的引用1和引用2都是关于STM32 IAP的,所以需要正确引用这些资料。 用户可能需要具体的步骤和示例代码,尤其是针对不同型号的STM32。F103C8T6是较旧的型号,而H7是高性能系列,它们的实现可能有所不同。需要分别说明,并提供代码示例。同时,可能需要注意不同型号的启动地址和内存分配的不同。 另外,用户可能关心如何通过串口实现IAP,所以需要解释Bootloader和应用程序的划分,内存地址的设置,以及跳转机制。可能还需要提到Flash编程和中断向量表重定向的问题,这在STM32中是一个关键点。 还要考虑用户可能的疑问,比如如何验证代码的正确性,或者如何处理传输中的错误,所以生成的相关问题可以包括这些方面。另外,优化方法和应用场景也是常见的后续问题。 最后,确保回答结构清晰,分步骤说明,引用正确,并提供示例代码和相关问题。需要检查是否有遗漏的细节,比如内存地址是否正确,代码是否适用于特定型号,以及是否有推荐的开发工具或环境。</think>### STM32 IAP技术实现详解 根据现有资料,STM32 IAP实现主要分为Bootloader开发和应用程序设计两个部分,以下是关键实现步骤: 1. **内存地址规划** - Bootloader需存储在Flash起始地址$0x08000000$ - 应用程序起始地址根据芯片型号调整: $$STM32F103C8T6:0x08002000$$ $$STM32H743:0x08020000$$ 2. **Bootloader核心功能实现** ```c // 串口接收中断处理 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE)) { buffer[rx_index++] = USART_ReceiveData(USART1); if(rx_index >= BUFFER_SIZE) { flash_program(buffer, BUFFER_SIZE); // Flash编程函数 rx_index = 0; } } } ``` 3. **应用程序跳转机制** ```c typedef void (*pFunction)(void); void jump_to_app(uint32_t app_address) { pFunction jump; __set_MSP(*(__IO uint32_t*)app_address); jump = (pFunction)(*(__IO uint32_t*)(app_address + 4)); jump(); } ``` 实现要点: - 中断向量表重定向:在应用程序中需设置SCB->VTOR - Flash分页擦除:不同型号的STM32分页大小不同(F103C8T6每页1KB,H7系列每页128KB) - 数据校验:推荐使用CRC32校验算法[^1][^2]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值