iap.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "stmflash.h"
  5. #include "iap.h"
  6. //////////////////////////////////////////////////////////////////////////////////
  7. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  8. //ALIENTEK战舰STM32开发板
  9. //IAP 代码
  10. //正点原子@ALIENTEK
  11. //技术论坛:www.openedv.com
  12. //修改日期:2012/9/24
  13. //版本:V1.0
  14. //版权所有,盗版必究。
  15. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  16. //All rights reserved
  17. //////////////////////////////////////////////////////////////////////////////////
  18. iapfun jump2app;
  19. u16 iapbuf[1024];
  20. //appxaddr:应用程序的起始地址
  21. //appbuf:应用程序CODE.
  22. //appsize:应用程序大小(字节).
  23. void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
  24. {
  25. u16 t;
  26. u16 i=0;
  27. u16 temp;
  28. u32 fwaddr=appxaddr;//当前写入的地址
  29. u8 *dfu=appbuf;
  30. for(t=0;t<appsize;t+=2)
  31. {
  32. temp=(u16)dfu[1]<<8;
  33. temp+=(u16)dfu[0];
  34. dfu+=2;//偏移2个字节
  35. iapbuf[i++]=temp;
  36. if(i==1024)
  37. {
  38. i=0;
  39. STMFLASH_Write(fwaddr,iapbuf,1024);
  40. fwaddr+=2048;//偏移2048 16=2*8.所以要乘以2.
  41. }
  42. }
  43. if(i)STMFLASH_Write(fwaddr,iapbuf,i);//将最后的一些内容字节写进去.
  44. }
  45. //跳转到应用程序段
  46. //appxaddr:用户代码起始地址.
  47. void iap_load_app(u32 appxaddr)
  48. {
  49. if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
  50. {
  51. jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
  52. MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  53. jump2app(); //跳转到APP.
  54. }
  55. }