update.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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. case UPDATE_ENUM_PT:
  22. FlashAddress = OTA_UPDATE_PT_FLASH_START_ADDR;
  23. Size = OTA_UPDATE_PT_FLASH_SIZE;
  24. break;
  25. default:
  26. return -1;
  27. }
  28. Flash_RangeErase(FlashAddress, Size);
  29. return 0;
  30. }
  31. //复制,
  32. int copy_app(u8 from, u8 to)
  33. {
  34. u32 FromFlashAddress = 0;
  35. int Size = OTA_UPDATE_APP_FLASH_SIZE;
  36. int Size_p = OTA_UPDATE_APP_FLASH_SIZE;
  37. u32 ToFlashAddress = 0;
  38. u8 buffer[1024];
  39. switch(from) {
  40. case UPDATE_ENUM_APP1:
  41. FromFlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
  42. break;
  43. case UPDATE_ENUM_APP2:
  44. FromFlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
  45. break;
  46. case UPDATE_ENUM_APP3:
  47. FromFlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
  48. break;
  49. case UPDATE_ENUM_PT:
  50. FromFlashAddress = OTA_UPDATE_PT_FLASH_START_ADDR;
  51. Size_p = OTA_UPDATE_PT_FLASH_SIZE;
  52. break;
  53. default:
  54. return -1;
  55. }
  56. switch(to) {
  57. case UPDATE_ENUM_APP1:
  58. ToFlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
  59. break;
  60. case UPDATE_ENUM_APP2:
  61. ToFlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
  62. break;
  63. case UPDATE_ENUM_APP3:
  64. ToFlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
  65. break;
  66. case UPDATE_ENUM_PT:
  67. ToFlashAddress = OTA_UPDATE_PT_FLASH_START_ADDR;
  68. Size_p = OTA_UPDATE_PT_FLASH_SIZE;
  69. break;
  70. default:
  71. return -1;
  72. }
  73. Size = Flash_DatalenRead(FromFlashAddress,Size_p);
  74. while(Size > 0) {
  75. Flash_BufferRead(FromFlashAddress, buffer, 1024);
  76. Flash_BufferWrite(ToFlashAddress, (u32 *)buffer, 1024);
  77. FromFlashAddress += 1024;
  78. ToFlashAddress += 1024;
  79. Size -= 1024;
  80. }
  81. return -1;
  82. }
  83. int read_app(u8 app_num)
  84. {
  85. u32 FlashAddress = 0;
  86. int Size = OTA_UPDATE_APP_FLASH_SIZE;
  87. u8 buffer[1024];
  88. switch(app_num) {
  89. case UPDATE_ENUM_APP1:
  90. FlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
  91. break;
  92. case UPDATE_ENUM_APP2:
  93. FlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
  94. break;
  95. case UPDATE_ENUM_APP3:
  96. FlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
  97. break;
  98. default:
  99. return -1;
  100. }
  101. while(Size > 0) {
  102. Flash_BufferRead(FlashAddress, buffer, 1024);
  103. Size -= 1024;
  104. // data_dump("Flash Data READ", buffer, 1024);
  105. }
  106. return 0;
  107. }
  108. //复制,
  109. int reset_app(u8 app_num, u8 value)
  110. {
  111. u32 FlashAddress = 0;
  112. int Size = OTA_UPDATE_APP_FLASH_SIZE;
  113. u8 buffer[1024];
  114. memset(buffer, value, 1024);
  115. switch(app_num) {
  116. case UPDATE_ENUM_APP1:
  117. FlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
  118. break;
  119. case UPDATE_ENUM_APP2:
  120. FlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
  121. break;
  122. case UPDATE_ENUM_APP3:
  123. FlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
  124. break;
  125. default:
  126. return -1;
  127. }
  128. while(Size > 0) {
  129. Flash_BufferWrite(FlashAddress, (u32 *)buffer, 1024);
  130. FlashAddress += 1024;
  131. Size -= 1024;
  132. }
  133. return 0;
  134. }
  135. //设置栈顶地址
  136. __asm void MSR_MSP(u32 addr)
  137. {
  138. MSR MSP, r0 //set Main Stack value
  139. MSR PSP, r0 //set Main Stack value
  140. BX r14
  141. }
  142. //THUMB指令不支持汇编内联
  143. //采用如下方法实现执行汇编指令WFI
  144. void WFI_SET(void)
  145. {
  146. __ASM volatile("wfi");
  147. }
  148. //关闭所有中断
  149. void INTX_DISABLE(void)
  150. {
  151. __ASM volatile("cpsid i");
  152. }
  153. //开启所有中断
  154. void INTX_ENABLE(void)
  155. {
  156. __ASM volatile("cpsie i");
  157. }
  158. //关中断
  159. void nvic_disable(void)
  160. {
  161. IRQn_Type irq;
  162. __disable_irq();
  163. for (irq = RTC_IRQn; irq <= DMA1_Channel3_Channel4_IRQn; irq++)
  164. {
  165. NVIC_DisableIRQ(irq);
  166. NVIC_ClearPendingIRQ(irq);
  167. }
  168. }
  169. typedef void (*usercode)(void);
  170. usercode EnterApp;
  171. //运行app1
  172. uint32_t run_app1(void)
  173. {
  174. uint32_t appxaddr=OTA_UPDATE_APP1_FLASH_START_ADDR;//OTA_UPDATE_APP1_FLASH_START_ADDR;
  175. printf("jump to 0x%08X.\r\n",appxaddr);
  176. if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
  177. {
  178. nvic_disable();
  179. INTX_DISABLE();
  180. jump2app=(otafun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
  181. MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  182. gpio_deinit(GPIOB);
  183. gpio_deinit(GPIOC);
  184. jump2app(); //跳转到APP.
  185. while(1);
  186. }
  187. else
  188. {
  189. printf("栈顶地址不合法\r\n");
  190. }
  191. return 0;
  192. }