boot.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "gd32f30x.h"
  2. #include "boot.h"
  3. #include "gd32_flash.h"
  4. #include "main.h"
  5. #include <string.h>
  6. void BootLoader_Clear(void);
  7. load_a load_A;
  8. static void JumpToApp(void);
  9. #define FMC_READ(addrx) (*(volatile uint32_t *)(uint32_t)(addrx))
  10. void BootLoader_Brance(uint32_t app_byte)
  11. {
  12. GD32_EraseFlash(GD32_A_START_PAGE,GD32_A_PAGE_NUM);//擦除A区原有程序
  13. for(uint8_t i=0;i<app_byte/4;i++)
  14. {
  15. uint32_t app_programmer=0;
  16. }
  17. JumpToApp();
  18. }
  19. static void JumpToApp(void)
  20. {
  21. uint32_t i=0;
  22. void (*SysMemBootJump)(void); /* 声明一个函数指针 */
  23. __IO uint32_t BootAddr =GD32_A_SADDR;
  24. rcu_deinit();
  25. /* 关闭全局中断 */
  26. __set_PRIMASK(1) ;
  27. /* 关闭滴答定时器,复位到默认值 */
  28. SysTick->CTRL = 0;
  29. SysTick->LOAD = 0;
  30. SysTick->VAL = 0;
  31. /* 关闭所有中断,清除所有中断挂起标志 */
  32. for (i = 0; i < 8; i++)
  33. {
  34. NVIC->ICER[i]=0xFFFFFFFF;
  35. NVIC->ICPR[i]=0xFFFFFFFF;
  36. }
  37. /* 使能全局中断 */
  38. __set_PRIMASK(0) ;
  39. /* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
  40. SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
  41. /* 设置主堆栈指针 */
  42. __set_MSP(*(uint32_t *)BootAddr);
  43. /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
  44. __set_CONTROL(0);
  45. /* 跳转到系统BootLoader */
  46. SysMemBootJump();
  47. /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
  48. while (1)
  49. {
  50. }
  51. }