一.keil设置程序起始地址
1.1FLASH APP 的起始地址设置
随便打开一个之前的实例工程,点击 Options for Target→Target 选项卡
默认的条件下,图中 IROM1 的起始地址(Start)一般为 0X08000000,大小(Size)为 0X80000, 即从 0X08000000 开始的 512K 空间为我们的程序存储区。而图中,我们设置起始地址(Start) 为 0X08020000,即偏移量为 0X20000(128K 字节),因而,留给 APP 用的 FLASH 空间(Size)只有 0X80000-0X20000=0X60000(384K 字节)大小了。设置好 Start 和 Szie,就完成 APP 程序的起始地址设置。
这里的 128K字节,需要大家根据 Bootloader 程序大小进行选择,比如我们本章的 Bootloader 程序为 70K左右,理论上我们只需要确保 APP 起始地址在 Bootloader之后,并且偏移量为 0X200 的倍数即可(相关知识,请参考:http://www.openedv.com/posts/list/392.htm)。这里我们选择 128K(0X20000)字节,留了一些余量,方便 Bootloader 以后的升级修改。
1.2这是针对 SRAM APP 的起始地址设置
起始地址设置如图
这里我们将 IROM1 的起始地址(Start)定义为:0X20001000,大小为 0X14000(80K 字 节),即从地址 0X20000000 偏移 0X1000 开始,存放 APP 代码。因为整个 STM32L475VET6 的SRAM1大小(不算SRAM2)为96K字节,所以IRAM1(SRAM1)的起始地址变为0X20015000, 大小只有 0X3000(12K 字节)。这样,整个 STM32L475VET6 的 SRAM1(不含 SRAM2)分配 情况为:最开始的 4K 给 Bootloader 程序使用,随后的 80K 存放 APP 程序,最后 12K,用作 APP 程序的内存。这个分配关系大家可以根据自己的实际情况修改,不一定和我们这里的设置 一模一样,不过也需要注意,保证偏移量为 0X200 的倍数(我们这里为 0X1000)。
1.3中断向量表的偏移量设置方法
在系统启动的时候,会首先调用 SystemInit 函数初始化时钟系统,同时 SystemInit 还完成了中断向量表的设置,我们可以打开 SystemInit 函数,看看函数体的结尾处有 这样几行代码:
从 代 码 可 以 理 解 , VTOR 寄 存 器 存 放 的 是 中 断 向 量 表 的 起 始 地 址 。 默 认 的 情 况
VECT_TAB_SRAM 是没有定义,所以执行 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 对于 FLASH APP,我们设置为 FLASH_BASE+偏移量 0x20000,所以我们可以在 SystemInit 函数里面修改 SCB->VTOR 的值。当然为了尽可能不修改系统级别文件,我们可以也可以在 FLASH APP 的 main 函数最开头处添加如下代码实现中断向量表的起始地址的重设:
SCB->VTOR = FLASH_BASE | 0x20000;
以上是 FLASH APP 的情况,当使用 SRAM APP 的时候,我们设置起始地址为: SRAM_BASE+0x1000,同样的方法,我们在 SRAM APP 的 main 函数最开始处,添加下面代码:
SCB->VTOR = SRAM_BASE | 0x1000;
这样,我们就完成了中断向量表偏移量的设置。通过以上两个步骤的设置,我们就可以生成 APP 程序了,只要 APP 程序的 FLASH 和 SRAM 大小不超过我们的设置即可。
二.keil生成bin文件的方法
我们通过 MDK 自带的格式转换工具 fromelf.exe,来实现.axf 文件到.bin 文件的转换。该工具在 MDK 的安装目录\ARM\ARMCC\BIN 文件夹里面。
fromelf.exe 转换工具的语法格式为:fromelf [options] input_file。其中 options 有很多选项可 以设置。
我们通过在 MDK 点击 Options for Target→User 选项卡,在 After Build/Rebuild 栏, 勾选 Run #1,并写入:fromelf --bin --output "$L@L.bin" "#L",如图:
通过这一步设置,我们就可以在 MDK 编译成功之后,调用 fromelf.exe,根据当前工程的 RTC.axf,生成一个 RTC.bin 的文件(比较便捷)。并存放在 axf 文件相同的目录下,即工程的 OBJ 文件夹里 面。在得到.bin 文件之后,我们只需要将这个 bin 文件传送给单片机,即可执行 IAP 升级。
提示:如果想根据具体实际文件路径生成bin的指令如
D:\tools\MDK5.2\ARM\ARMCC\bin\fromelf.exe --bin -o ..\OBJ\RTC.bin ..\OBJ\RTC.axf
调用 fromelf.exe(注意,我的 MDK 是安装在 D:\tools\MDK5.2 文件夹下,如果你是安装在其他目录,请根据你自己的目录修改 fromelf.exe 的路径),根据当前工程的 RTC.axf,生成一个 RTC.bin 的文件。并存放在 axf 文件相同的目录下。