微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 IAP 无法运行用户程序的解决方法

STM32 IAP 无法运行用户程序的解决方法

时间:12-03 来源:互联网 点击:
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 applications Stack Pointer */

__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);// 设置用户程序的栈指针

Jump_To_Application();// 执行用户程序

}

需要注意的是,在IAP程序中,跳转用户程序前,需要先关闭全局中断。

可以看论坛上的讨论http://www.amobbs.com/thread-5606964-1-1.html

用户程序:

主要是设置中断向量表的偏移地址和工程选项里的ROM起始地址。需要注意的是在SystemInit()后再设置中断向量表,以及开全局中断。

可以在main的开始设置中断向量表。

工程选项的修改


在main函数开始增加设置中断向量表的部分

// 使用IAP,修改用户程序区基址地址,必须为0x200的整数倍(stm32f205)

// 注意:工程选项相应修改:IROM1: start: 0x8004000

#ifdef VECT_TAB_RAM

/* Set the Vector Table base location at 0x20000000 */

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else /* VECT_TAB_FLASH */ // 修改FLASH向量表,起始地址由0x8004000开始为用户程序区

/* Set the Vector Table base location at 0x08000000 */

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);

__set_PRIMASK(0);// 开启全局中断

#endif

用户程序需要转成.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

合并烧写:

在烧写程序时,需要先用烧写器烧写IAP程序,就是BOOTLOADER的部分,然后再通过外设写入用户程序。

但其实,这两步可以合并为一步烧写。

把IAP的.hex最后一句结束语去掉,即删除 :00000001FF;然后把用户程序的.hex全部内容复制到IAP的.hex后面;最后把整合后的.hex文件烧写到0x0800 0000的起始地址即可。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top