当前位置:首页 > 单片机 > 单片机
[导读]程序收尾总想着以后更新的方便性,采用在应用编程(In Application Programming),通过Bootload引导单片机自己往程序存储器里写数据或修改程序。下面简介STM32F030的IAP方法。不同于STM32F1系列,F0没有中断向量偏移

程序收尾总想着以后更新的方便性,采用在应用编程(In Application Programming),通过Bootload引导单片机自己往程序存储器里写数据或修改程序。下面简介STM32F030的IAP方法。不同于STM32F1系列,F0没有中断向量偏移寄存器。所以在APP程序的开头要添加以下代码。为什么这样做??

可以看到函数用了for循环将矢量表拷贝到0 x20000000 SRAM的基地址,即将矢量表由Flash映射到了SRAM。所以在MDK里面设置Flash偏移地址的时候,同时要设置SRAM偏移地址。如下截图

//APP程序开头加入IAP_Set(void)函数


//Falshaddress

#defineAPPLICATION_ADDRESS((uint32_t)0x08001400)

//SRAMAddress0x020000C0

voidIAP_Set(void)

{

uint32_ti=0;

/*RelocatebysoftwarethevectortabletotheinternalSRAMat0x20000000***/

/*CopythevectortablefromtheFlash(mappedatthebaseoftheapplication

loadaddress0x08003000)tothebaseaddressoftheSRAMat0x20000000.*/

for(i=0;i<48;i++)

{

*((uint32_t*)(0x20000000+(i<<2)))=*(__IOuint32_t*)(APPLICATION_ADDRESS+(i<<2));

}

/*EnabletheSYSCFGperipheralclock*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

/*RemapSRAMat0x00000000*/

SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

}




有Target对话框可以看出APP程序有Flash地址0x8001400开始执行。Sram数据则有0x20000c0出开始存储。

说完APP代码要处理事项,下面说一下IAP代码编写


/*Keeptheuserapplicationrunning*/

/*Testifusercodeisprogrammedstartingfromaddress"APPLICATION_ADDRESS"*/

if(((*(__IOuint32_t*)APPLICATION_ADDRESS)&0x2FFE0000)==0x20000000)

{

/*Jumptouserapplication*/

JumpAddress=*(__IOuint32_t*)(APPLICATION_ADDRESS+4);

Jump_To_Application=(pFunction)JumpAddress;

/*Initializeuserapplication'sStackPointer*/

__set_MSP(*(__IOuint32_t*)APPLICATION_ADDRESS);

/*Jumptoapplication*/

Jump_To_Application();

}

程序更新完以后执行以上跳转函数即可执行更新的APP代码。关于如何通过IAP将代码将APP代码(bin文件)传到单片机Flash,可以通过串口分包传输。因为F0Flash是1K为一页所以这里我用的是1K缓存,即接收串口1K的数据量就执行一次Flash写操作,传输到最后不满1K,填写0XFF按照1K数据写。写Flash代码如下


//存满1K的数据写入Flash

if(g_nFlashDataLen==FLASH_PAGE_SIZE)

{

#if(DEBUGIAP==1)

USART1_SendBytesProc(g_nFlashBuf,FLASH_PAGE_SIZE);

g_nSysCommTimerCtrl=0;

while(g_nSysCommTimerCtrl<200);//5ms

#else

//擦除待写的Flash

FLASH_If_Erase(g_nFlashAddr);

loop1:

//写入Flash

nFlashData=(u32)g_nFlashBuf;

if(FLASH_If_Write(&g_nFlashAddr,(u32*)nFlashData,(u16)g_nFlashDataLen/4)!=0)

{

if(nCount++<5)

gotoloop1;

}

//地址增加

g_nFlashAddr+=FLASH_PAGE_SIZE;

#endif

//清除g_nFlashDataLen计数

g_nFlashDataLen=0;

}

关于IAP如何接收串口的数据,我用的是正点原子的XCOM V2.0串口调试助手通过协议传输每次传输128字节数据,执行的IAP串口数据接收。具体操作可在原子论坛搜索。再此留下参考链接:http://www.openedv.com/thread-40143-1-1.html http://www.openedv.com/thread-22994-1-1.html


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

最近本人在学习ARM7的远程升级,在这里将自己的学习过程与大家分享,有错误的地方还请大家指出便于改正! ISP(In-System Programming)即“在系统可编程”,指电路板...

关键字: iap isp

写在前面:三个周之前,我突然想写一个远程升级的程序。那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知。我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题。三个

关键字: iap keil mdk 远程升级

STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下IS...

关键字: eeprom iap stc单片机

  之前说了stm32的iap编程,今天天气真好,顺手就来说说lpc1788的iap编程(没看前面的请查看stm笔记下的内容)  首先是flash的算法,lpc1768并没有寄存器来让我们操作flash,他内置了iap的...

关键字: iap lpc1768 上位机

本文主要总结STM32F030_I2C的相关功能与源代码分享。I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广...

关键字: i2c stm32f030 配置说明

搞了一天才发现 在MDK设置选项中有个"linker"选项卡 ,需要在Project->Options->Linker中将UseMemoryLayoutfromTargetDialog前面...

关键字: iap STM32 在线更新程序

所谓IAP其实就相当于一个小小的bootloader 用来更新程序的很多产品基本都是程序做好后就直接在产线烧录一次就OK了,但是,但是BUG有时候是无可避免的,经常有产品装好后又要重新拆外壳 取下板子重新上烧录架烧的惨痛

关键字: iap STM32 使用关键点

最近涉及到STM32F0XX的IAP,找了很多相关资料,感觉不是特别清楚,所以综合一些资料分享一下。刚开始做的时候以为很简单,在程序中写了个跳转函数(跳转到System Memory,并运行MCU自己的Bootloade...

关键字: cortex-m0 iap stm32f0xx

bootloader设置:static void check_boot_mode(void){uint32_t JumpAddress;void(*Jump_To_Application)(void);if (((*((...

关键字: stm32f030 代码升级

1 前言客户反馈在批量生产阶段,发现部分产品的MCU的RTC在低温(0℃)下工作不正常,但是在常温下又是正常的,且其他正常的MCU的RTC在常温与低温下都是正常的。2 问题跟进与分析通过与客户邮件沟通,了解到客户使用的

关键字: rtc stm32f030 低温
关闭