update.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #include "includes.h"
  2. #include "update.h"
  3. #include "Flash.h"
  4. typedef void (*otafun)(void); //定义一个函数类型的参数.
  5. otafun jump2app;
  6. //擦除app
  7. int erase_app(u8 app_num)
  8. {
  9. u32 FlashAddress = 0;
  10. int Size = OTA_UPDATE_APP_FLASH_SIZE;
  11. switch(app_num) {
  12. case UPDATE_ENUM_APP1:
  13. FlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
  14. break;
  15. case UPDATE_ENUM_APP2:
  16. FlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
  17. break;
  18. case UPDATE_ENUM_APP3:
  19. FlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
  20. break;
  21. default:
  22. return -1;
  23. }
  24. Flash_RangeErase(FlashAddress, Size);
  25. return 0;
  26. }
  27. //复制,
  28. int copy_app(u8 from, u8 to)
  29. {
  30. u32 FromFlashAddress = 0;
  31. int Size = OTA_UPDATE_APP_FLASH_SIZE;
  32. u32 ToFlashAddress = 0;
  33. u8 buffer[1024];
  34. switch(from) {
  35. case UPDATE_ENUM_APP1:
  36. FromFlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
  37. break;
  38. case UPDATE_ENUM_APP2:
  39. FromFlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
  40. break;
  41. case UPDATE_ENUM_APP3:
  42. FromFlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
  43. break;
  44. default:
  45. return -1;
  46. }
  47. switch(to) {
  48. case UPDATE_ENUM_APP1:
  49. ToFlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
  50. break;
  51. case UPDATE_ENUM_APP2:
  52. ToFlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
  53. break;
  54. case UPDATE_ENUM_APP3:
  55. ToFlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
  56. break;
  57. default:
  58. return -1;
  59. }
  60. Size = Flash_DatalenRead(FromFlashAddress,OTA_UPDATE_APP_FLASH_SIZE);
  61. while(Size > 0) {
  62. Flash_BufferRead(FromFlashAddress, buffer, 1024);
  63. Flash_BufferWrite(ToFlashAddress, (u32 *)buffer, 1024);
  64. FromFlashAddress += 1024;
  65. ToFlashAddress += 1024;
  66. Size -= 1024;
  67. }
  68. return -1;
  69. }
  70. int read_app(u8 app_num)
  71. {
  72. u32 FlashAddress = 0;
  73. int Size = OTA_UPDATE_APP_FLASH_SIZE;
  74. u8 buffer[1024];
  75. switch(app_num) {
  76. case UPDATE_ENUM_APP1:
  77. FlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
  78. break;
  79. case UPDATE_ENUM_APP2:
  80. FlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
  81. break;
  82. case UPDATE_ENUM_APP3:
  83. FlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
  84. break;
  85. default:
  86. return -1;
  87. }
  88. while(Size > 0) {
  89. Flash_BufferRead(FlashAddress, buffer, 1024);
  90. Size -= 1024;
  91. // data_dump("Flash Data READ", buffer, 1024);
  92. }
  93. return 0;
  94. }
  95. //复制,
  96. int reset_app(u8 app_num, u8 value)
  97. {
  98. u32 FlashAddress = 0;
  99. int Size = OTA_UPDATE_APP_FLASH_SIZE;
  100. u8 buffer[1024];
  101. memset(buffer, value, 1024);
  102. switch(app_num) {
  103. case UPDATE_ENUM_APP1:
  104. FlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
  105. break;
  106. case UPDATE_ENUM_APP2:
  107. FlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
  108. break;
  109. case UPDATE_ENUM_APP3:
  110. FlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
  111. break;
  112. default:
  113. return -1;
  114. }
  115. while(Size > 0) {
  116. Flash_BufferWrite(FlashAddress, (u32 *)buffer, 1024);
  117. FlashAddress += 1024;
  118. Size -= 1024;
  119. }
  120. return 0;
  121. }
  122. //设置栈顶地址
  123. __asm void MSR_MSP(u32 addr)
  124. {
  125. MSR MSP, r0 //set Main Stack value
  126. MSR PSP, r0 //set Main Stack value
  127. BX r14
  128. }
  129. typedef void (*usercode)(void);
  130. usercode EnterApp;
  131. ////运行app1
  132. //u32 run_app1(void)
  133. //{
  134. // u32 appxaddr = OTA_UPDATE_APP1_FLASH_START_ADDR;
  135. // if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) {//检查栈顶地址是否合法.
  136. // printf("appxaddr:%08x",((*(vu32*)appxaddr)&0x2FFE0000));
  137. //// __ASM volatile ("cpsid i");
  138. //// EnterApp = (usercode)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
  139. //// __set_PSP(*(vu32*)appxaddr);
  140. //// __set_CONTROL(0);
  141. //// __set_MSP(*(vu32*)appxaddr);
  142. //// EnterApp(); //跳转到APP.
  143. //// while(1);
  144. // } else {
  145. // printf("addr 0x%x is not legal \r\n", (*(vu32*)appxaddr));
  146. // }
  147. //
  148. // return 0;
  149. //}
  150. //运行app1
  151. uint32_t run_app1(void)
  152. {
  153. // IRQn_Type irq;
  154. uint32_t appxaddr=OTA_UPDATE_APP1_FLASH_START_ADDR;
  155. printf("jump to 0x%08X.\r\n",appxaddr);
  156. if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
  157. {
  158. // for (irq = SysTick_IRQn; irq <= DMA2_Channel4_5_IRQn; irq++)
  159. // {
  160. // NVIC_DisableIRQ(irq);
  161. // NVIC_ClearPendingIRQ(irq);
  162. // }
  163. // __disable_irq();
  164. INTX_DISABLE();
  165. //TIM3_Int_Deinit();
  166. jump2app=(otafun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
  167. MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  168. jump2app(); //跳转到APP.
  169. while(1);
  170. }
  171. else
  172. {
  173. printf("栈顶地址不合法\r\n");
  174. }
  175. return 0;
  176. }