下载算法对于大部分工程师来说,只需要会使用即可,也不用过多去关心里面实现的方法。当然,对于有时间的工程师来说,了解下载算法还是有一定好处的。
 

之前给大家分享过基于 Keil MDK 环境的下载算法制作,今天就来给大家分享一篇基于 IAR、STM32 的下载算法的制作。

 

1、环境 IDE 环境

IAR EWARM 8.32 单片机:STM32H750VBT6 外部 Flash:W25Q64

 

2、背景、知识介绍我们为什么需要下载算法?下载算法是在哪里使用的?

 

 

如上图所示,我们想通过 C-SPY 将固件直接下载到 Flash 是不被允许的,那我们怎么才能实现将固件下载进 Flash 呢?

 

IAR 官方文档《FlashLoaderGuide.ENU.pdf》告诉我们说,我们需要先将固件放在 RAM 缓存里面,然后通过一个名叫"Flash Loader"的小程序,将代码不断的从 RAM 搬运到 Flash(这里的 Flash 可以是内部 Flash,也是可以是外部 Flash)。

 

上文中提到的"Flash Loader"就是需要我们针对不同的硬件去分别实现的代码,也就是所谓的 Flash 下载算法。

 

知识介绍:IAR 下载算法一共包括 4 个文件(.out 文件、.flash 文件、.board 文件、.mac 文件)。

 

1、.out 文件是由"Flash Loader"代码生成的,里面包含了我们对 QPSI 管脚的定义,函数 FlashInit()、函数 FlashWrite()、函数 FlashErase()的实现。

 

2、.flash 文件是一个 XML 文件,里面包含了一些必要的元素和一些不必要的元素,仅针对必要元素做一个简单介绍

 

exe:指向 .out 文件

 

flash_base:Flash 的基础地址

 

page:Flash 每页的大小

 

block:对应 Flash 有多少个扇区,每个扇区多大。(block 元素对应 Flash 的扇区还是块,待考证)

 

3、.board 文件同样也是一个 XML 文件。可以由 *** 进行多个 .flash 文件设置。每个 pass 内包含了两个必要的属性 range:表面了 Flash 的起始地址及结束地址 loader:当前 pass 调用那个下载算法的路径

 

4、IAR 每次仿真下载完程序是从当前工程的 main 函数开始运行的。如果我们将代码下载到了 0x90000000 地址处,我们并没有开启内存映射,是不可以仿真的。这时候就需要采样 .mac 文件作为一个启动脚本,当程序仿真下载完成后,跳转到 0x08000000 处开始运行。在 0x08000000 处进行内存映射,然后马上跳转到 0x90000000 处,就可以进行仿真了。

 

3、制作思想

下载"Flash Loader"开源代码

 

创建一个空工程,将"Flash Loader"开源代码里面的文件添加到工程

 

完成函数 FlashInit()、函数 FlashWrite()、函数 FlashErase()。

 

生成 .out 文件

 

制作 .flash 文件

 

制作 .borad 文件

 

根据需要制作 .mac 文件

 

4、源码说明上面已经介绍了下载算法制作的一些基础知识及制作思想,下面我们正式开始动手制作下载算法。

1、下载 FlashLoder 开源代码。传送门:https://files.iar.com/public/cmsis/
下载后的文件内容如下图所示:

 

 

 

“flash_loader.c”、“flash_loader.h”、“flash_loader_asm.s”、"flash_loader_extra.h"四个文件是供 C-SPY 调用的,我们不应该去修改文件内容。真正需要我们去修改的内容是"template"文件夹下的"flash_loader_ram.c"文件。

 

2、为了方便,我找到 IAR 安装路径(“C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\arm\src\flashloader\ST”)下的"FlashSTM32H7xx_QSPI"文件夹,对这个文件内容进行更改。我们将"FlashLoder"代码添加进去,并添加相应的路径。

(注:“flash_loader_ram.c"文件当前工程下被改名为"FlashSTM32H7xx_QSPI.c”)。

 

3、补充函数内容 A. 补充 FlashInit 函数内容

 

 

B. 补充 FlashWrite 函数内容

 


C. 补充 FlashErase 函数内容

 

 

4、生成 .out 文件由三个需要注意的地方 A. 我们需要将代码下载到 RAM 里面执行,IAR->Option->Linker->Config 配置如下:

 

 

B.IAR->Option->Linker->Output 配置的是输出 .out 文件的内容:

 


C. 当前工程没有 main 函数,程序运行的第一个函数将是 FlashInit 函数,对 IAR->Option->Linker->Library 配置如下:

 


5、制作 .flash 文件,如下图:

 


6、制作 .board 文件,如下图:

 


7、对于 H750 内存映射外部 Flash 还需要制作 .mac 文件,内容如下:

 

文件内容就很好理解了,下载完成后,pc 指针指向中断向量表的 Reset_Handler 函数,堆栈指针指向程序运行的首地址。这样每次程序仿真下载完成后,就从 0x08000000 处开始运行。我们可以把 Boot 程序放在这个地址,Boot 程序里面进行内存映射,然后跳转到 0x90000000 处。

 

5、效果展示我们制作好上诉四个文件过后,创建一个工程(该工程要运行在 0x90000000 处),对这个工程进行简单配置。

IAR->Option->Debugger->Download 下,配置如下:

 


IAR->Option->Debugger->Setup 下,配置如下:

 


IAR->Option->Linker->Edit 下,配置如下:

 

 

 

在代码初始的地址,还需要加上中断向量表地址 SCB->VTOR = 0x90000000;
做完上诉配置后,我们进行仿真下载,如下图所示,我们可以看到 main 函数已经存在与 0x90003588 处,并且可以进行仿真,说明我们配置是正确的。

 


将代码全速运行,可以看见串口显示正式我们程序设置的输出。

 


至此,关于 IAR 下下载算法的制作与验证就全部介绍完了。

 

参考资料:

FlashLoaderGuide.ENU.pdfEWARM_DebuggingGuide.ENU.pdfFlashLoader 源码