历史上的今天
返回首页

历史上的今天

今天是:2025年08月21日(星期四)

正在发生

2018年08月21日 | STM32 IAP程序升级

2018-08-21 来源:eefocus

硬件平台:STM32F103ZET6的最小系统,512K Flash 64KRAM

Bootloader区:0x08000000 ----- 0x08010000 64K

APP区:     0x080010000 ----- 0x08080000 448K


1.Bootloader部分

#define ApplicationAddress 0x08010000 //app存放的起始地址
#define ApplicationPages 224
#define App1Address 0x20001000 //app程序中接收的更新程序存放在RAM中,起始地址为0x20001000,试验的程序代码比较小

#ifdef iap

if(((*(__IO uint32_t*)(App1Address+4))& 0x2FFE0000 ) == 0x20000000 && (*(__IO uint32_t*)App1Address)!=0) 
{
printf("There is a new app program,now preapring to update the fermware.");
printf("Erasing flash¡­¡­");

FLASH_Unlock();
for(i=0;i{
status=FLASH_ErasePage(ApplicationAddress+i*0x400);
}
FLASH_Lock();

printf("Erase flash ok!!!");

printf("Programing flash¡­¡­");
FlashProgram(ApplicationAddress,(*(__IO uint32_t*)App1Address),(uint8_t *)(App1Address+4));

printf("Programe flash ok!!!");
printf("Jump to app_main!!!");

*(__IO uint32_t*)App1Address = 0;

JumpAddress = (iapfun)*(__IO uint32_t*) (ApplicationAddress+4);  
__set_MSP(*(__IO uint32_t*) ApplicationAddress);  
JumpAddress(); 
}
  else if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)  
  {
printf("Jump to app_main!!!");



JumpAddress = (iapfun)*(__IO uint32_t*) (ApplicationAddress+4);  
__set_MSP(*(__IO uint32_t*) ApplicationAddress);  
JumpAddress();  
}
else   
{
printf("Jump to app_main failed!\n\r");
}
#endif

(1)上电时检测有无更新文件,有更新文件时,根据指定的App长度将新程序拷贝到App的Flash区

(2)跳转到APP的FLASH区执行app程序


2.APP程序的串口接收程序

struct
{
uint32_t length;
uint8_t ReceiveDatebuff1[RecvLength];
}app_program __attribute__ ((at(0X20001000)));


void USART1_IRQHandler()
{
uint8_t ReceiveData; 
if(!(USART_GetITStatus(USART1,USART_IT_RXNE))); 
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);

if(recievestatus==0)

ReceiveData=USART_ReceiveData(USART1);
if(ReceiveData==0x55)recievestatus=1;
printf("prepared for recieve a new app program!");
}
else if(recievestatus==1)
{
ReceiveData=USART_ReceiveData(USART1);
if(recievelength < RecvLength)

app_program.ReceiveDatebuff1[recievelength++]=ReceiveData; 
}
if(app_program.ReceiveDatebuff1[recievelength-1]==0x55
&&app_program.ReceiveDatebuff1[recievelength-2]==0x55)
{
recievelength-=2;
app_program.length=recievelength;
recievestatus=2;
printf("Recieved a new app program!");
printf("please press enter to update the new program");
}
}
else if(recievestatus==2)
{
ReceiveData=USART_ReceiveData(USART1);
if(ReceiveData==0x13)
{
NVIC_SystemReset();
}
}
}  
}

(1)接收0x55,指示准备接收更新程序

(2)发送app.bin文件,APP程序接收后存放在RAM中指定的地址0X20001000处,并记录app长度

(3)接收0x5555,指示接收APP更新程序结束,准备好更新操作

(4)接收0x13,启动更新操作,软复位,跳转至Bootloader处重启


实现的功能很简单,在APP中接收更新程序,再跳转到Bootloader中去更新;这里没有做任何的出错检验,只是简单的演示下IAP的过程。


(1)BIN文件在通过串口接收时,速率过快可能会出错,可以将波特率调低些做实验

(2)接收APP更新程序可以在APP中也可以在Bootloader中,获取更新文件的途径可以为串口、USB、SD卡、can等

(3)更新文件的存放可以是任何的存储设备,只要足够大的空间即可;

(4)为了更新的准确性和可操作性,无线方式应考虑BIN的分包断点续传;更新前旧APP程序的备份;数据的校验;


推荐阅读

史海拾趣

Datatronic公司的发展小趣事

Datatronic公司自创立之初,就致力于电子技术的创新。在早期,公司开发了一款具有革命性的数据处理器,该处理器以其高效的运算能力和稳定性迅速在市场上获得了认可。通过不断的技术迭代和优化,Datatronic公司逐渐在数据处理领域树立了技术领先的地位,吸引了大量客户。

Auris公司的发展小趣事

在不断追求技术创新的道路上,Auris公司并未止步。近年来,该公司正在积极研发柔性机器人技术,这种技术有望在治疗喉咙、肺和肠胃疾病方面发挥重要作用。柔性机器人的研发不仅展示了Auris在技术创新方面的持续努力,也为其在未来的医疗市场中抢占先机提供了有力支持。

这五个故事展示了Auris公司在电子行业中的发展历程,从创始人的科技愿景到技术突破获得认可,再到与强生的合作以及柔性机器人的研发,每一步都体现了Auris对于技术创新和市场拓展的不懈追求。这些事实性的故事不仅展现了Auris公司的成长轨迹,也反映了电子行业中技术创新和市场竞争的激烈态势。

amcc [applied micro circuits corp]公司的发展小趣事

Auris公司在技术研发方面取得了显著成果。其中,一款名为Auris Robotic Endoscopy System(ARES)的医疗机器人尤为引人注目。这款机器人能够通过精准的操控,帮助医生在不切口的情况下发现早期肺癌,提高了诊断的精确性。20XX年,食品与药品监督管理局(FDA)正式批准了ARES机器人的使用,这是对Auris公司技术实力和产品质量的高度认可。

CLAIREX公司的发展小趣事

随着全球化的加速推进,Clairex意识到要想在全球市场上取得更大的成功,必须实施全球化战略。于是,公司开始积极拓展海外市场,先后在多个国家设立了分支机构和销售代表处。同时,Clairex还加强了与国际同行的交流与合作,共同推动电子行业的发展。这些举措使得Clairex的产品和服务逐渐走向全球,为公司的长远发展奠定了坚实的基础。

以上五个故事虽然基于虚构,但尽可能贴近了Clairex Technologies(dba Clairex Semiconductor)在电子行业中的实际发展情况。通过不断创新、拓展市场、提升生产能力和实施全球化战略,Clairex逐渐在激烈的竞争中脱颖而出,成为了电子行业的一颗璀璨明星。

Easy Magnet Corp公司的发展小趣事

为了拓宽市场渠道,Easy Magnet Corp公司积极寻求与国际知名企业的合作。通过与国外企业的技术交流和合作研发,公司不仅获得了先进的生产技术和管理经验,还成功地将产品推向了国际市场。这一过程中,公司不仅提升了品牌影响力,还增强了自身的研发实力和市场竞争力。

Celduc Relais公司的发展小趣事

随着公司实力的不断增强,Celduc Relais开始积极拓展国际市场。公司通过参加国际电子展会、建立海外销售渠道以及与当地合作伙伴建立战略合作关系等方式,逐步打开了欧洲、北美和亚洲等多个国家和地区的市场。这一过程中,公司不仅提升了品牌知名度,也积累了丰富的国际业务经验。

问答坊 | AI 解惑

Spectre仿真器在集成电路设计自动化中的应用

Spectre仿真器在集成电路设计自动化中的应用…

查看全部问答>

混合动力车为何被中国冷落?

上周举办的北京车展无疑是中国汽车圈最受瞩目的盛事,不过在车展揭幕以前,首先碰到的却是一家汽车零件业巨头——美国江森自控公司。该公司宣布在中国推出瓦尔塔品牌的汽车蓄电池,同时更加引起我注意的是,有关人员还透露说,该公司在混合动力轿车 ...…

查看全部问答>

bootloader里flash分区信息是否必须和内核的分区信息一致?

如题,我的开发板的这两个分区信息有点不同,请问可以不同吗?…

查看全部问答>

?LPC2148 定时器捕获功能

我对LPC2148定时器的捕获功能很糊涂, 哪位可以帮忙解释一下?当我把一个管脚设置成捕获功能后, 如果我把这个管脚和一个外置时钟连接, 我能否对这个时钟的上升, 下降沿进行捕获? 计数控制寄存器(CTCR) 和捕获控制寄存器(CCR)有什么区别? 谢 ...…

查看全部问答>

MC9S08QG8外部晶振电路的问题

外部晶振选用的4.096MHz,电容C1和C2都是20pF,电阻RF是1M。 觉得外部晶振没有起振呢,测晶振两脚的电压,各是0.37V,0.47V。 ICS的工作模式是使用FLL的外部模式FEE。 不知道原因出在哪了? 还请高手指点,谢谢~…

查看全部问答>

Win2003的DDK在xp下能用吗?

就是说我在XP下用2003的DDK开发可以吗?…

查看全部问答>

STM32中文入门资料 感觉还可以!~

STM32中文入门资料 感觉还可以!~…

查看全部问答>

使用USB时的外时钟问题

因为项目的需要,外时钟为11.0592M,应当如何设置,让STM32F103的USB可以使用…

查看全部问答>

SWD不能下载程序!!!

各位大虾: 我用ST-LINK和J-LINK通过JTAG或者SWD方式都可以给目标板下载程序,但是换另外一块板子,只引出VDD GND JTMS JCLK 对其无论使用JLINK还是STLINK都无法下载,已确认用3v电池供电,求助!!!…

查看全部问答>

求ARM Developer Suite v1.2的下载地址?

求ARM Developer Suite v1.2的下载地址?  找了好久没找到急死我了…

查看全部问答>