1、需要两份程序
BootLoader和App程序,两份程序均可以通过jlink下载,只需要将下载地址修改一下即可:
2、在BootLoader中的跳转函数
#define APP_FLASH_ADDR 0x8008000
iap_load_app(APP_FLASH_ADDR);
//#include 'include.h'
#include 'iap.h'
#include 'main.h'
typedef void (*iapfun)(void);//?¨ò?ò???oˉêyààDíμ?2?êy.
iapfun jump2app;
__asm void MSR_MSP(u32 addr)
{
MSR MSP, r0 //set Main Stack value
BX r14
}
/******************************************************************************
* Function name £o iap_load_app
* Function describe £o ì?×aμ?app3ìDò?£
* Input £o appxaddr£oapp3ìDòμ?μ??·?£
* Output £o No
* Illustration £o
* Revise £o
* Existing problems : No
*****************************************************************************/
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)
{
jump2app=(iapfun)*(vu32*)(appxaddr+4);
MSR_MSP(*(vu32*)appxaddr);
jump2app(); //ì?×aμ?APP.
}
}
3、在app中修改中断向量表的偏移地址
4、程序自动选择向量表的偏移地址
适用场景,一颗芯片里面有3个程序:
BootLoader程序,起始地址:0x08000000
APP1程序,起始地址:0x08008000
APP2程序,起始地址:0x08013000
这种情况就需要BootLoader程序自动选择往哪个地址跳转,这个地址再升级完以后会变,比如当前的跳转地址是app1,那么升级后跳转的地址就变为app1。
针对这种场景,做如下修改:
5、keil编译器中设置的程序起始地址会别写进bin文件
上图中的地址会被写入到bin文件中,所有在编译APP1程序和APP2程序的时候,要记着修改这里的起始地址。
关键字:STM32 单片机 远程升级
引用地址:
图文详解STM32单片机远程升级
推荐阅读最新更新时间:2024-11-16 20:41
单片机小白学步(24) 改版说明与学习思想
从本篇起,《单片机小白学步》系列教程将做一个重大的改版。前面的文章暂且就不改动了,之后的文章将会重新编排。主要的改动如下: 文章全部使用Markdown进行编写排版,格式更加丰富,阅读起来也会更加轻松。 实验的工程源码,将上传至我的GitHub页面,可直接下载使用。 我的GitHub主页 https://github.com/jzj1993 为了方便统一讲解,也考虑到开发板资料可能有版权问题,本系列教程将和绿豆芽科技合作。大部分实验,将直接使用绿豆芽科技提供的51Start开发板。如果有这款开发板,可以直接烧写配套代码进行实验。如果没有,欢迎购买这款开发板。当然也可以通过简单的修改代码,在其他开发板上做实
[单片机]
单片机出租车计价器设计
出租车计价器的单片机源程序: #include reg51.h #include lcd1602.h #include ds1302.h unsigned char time_add ; void LcdDisplay(); void keyscan(); uint n=0,s=0; uint j=0,k=0; uint t=0; uint tx=0,ty=0,tz=0; uint s18=0,n18=0,t18=0,tx18=0,ty18=0,tz18=0,j18=0,k18=0; uint l=0; uint lx=0,ly=0; uint count; sbit SW=P2^1; sbit LED=P2^0;
[单片机]
飞思卡尔单片机PWM模块分析(3)
继续介绍飞思卡尔HCS12系列单片机的PWM模块 (9)PWM通道计数寄存器(PWM Channel Counter Register) PWMCNTx是PWM通道计数寄存器,可以在任何时刻读取该计数器数值,而不影响计数器和PWM通道的工作。计数器方向默认设定为向上计数,从周期寄存器和占空比寄存器的缓冲器中得到周期和占空比数值,人后根据极性选择位改变输出电平。 读:任何时刻 写:任何时刻 注:在级联模式下,无论对16位计数器的访问还是对高八位和第八位分开访问,都会使计数器复位。读取16位计数器必须从16位方式访问,以保持数据的一致性,高8位和低8位分开读取会得到不正确的结果。 (10)PWM通道周期寄存器(PW
[单片机]
STM32 休眠模式下,难道 看门狗和低功耗模式没法同时使用?
在STM32开发中经常会用到独立看门狗(IWDG)和低功耗模式,看门狗是为了检测和解决由软件错误引起的故障,低功耗模式是为了在CPU不需要继续运行时进入到休眠模式用以节省电能。其中独立看门狗的时钟由独立的RC振荡器(STM32F10x一般为40kHz)提供,即使在主时钟出现故障时,也仍然有效,因此可以在停止和待机模式下工作。而且独立看门狗一旦启动,除了系统复位,它不能再被停止。但这样引发的一个问题是当MCU进入到低功耗模式后由于CPU停止运行无法喂狗,会导致系统频繁复位。那如何解决这个问题呢,难道独立看门狗和低功耗模式没法同时使用? 一个很好的方式是在休眠模式下通过RTC定时唤醒来喂狗,喂完够在进入继续进入到休眠模式。比如看
[单片机]
51单片机中的ROM和RAM分别是什么?
众所周知,51 内部的存储器分为数据存储器 RAM 和程序存储器 ROM。以 AT89c51 为例,其中有 128 字节随机存储器(又称数据储存器 RAM)和 4K 字节的只读存 储器(又称程序存储器 ROM)。 先说说这个 4K 字节的程序存储器或者说只读存储器,我们写的程序经过编译器 编译成机器码都是存在这个区域,所以称为程序存储器;但单片机上电执行的时 候,此区域内的数据只能读取而不能写入,他的只读存储器的名称从这而来。 89c51 的 ROM 采用的是 FPEROM(Flash Programmable and Erasable Read Only Memory),具体工艺我也不太清楚,号称可以擦写 1000 次
[单片机]
STC15F2系列单片机UART1使用定时器1做波特率发生器
#include reg51.h #include main.h #include intrins.h //使用T2定时器2 ,控制串口1 波特率 #define FOSC 18432000L //系统频率 #define BAUD 9600 //串口1波特率 #define TM2 (65536-(FOSC/4/BAUD)) #define NONE_PARITY 0 //无校验 #define ODD_PARITY 1 //奇校验 #define EVEN_PARITY 2 //偶校验 #define MARSK_PARITY 3 //标记校验 #define SPACE_PARI
[单片机]
应用AVR单片机制作电子打铃仪的思路
AVR具有512个字节的片内EEPROM,利用它可以记录事先设定的打铃时间(如果每个时间条需要2个字节,则存储的时间条可以200多个),然后将AVR制作成电子钟,在某个时间内,扫描并取出片内存储的时间条,与当前时间进行对比,如果吻合,则打铃。 下面是打铃仪(成熟产品)的具体设计思路: 1、硬件方面:用有备用电池供电的日历芯片DS1302作电子钟的标准时间,AVR外置I2C存储器,LED作状态和时间显示,四至五个轻触开关作控制,输出采用无触点方案。供电:12V直流/220V两用,没有市电自动转换12V蓄电池供电。 控制开关的分配:时分调整2个,功能转换1个,存储或显示记录打铃点1个,备用1个。 2、软件方面:从存储
[单片机]
现实标准和32位MCU
当为下一代控制应用选择32位MCU时,必须考虑一点,就是面对某一实际的应用,不同供应商的处理器虽然在数据手册上看起来或多或少有些相似,但实际上是非常不同的。虽然数据手册中的规范和Dhrystone(处理器整型数计算能力)MIPS处理能力给出了一个粗略的评估标准,但必须考虑得更深入以保证MCU有足够的吞吐量和过载余量来满足当前和未来的应用需求。 运行编译EEMBC汽车标准代码的测试结果显示:看起来类似的三款MCU实际性能差别很大 例如,价格低廉、基于ARM的MCU一般具有很多资源,虽然它们中的许多是基于相同的CPU核,通常是没有高速缓存的ARM7TDMI处理器,但不同供应商的产品整体性能差别非常大。这主要是由于实现片上存储子系
[工业控制]