STM32Cube IAP 无法运行用户程序的解决方法
2017-06-23 19:51
225 查看
IAP程序:
主要是设置用户程序的起始地址 APPLICATION_ADDRESS,如0x08004000,通过外设把用户代码写入FLASH的用户区。满足条件后,跳转至用户区起始地址。
解释一下跳转部分代码:
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)// 判断栈顶地址是否在0x2000 0000 - 0x2000 2000之间
// 通过判断栈顶地址值是否正确来判断是否已经下载用户应用程序。因为用户程序的启动文件开始会初始化栈空间,如果栈顶地址正确,说明用户程序已经下载。
{
__set_PRIMASK(1);// 关闭全局中断。注意,在跳转前,必须先关闭全局中断,进入用户程序后,在中断向量表地址设置完成后再开中断。
printf("Jump to the new program.\r\n");
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);// 前4字节为中断向量表
Jump_To_Application = (pFunction) JumpAddress;// 指向用户程序复位函数所在的地址
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);// 设置用户程序的栈指针
Jump_To_Application();// 执行用户程序
}
需要注意的是,在IAP程序中,跳转用户程序前,需要先关闭全局中断。
可以看论坛上的讨论 http://www.amobbs.com/thread-5606964-1-1.html
用户APP程序:
主要是设置中断向量表的偏移地址和工程选项里的ROM起始地址。需要注意的是在SystemInit()后再设置中断向量表,以及开全局中断。
可以在main的开始设置中断向量表。
工程选项的修改
在main函数开始增加设置中断向量表的部分
// 使用IAP,修改用户程序区基址地址,必须为0x200的整数倍(stm32f205)
// 注意:工程选项相应修改:IROM1: start: 0x8004000
#define VECT_TAB_OFFSET 0x4000/*!< Vector Table base offset field. This value must be a multiple of 0x200. */
用户程序需要转成.bin格式,在工程选项中,User->After Build/Rebuild 中添加 fromelf.exe --bin -o "$L@L.bin" "#L",可实现在输出目录中输出bin文件。
另外可以再添加.bat文件,把.hex和.bin文件拷贝出来,例如:
copy ..\Objects\output.hex Flash\acq_v2_IAPMain.hex
copy ..\Objects\output.bin Flash\acq_v2_IAPMain.bin
另外需要在main函数中开始的地方开启全局中断:
中断向量表地址设置是在SystemInit函数中进行的,在startup_stm32f405xx.s文件中:
__set_PRIMASK(0);// 打开全局中断。注意,在跳转前,必须先关闭全局中断,进入用户程序后,在中断向量表地址设置完成后再开中断。
合并烧写:
在烧写程序时,需要先用烧写器烧写IAP程序,就是BOOTLOADER的部分,然后再通过外设写入用户程序。
但其实,这两步可以合并为一步烧写。
把IAP的.hex最后一句结束语去掉,即删除 :00000001FF;然后把用户程序的.hex全部内容复制到IAP的.hex后面;最后把整合后的.hex文件烧写到0x0800 0000的起始地址即可。
主要是设置用户程序的起始地址 APPLICATION_ADDRESS,如0x08004000,通过外设把用户代码写入FLASH的用户区。满足条件后,跳转至用户区起始地址。
解释一下跳转部分代码:
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)// 判断栈顶地址是否在0x2000 0000 - 0x2000 2000之间
// 通过判断栈顶地址值是否正确来判断是否已经下载用户应用程序。因为用户程序的启动文件开始会初始化栈空间,如果栈顶地址正确,说明用户程序已经下载。
{
__set_PRIMASK(1);// 关闭全局中断。注意,在跳转前,必须先关闭全局中断,进入用户程序后,在中断向量表地址设置完成后再开中断。
printf("Jump to the new program.\r\n");
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);// 前4字节为中断向量表
Jump_To_Application = (pFunction) JumpAddress;// 指向用户程序复位函数所在的地址
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);// 设置用户程序的栈指针
Jump_To_Application();// 执行用户程序
}
需要注意的是,在IAP程序中,跳转用户程序前,需要先关闭全局中断。
可以看论坛上的讨论 http://www.amobbs.com/thread-5606964-1-1.html
用户APP程序:
主要是设置中断向量表的偏移地址和工程选项里的ROM起始地址。需要注意的是在SystemInit()后再设置中断向量表,以及开全局中断。
可以在main的开始设置中断向量表。
工程选项的修改
在main函数开始增加设置中断向量表的部分
// 使用IAP,修改用户程序区基址地址,必须为0x200的整数倍(stm32f205)
// 注意:工程选项相应修改:IROM1: start: 0x8004000
#define VECT_TAB_OFFSET 0x4000/*!< Vector Table base offset field. This value must be a multiple of 0x200. */
用户程序需要转成.bin格式,在工程选项中,User->After Build/Rebuild 中添加 fromelf.exe --bin -o "$L@L.bin" "#L",可实现在输出目录中输出bin文件。
另外可以再添加.bat文件,把.hex和.bin文件拷贝出来,例如:
copy ..\Objects\output.hex Flash\acq_v2_IAPMain.hex
copy ..\Objects\output.bin Flash\acq_v2_IAPMain.bin
另外需要在main函数中开始的地方开启全局中断:
中断向量表地址设置是在SystemInit函数中进行的,在startup_stm32f405xx.s文件中:
LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
__set_PRIMASK(0);// 打开全局中断。注意,在跳转前,必须先关闭全局中断,进入用户程序后,在中断向量表地址设置完成后再开中断。
合并烧写:
在烧写程序时,需要先用烧写器烧写IAP程序,就是BOOTLOADER的部分,然后再通过外设写入用户程序。
但其实,这两步可以合并为一步烧写。
把IAP的.hex最后一句结束语去掉,即删除 :00000001FF;然后把用户程序的.hex全部内容复制到IAP的.hex后面;最后把整合后的.hex文件烧写到0x0800 0000的起始地址即可。
相关文章推荐
- 用户权限不够无法运行程序的解决方法
- 安装程序无法创建一个DCOM用户帐号来注册 D:/....的解决方法
- 【共享】解决“无法显示进程。没有正确安装调试器。请运行安装程序安装或修复调试器。”错误的方法。
- visual c 6.0 编写串口程序release版本在非vc电脑上无法运行的解决方法
- 当所有安装过的程序(exe)文件都无法运行时的解决方法
- 无法启动虚拟化 因为虚拟机管理程序未运行问题解决方法
- 使用VS2003遇到“无法显示进程。没有正确安装调试器。请运行安装程序安装或修复调试器。”的解决方法
- 通知dll尚未注册,程序无法运行的解决方法
- vs2005 编译程序无法运行解决方法
- 检测到指定的WEB服务器运行的不是ASP.NET 1.1版,您无法运行ASP.NET应用程序或服务和创建ASP.NET程序时候发生错误 HTTP/1.0 500 Server Error的解决方法
- IIS下无法运行ASP程序的解决方法
- Vista中所有的.exe可执行程序都无法运行的解决方法
- win7 64位平台编译的程序在XP 32位平台无法运行的解决方法
- 解决SQL2000出现"无法执行查询,因为文件缺少或未注册。再次运行安装程序确保要求的文件已注册。"的方法
- vs2005 编译程序无法运行解决方法
- asp+Access程序在Windows Server 2003 Enterprise Edition服务器上运行时无法显示备注字段的解决方法
- vs编译程序在Win7下提示无法运行解决方法
- c#winform程序运行时出现“无法在证书存储区中找到清单签名证书”错误的解决方法
- SQL2008无法连接到.\SQLEXPRESS,用户'sa'登录失败(错误18456)图文解决方法 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: 共享内存提供程序, er
- 64位下无法运行32位程序的解决方法 提示未指定提供程序,也没有指派的默认提供程序