STM32F4-IAP学习笔记(二)

本文详细介绍了STM32F4的IAP(In-Application Programming)实现过程,包括通讯、FLASH操作和引导跳转三个关键模块。在通讯部分,以USART为例阐述稳定传输的重要性;在FLASH操作中,讲解了写入地址的有效性校验及数据转化;引导跳转部分,解释了地址空间校验、复位中断向量保存等步骤。文章还提及了APP程序的编写注意事项,如设置ROM空间、中断向量表重定向,并分享了完整的IAP学习心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

啰嗦两句

之前我们分析了IAP的基本工作原理和编程应该注意的细节问题,接着上篇,我们来看看具体的编码问题。

正文

上篇基本将IAP工作的机理和程序组成以及运行路程分析过了,所以我们只看看关键模块的编码。
首先分析IAP,关键模块有三部分:通讯,FLASH操作,引导跳转。

一、通讯

我们先来谈谈通讯问题。可以将,无论什么通讯,都可以完成代码的传输,USART也好,USB也好,CAN也好,等等,只要是通讯外设,你都可以用来传输外设,但是考虑到实用性,也许USART是简单也是最最常用的。我们以就以USART为例来讲通讯。
文件的传输一定要稳定,传输过程中不可以丢数据,否则传输的文件就有问题,导致最后的APP程序存在问题。所以我们使用USART时需要选择合适波特率,要尽量大保证传输速率,但又不能太大导致丢帧。然后开启中断在中断将接收到的数据存放到一个数组里即可,随后处理即可。编码相信大家都会,就不在这里复述了。

二、FLASH操作

我们需要将接受到的APP程序写到合适的FLASH地址,以便后面引导启动。
首先应该明确STM32F4的FLASH地址为0x08000000-0x080FFFFF,若果越过这个空间写肯定是有问题的。下面我们看看FLASH写入的步骤。

1.校验写入地址有效性

//写入地址必须处于FLASH区间并且地址为4的倍数【按字写入】

if(WriteAddr < FLASH_BASEADDR || WriteAddr%4)   //addr error
        return ;

2.FLASH解锁,缓冲区除能

//必须要解锁FLASH并保证数据缓存处于关闭状态才可以进行FLASH写入

FLASH_Unlock();                         //ready to clear sector
FLASH_DataCacheCmd(DISABLE);

3.判断是否要擦除缓冲区


                
引用提供了一段程序代码,该代码是用于在STM32F4芯片中进行IAP(In-Application Programming)操作的。IAP是一种在应用程序内部进行程序更新的技术。该代码通过USART接收到的进制APP程序文件,并将其存储在SRAM的USART_RX_BUF缓冲区中。在将程序写入FLASH时,通过判断USART_RX_CNT的计数值来确定是否写完。 引用提到,STM32F4芯片的系统存储器是用来存放内置Bootloader代码的。这些代码是在出厂时固化在芯片内部的,用来进行主存储器的代码下载。当BOOT0接3.3V,BOOT1接GND时,芯片将从系统存储器启动,即进入串口下载模式。 引用解释了代码中的一些地址和运算操作。0X20001000是USART_RX_BUF缓冲区的起始地址,用来存放接收到的新的APP程序。0X20001000 + 4是复位中断地址,通过将其强转为(vu32*)指针并与0xFF000000进行与运算,可以判断程序是否在FLASH代码的地址范围内。 关于IAP的实现方法,可以分为三个部分:代码更新部分、写入部分和跳转部分。 代码更新部分是将接收到的APP程序文件写入SRAM的USART_RX_BUF缓冲区,并通过判断计数器USART_RX_CNT的值来确定是否写入完整的程序。 写入部分是将缓冲区的数据写入FLASH的指定地址。这段代码中使用了一个临时缓冲区iapbuf,它是u32类型的,因此每次从缓冲区中取出四个字节的数据,并合并为一个u32类型的数据。然后将iapbuf中的数据以512个字节的大小写入FLASH,直到写入完所有的数据。 最后,跳转部分是通过检查指定地址中的复位中断的值,判断是否为FLASH代码。如果是,就执行跳转到该地址开始执行程序的代码。 需要注意的是,这些代码中使用了一些宏定义和数据类型,例如u8、u16、u32等,这些是STM32F4芯片的数据类型。还有一些函数和指针的使用,例如iap_write_appbin()函数用于写入APP程序到FLASH,iap_load_app()函数用于执行FLASH中的APP程序,以及iapfun类型的指针用于跳转到指定地址开始执行程序。 综上所述,这段代码实现了在STM32F4芯片中进行IAP操作的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32F4串口IAP学习笔记](https://blog.csdn.net/qq_38966786/article/details/89879975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [STM32F4 IAP实现总结](https://blog.csdn.net/Tiffany982/article/details/122575261)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值