基于IAP和Keil MDK的远程升级设计
MD_SUCCESS,SRC_ADDR_ERROR,DST_ADDR_ERROR, SRC_ADDR_NOT_MAPPED,DST_ADDR_NOT_MAPPED,COUNT_ERROR,BUSY,未选择扇区 ********************************************************************/ void RamToFlash(uint32 dst, uint32 src, uint32 no) { paramin[0] = IAP_RAMTOFLASH; // 设置命令字 paramin[1] = dst; // 设置参数 paramin[2] = src; paramin[3] = no; paramin[4] = Fosc/1000; // 当不使用PLL功能时,Fcclk=Fosc iap_entry(paramin, paramout); // 调用IAP服务程序 } 代码3-4 编程扇区 3.3.1.5 比较数据 通过这个函数,可以检查写入Flash中的数据和RAM中的是否相同。 注意源地址、目标地址和字节数必须是4的倍数。可使用Keil MDK提供的关键字__align(n) 来指定n字节对齐。 /******************************************************************** * 名称:Compare() * 功能:校验数据,命令代码56。 * 入口参数:dst 目标地址,即RAM/FLASH起始地址。地址必须字对齐 * src 源地址,即FLASH/RAM地址。地址必须字对齐 * no 复制字节个数,必须能被4整除 * 出口参数:IAP返回值(paramout缓冲区) CMD_SUCCESS,COMPARE_ERROR,ADDR_ERROR ******************************************************************/ void Compare(uint32 dst, uint32 src, uint32 no) { paramin[0] = IAP_COMPARE; // 设置命令字 paramin[1] = dst; // 设置参数 paramin[2] = src; paramin[3] = no; iap_entry(paramin, paramout); // 调用IAP服务程序 代码3-5 比较数据 3.3.2 IAP编程期间的中断管理 LPC2114片上Flash在擦除/编程期间绝不可被中断打断。但Bootloader中定时和串口接收又使用了中断,因此必须在擦除/编程之前禁止总中断,待操作完成后再使能总中断。Bootloader运行在用户模式下,不具有禁止/使能中断的权力,所以在本设计中使用软中断禁止/使能总中断。Keil MDK提供了关键字__svc来触发软中断。 软中断函数声明: __svc(0x00) void EnableIrq(void); //使能中断,软中断0 __svc(0x01) void DisableIrq(void); //禁止中断,软中断1 软中断函数代码: /* ********************************************************************* * 功 能:禁止中断 * 描 述:利用软中断实现在用户模式下调用函数关中断 *********************************************************************/ void DisableIrqFunc(void) { int temp; __asm { MRS temp,SPSR ORR temp,temp,#0x80 MSR SPSR_c,temp } } /* ******************************************************************** * 功 能:使能中断 * 描 述:利用软中断实现在用户模式下调用函数开中断 ******************************************************************** */ void EnableIrqFunc(void) { int temp; __asm { MRS temp,SPSR BIC temp,temp,#0x80 MSR SPSR_c,temp } } 代码3-6 禁止/使能总中断 更改启动代码,挂接软中断入口: ;软中断入口 EXPORT SWI_Handler extern EnableIrq1 extern DisableIrq1 SWI_Handler STMFD SP!, {R0,R12,LR} ;入栈 LDR R0, [LR,#-4] ;取软中断指令,软中断号就包含其中 BIC R0,R0,#0xFF000000 CMP R0,#0 ;判断是否软中断0 BLEQ EnableIrqFunc BLNE DisableIrqFunc LDMFD SP!,{R0,R12,PC}^ 代码3-7 挂接软中断入口 在程序中,如果想禁止中断,只需使用DisableIrq();若是能中断,只需使用EnableIrq()。 3.3.3 使用分散加载机制精确定位入口地址 应用程序接收到升级指令后,会跳转到0x00000400处执行Bootloader升级程序。因此Bootloader程序的入口地址必须精确定位到0x00000400处。这可以使用Keil MDK提供的分散加载机制来完成。 分散加载代码见代码3-8. ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***
- MSP43F149系列单片机的IAP功能设计(09-08)
- 基于IAP的STM32程序更新技术(01-23)
- STM32 IAP 无法运行用户程序的解决方法(12-03)
- STC单片机 EEPROM/IAP 功能测试程序演示(12-01)
- 9G-STM32 简易BOOT及XMODEM串口IAP移植过程简介(11-29)
- STC IAP片子的仿真功能(11-28)