微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32--简单的IAP操作

STM32--简单的IAP操作

时间:11-17 来源:互联网 点击:
STM32支持在应用中编程,也就是所谓的IAP,这对产品的在线升级带来了很大方便。

在线升级的原理简介如下:

单片机的FLASH中有两段代码,一段是IAP代码,另一段就是用户的应用程序即APP代码,IAP代码放在单片机复位时的起始地址,而APP代码则放在IAP后面的地址,上电时CPU首先执行IAP代码,再通过IAP代码跳转到APP代码开始执行。

在IAP代码执行期间,通过检测某一个事件(如IO电平)来判断是否对APP代码进行更新,如果该事件无效,则不更新,直接跳转到APP代码执行;如果该事件有效,则更新APP代码,而更新的文件则从外部磁盘通过串口或USB写入FALSH应用程序空间。

流程图如下:

当然,这只是一种最简单的方式,它还可以是当APP代码在执行时,将PC指针跳转到IAP来更新自已。

实现的大致原理都是一致的,只是方式不同罢了。

值得注意的是:

IAP跳转的地址必须APP的起始地址一致,相应的中断向量表也要修改,否则APP将不能正确的运行。

在附件我整理的代码中,串口方式的IAP跳转的地址为0x8002000,因此应用程序的起始地址也应为0x8002000,在KEIL设置下如下图:

还有中断向量表的起始地址也应改为0x8002000:

/*SettheVectorTablebaseaddressat0x08002000*/

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);//NVIC_VectTab_FLASH=0x08000000

只有以上两处设置正确才能确保APP能正确的运行。

USB方式的IAP跳转的地址为0x8004000,设置方法同上。

升级文件传输方式

串口方式的IAP在超级终端下用Ymode协议,波特率115200;文件为.BIN格式。

USB方式的IAP用DfuSeUSBDeviceFirmwareUpgrade软件传送,文件为dfu格式。

总的来说,IAP带给我的体验还是非常愉快的!

所谓IAP,就是在系统编程,也就是说,CPU在运行的
过程中,可以对FLASH进行刷写.基本的应用可用于写入加密字或者一些存储信息等,高级点
的应用则是用于某些使用的设备上,系统查入SD卡后自动更新程序等.

在stm32f10x_conf.h中开放#include"stm32f10x_flash.h"

#include"STM32Lib\\stm32f10x.h"
#include"hal.h"

#defineFLASH_ADR0x08008000//要写入数据的地址
#defineFLASH_DATA0x8a8a8a8a//要写入的数据

intmain(void)
{
u32tmp;
ChipHalInit();//片内硬件初始化
ChipOutHalInit();//片外硬件初始化
//判断此FLASH是否为空白
tmp=*(vu32*)(FLASH_ADR);

/*将地址(FLASH_ADR)强制转化为(vu32*)型指针求内容*然后再将值赋给tmp。还是比较考练C语言的,老师上课可从没这么讲过。*/
if(tmp==0xffffffff)
{
FLASH_Unlock();
FLASH_ProgramWord(FLASH_ADR,FLASH_DATA);
FLASH_Lock();
USART1_Puts("要写入的地址为空,已经写入认证数据\r\n");//在指定地址编写一个字
}
elseif(tmp==FLASH_DATA)
{
USART1_Puts("地址数据与认证数据符合\r\n");
FLASH_Unlock();
FLASH_ErasePage(FLASH_ADR);

/*和众多FLASH存储器的特性类似,STM32内的FLASH数据只能由1变成0,如果要由0
变成1,则需要调用刷除函数,把一个页都刷除掉.如果不擦也能写但是只能写上0*/
FLASH_ProgramWord(FLASH_ADR,0x11223344);
FLASH_Lock();
USART1_Puts("写入了0x11223344\r\n");
}
else
{
USART1_Puts("地址上的数据与认证的数据不符合,有可能是写入失败或者是要写入的地址非空\r\n");
FLASH_Unlock();
FLASH_ErasePage(FLASH_ADR);
FLASH_Lock();
USART1_Puts("已经刷除了要写入的地址\r\n");
}
while(1);
}

系统通过串口输出写FLASH的状情况,在第一次运行的时候,一般情况,0x08008000处的
FLASH为空,于是系统就往空的FLASH上写入一个数据0x8a8a8a8a.并提示已经写入.此时用
户只要再次复位一下系统,则由于之前已经写入并为系统所读取,则这次串口就会输出已经写
入了数据的信息.
注意写FLASH之前需要调用解锁函数,写入后应调用锁定函数.

闪存的指令和数据访问是通过AHB总线完成的。预取模块是用于通过ICode总线读取指令的。仲裁是作用在闪存接口,并且DCode总线上的数据访问优先。

读访问可以有以下配置选项:

●等待时间:可以随时更改的用于读取操作的等待状态的数量。

●预取缓冲区(2个64位):在每一次复位以后被自动打开,由于每个缓冲区的大小(64位)与闪存的带宽相同,因此只通过需一次读闪存的操作即可更新整个缓冲区的内容。由于预取缓冲区的存在,CPU可以工作在更高的主频。CPU每次取指最多为32位的字,取一条指令时,下一条指令已经在缓冲区中等待。

●半周期:用于功耗优化。

注:1.这些选项应与闪存存储器的访问时间一起使用。等待周期体现了系统时钟(SYSCLK)频率与闪存访问时间的关系:0等待周期,当0

2.半周期配置不

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

网站地图

Top