STM32F4 SD卡IAP升级

2019-07-20 03:27发布

在嵌入式程序开发过程中,经常需要进行升级程序,升级程序的方法有很多种,今天和大家分享一下通过SD卡进行程序升级的方法。这种方法非常有实用价值,并且在实际工程得到了很好的应用,我把这种方法移植到原子哥的STM32F407开发板上,下面详细介绍下这种方法:

一、准备材料:
1,STM32F4开发板一个
2,SD卡一个

二、IAP简介:
IAP的主要作用是在用户程序运行过程中对Flash的部分区域进行烧写,实现的效果就是通过SD卡把不同的程序烧写到MCU中运行,具体介绍可以参考原子哥的《STM32F4开发指南》第五十五章,串口IAP实验那一节。

三、操作步骤:
1,把Bootloader程序下载到MCU中(程序见附件)
2,把App程序(.bin格式)文件放到SD卡根目录(注意文件名称要和Bootloader中设置的相同
3,进行升级(LCD上有提示,按下KEY_UP 键开始升级)
4,升级完毕自动跳转到新程序处开始执行(由于只是演示程序,所以芯片复位或重启会从Bootloader段程序开始执行)
下面对Bootloader段程序和App程序的设置进行介绍:
Bootloader程序:

在进行SD升级之前需要MCU中下载一段程序,这段程序的作用就是把SD卡中需要升级的文件写入到MCU中,而这段程序叫做Bootloader程序。需要升级的程序(固件)叫做App程序,这两段程序存在MCU的Flash中的两段不同的区域,他们之间的关系如下图:



需要注意的是:Bootloader程序只需往MCU中下载一次即可,不同的App程序可以通过Booyloader程序烧写到Flash中。

      Bootloader程序最重要的部分有两段,分别为通过SD卡读取要升级的App程序将读到的程序烧写到Flash中
      Bootloader程序在读取文件时要将数据暂存到一个数组中,然后在烧写到Flash中,所以每次读取的数据不能过大,否则占用太多空间,我每次读取2048Byte数据然后烧写到Flash中,再继续读取2048字节,在写入Flash,直到把所有数据都读取完并写入到Flash中。(最后一次读取的数据可能不足2048Byte),这就是SD卡进行程序升级的过程。

    res = f_open(&file_bin, "TEST.bin", FA_OPEN_EXISTING | FA_READ);//这句话是打开需要升级的固件,固件是bin格式的(下面会介绍如何转换成bin格式)

res = f_read(&file_bin, Receive_dat_buffer, STM_PAGE_SIZE, (UINT*)&br);//这句话是每次读取2048Byte数据(最后一次读取不一定为2048Byte)
iap_write_appbin(addrx,Receive_dat_buffer,readlen);//这个函数非常重要,主要作用是把每次读取的2048Byte数据写入到Flash中

程序烧写完毕,只需要跳转到新程序处开始执行即可,跳转代码为iap_load_app(FLASH_APP1_ADDR);
往STM32F4的Flash中写入数据使用的是STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)这个函数,写入过程主要分4步,解锁、擦除、写入、上锁,其中在擦除过程中禁止数据缓存。
App程序设置:(原子哥的串口IAP实验里有详细过程,这里就简要说明下)
App程序的设置主要分三步:
1,原子哥的STM32F4开发板例程随便打开一个(我以RTC实验为例),由于App程序不能写在Bootloader程序的区域,所以要设置App程序的起始位置,以及程序的大小(App程序<Flash-Bootloader程序
2,得到一个App程序的.bin文件(通过fromelf.exe实现),我的MDK安装在C盘,这个根据你自己的安装位置进行修改
3,设置中断向量表的偏移量,在main函数的最开始处加入下面一句话即可SCB->VTOR = FLASH_BASE | 0x10000;
这三部设置完进行编译就可以在输出文件夹(OBJ文件夹)中找到生成的.bin文件,把这个文件放到SD卡根目录即可进行升级(注意文件名要和Bootloader中设置的相同,否则不能升级)

至此主要的操作步骤就介绍完了,本文介绍的主要是操作的方法,而没有具体介绍原理(可以参考原子哥的串口IAP实验)。升序升级过程中LCD上会有提示信息,如下图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。