boot.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "gd32f10x.h"
  2. #include "boot.h"
  3. #include "main.h"
  4. #include "delay.h"
  5. #include "fmc.h"
  6. #include "w25q32.h"
  7. #include <stdio.h>
  8. #include "ota_message.h"
  9. #define APP_PROGRAMMER_BLOCK 2 //程序在W25Q32中存放的位置
  10. load_a load_A;
  11. //进入bootloader更新
  12. void BootLoader_Brance(uint32_t app_byte)
  13. {
  14. GD32_EraseFlash(GD32_A_START_PAGE,GD32_A_PAGE_NUM);//擦除A区原有程序
  15. for(uint8_t i=0;i<app_byte/1024;i++)
  16. {
  17. task_fwdgt_reload();
  18. uint8_t app_programmer[1024];
  19. memset(app_programmer,0,1024);
  20. uint32_t addr=APP_PROGRAMMER_BLOCK*64*1024+i*1024; //其在w25q32中的地址
  21. W25Q32_Read(app_programmer,addr,1024);
  22. GD32_WriteFlash(GD32_A_SADDR+i*1024,(uint32_t *)&app_programmer,1024); //将读出的数据按页写入数据
  23. }
  24. //将不满1024数据单独写入
  25. if(app_byte%1024!=0)
  26. {
  27. uint32_t startAddress=(app_byte/1024)*1024;
  28. uint8_t app_programmer[1024];
  29. uint32_t addr=APP_PROGRAMMER_BLOCK*64*1024+(app_byte/1024)*1024; //其在w25q32中的地址
  30. memset(app_programmer,0,1024);
  31. W25Q32_Read(app_programmer,addr,app_byte%1024);
  32. GD32_WriteFlash(GD32_A_SADDR+(app_byte/1024)*1024,(uint32_t *)&app_programmer,app_byte%1024);
  33. }
  34. clear_ota_message_config_block();
  35. LOAD_A(GD32_A_SADDR);
  36. }
  37. /*-------------------------------------------------*/
  38. /*函数名:设置SP */
  39. /*参 数:addr:栈顶指针初始值 */
  40. /*返回值:无 */
  41. /*-------------------------------------------------*/
  42. __asm void MSR_SP(uint32_t addr)
  43. {
  44. MSR MSP, r0
  45. BX r14
  46. }
  47. /*-------------------------------------------------*/
  48. /*函数名:跳转到A区 */
  49. /*参 数:addr:A区的起始地址 */
  50. /*返回值:无 */
  51. /*-------------------------------------------------*/
  52. void LOAD_A(uint32_t addr)
  53. {
  54. if((*(uint32_t *)addr>=0x20000000)&&(*(uint32_t *)addr<=0x20017FFF)){
  55. MSR_SP(*(uint32_t *)addr);
  56. load_A = (load_a)*(uint32_t *)(addr+4);
  57. BootLoader_Clear();
  58. load_A();
  59. }else ;
  60. }
  61. /*-------------------------------------------------*/
  62. /*函数名:清除B区使用的外设 */
  63. /*参 数:无 */
  64. /*返回值:无 */
  65. /*-------------------------------------------------*/
  66. void BootLoader_Clear(void)
  67. {
  68. usart_disable(USART0);
  69. dma_channel_disable(DMA0, DMA_CH4);
  70. dma_deinit(DMA0, DMA_CH4);
  71. gpio_deinit(GPIOA);
  72. gpio_deinit(GPIOB);
  73. }