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

发布者:真诚相伴最新更新时间:2016-10-07 来源: eefocus关键字:STM32  IAP  无法运行  用户程序 手机看文章 扫描二维码
随时随地手机看文章
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
 
用户程序:
主要是设置中断向量表的偏移地址和工程选项里的ROM起始地址。需要注意的是在SystemInit()后再设置中断向量表,以及开全局中断。
可以在main的开始设置中断向量表。
工程选项的修改
STM32 IAP 无法运行用户程序的解决方法 - yaoohui - 两个人的工厂
 
 
在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文件。
STM32 IAP 无法运行用户程序的解决方法 - yaoohui - 两个人的工厂
另外可以再添加.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的起始地址即可。
关键字:STM32  IAP  无法运行  用户程序 引用地址:STM32 IAP 无法运行用户程序的解决方法

上一篇:STM32 ADC与DMA多通道处理
下一篇:stm32 怎样释放pa15,pb3,pb4作为gpio口使用

推荐阅读最新更新时间:2024-03-16 15:13

STM32STM32之深入理解DMA
任何一个技术的出现都是为了解决当时出现的问题,任何一个技术既有优点也会有缺点,任何一个技术的适用都需要分场景,看条件。DMA也不例外。 1 直接存储器存取DMA(Direct Memory Access) DMA处于总线矩阵的前级,与内核cortex-M3同级别,属于主设备(Master)。DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 2 DMA工作过程 手册描述: 以上的官方描述信息量较大: 1) DMA会暂停系统总线若干个周期。意思是DMA工作时,CPU被挂起? 2) 然后总线仲裁器又执行循环调度。如何调
[单片机]
【<font color='red'>STM32</font>】<font color='red'>STM32</font>之深入理解DMA
stm32NVIC中断优先管理
这里简单介绍一下STM32的中断分组:STM32 将中断分为5个组,组为0~4,最多设置16个中断优先级。该分组的设置是由SCB- AIRCR寄存器的bit10~8,来定义的,具体分配关系表如下: 第0组 :所有4位用于指定响应优先级 第1组:最高1位用于指定抢占优先级,最低3位用于指定响应优先级 第2组:最高2位用于指定抢占优先级,最低两位用于指定响应优先级 第3组:最高3位用于指定抢占优先级,最低1位用于指定响应优先级 第4组:所有4位用于指定抢占优先级 通过这个表,我们就可以清楚的看到组0~4对应的配置关系,例如组设置3,那么此时所有的60个中断,每个中断的中断优先级寄存器的高4位中的最高3位 是
[单片机]
stm32NVIC中断优先管理
STM32的boot引脚设置
Boot mode selection Bootmode pins Aliasing BOOT1 BOOT0 x 0 Main Flash memory Main Flash memory is selected as boot space 0 1 System memory System memory is selected as boot space 1 1 Embedded SRAM Embedded SRAM is select
[单片机]
ARM开发(8)基于STM32的窗口看门狗
一 窗口看门狗原理: 1.1 本实验实现STM32的窗口看门狗 1.2 实验思路:理解STM32窗口看门狗原理,根据其原理写驱动。 1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真 二 实验步骤: 2.1 wwdg.h代码: #ifndef __WWDG_H #define __WWDG_H #include sys.h void WWDG_Init(u8 tr,u8 wr,u32 fprer);//初始化WWDG void WWDG_Set_Counter(u8 cnt); //设置WWDG的计数器 void WWDG_NVIC_Init(void); //中断 #endif 2.2 ww
[单片机]
STM32 GPIO输出高低电平转换速率测试
最近对STM32 GPIO的输出端高低电平变化速率产生兴趣,于是用我所知道的控制GPIO的不同方法做了测试。 单片机CPU:STM32F103ZET6 软件平台:kEIL MDK 逻辑分析仪:金沙滩 LA2016 从图中看出,最快的是 GPIOA - ODR = 0x1; GPIOA - ODR = 0x0; 和 PA0 = 0x01;PA0 = 0x00; 和 GPIOA - BSRR = 0x01; GPIOA - BRR = 0x01; 转换周期是220ns,4.55Mhz 最慢的是 *PAO0 = !*PAO0 ; 和 PA0 =!PA0; 取反操作浪费不少
[单片机]
<font color='red'>STM32</font> GPIO输出高低电平转换速率测试
stm32 usart的几种通信模式
一 USART 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART支持同步单向通信和半双工单线通信,也支持LIN(局部互联网)、智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。 USART双向通信至少需要两个引脚:接收数据输入(RX)和发送数据输出(TX)。 同步模式下需要引脚:发送器时钟输出(CK) IrDA模式需要引脚:数据输入(IrDA_RDI)、数据输出(IrDA_RDO)
[单片机]
STM32封装自己的库函数(GPIO初始化)
初始化GPIO 1.确定引脚号 2.确定模式 3.GPIO类型 4.定义上拉或下拉 定义初始化GPIO引脚结构体 typedef unsigned char unit8_t typedef struct { unit32_t GPIO_Pin; GPIOMode_Typedef GPIO_Mode; GPIOOType_Typedef GPIO_OTypde; GPIOSpeed_Typedef GPOI_Speed; GPIO_PuPd_Typedef GPIO_PuPD; }GPIO_InitTypedef; typedef enum { GPIO_Mode_
[单片机]
stm32 堆栈分配
1.堆和栈大小 定义大小在startup_stm32f2xx.s Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; Heap Configuration ; Heap Size (in Bytes) 0x0-0xFFFFFFFF:8 ; Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, R
[单片机]
<font color='red'>stm32</font> 堆栈分配
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved