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.半周期装备不能与运用了预分频器的AHB一同运用,时钟体系应该等于HCLK时钟。该特性只能用在时钟频率为8MHz或低于8MHz时,能够直接运用的内部RC振荡器(HSI),或许是主振荡器(HSE),但不能用PLL。 3.当AHB预分频系数不为1时,有必要置预取缓冲区处于敞开状况。 4.只需在体系时钟(SYSCLK)小于24MHz而且没有翻开AHB的预分频器(即HCLK有必要等于SYSHCLK)时,才干履行预取缓冲器的翻开和封闭操作。一般来说,在初始化过程中履行预取缓冲器的翻开和封闭操作,这时微操控器的时钟由8MHz的内部RC振荡器(HSI)供给。 5.运用DMA:DMA在DCode总线上拜访闪存存储器,它的优先级比ICode上的取指高。DMA在每次传送完结后具有一个空余的周期。有些指令能够和DMA传输一同履行。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在ST官网下载IAP进程,链接http://www.st.com/stonline/products/support/micro/files/an2557.zip 移植进程到自己的开发板上 首要修正main.c中的串口初始化函数IAP_Init(),根据需求再增加一个开发板端口初始化的函数,修正int main()函数里进入IAP的条件 运用程序的修正首要是四点 1、 options for target–>将ROM1修正成0x8002000 2、 option for target–>linker–>勾选use memory layout from target dialog 3、 options for target –>user 在run user programs after build/rebuild下给run#1和run#2打勾,并别离填上I:\embedded\Keil Mdk\ARM\BIN40\fromelf.exe –bin -o my.bin output\release.axf和I:\embedded\Keil Mdk\ARM\BIN40\fromelf.exe -z output\release.axf,留意地址要正确,首要意图是调用keil自带的hex转东西将keil编译程序后生成的release.axf转成bin文件 4、 在程序中重定向向量表NVIC_SetVectorTable(NVIC_VectTab_FLASH+0x2000, 0x2000); 下载程序办法: 1、 现在IAP的引导程序,也便是移植官网的那个程序。 2、 运用开端—一切程序–附件—通讯—超级终端进行下载,超级终端装备为无数据流操控,别的波特率、数据位等要与例程的串口装备要对应,输入1使开发板进入等候下载的形式,点击超级终端的传送à传送文件,挑选文件,协议运用例程的Ymodern,下载完后输入2即可运转运用程序 |