Advertisement
petrdynin

Activation original bootloader CH32V003

Feb 25th, 2025 (edited)
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.21 KB | None | 0 0
  1. #define  BOOT_LED_SWITCH_TO_BOOT
  2. //#define  BOOT_LED_AFTER_UPLOAD
  3.  
  4. #ifdef BOOT_LED_SWITCH_TO_BOOT
  5. // Программа моргает светодиодом подключенным к PD2 5 сек, затем переключатся на апгрейд через загрузчик
  6.  
  7. uint32_t counter;
  8. //*************************************************************************************************
  9. void SysTick_Init(void){
  10.    SysTick->SR = 0;
  11.    SysTick->CMP = SystemCoreClock-1;
  12.    SysTick->CNT = 0;
  13.    SysTick->CTLR = 0x0F;
  14.    NVIC_EnableIRQ(SysTicK_IRQn);
  15. }
  16. //*************************************************************************************************
  17. void __attribute__((interrupt("WCH-Interrupt-fast")))SysTick_Handler(void){
  18.       SysTick->SR = 0;
  19.       GPIOD->OUTDR ^= GPIO_OUTDR_ODR2;
  20.       counter++;
  21. }
  22. //*************************************************************************************************
  23. void Switch_on_Boot(void){
  24.     // Unlock the ability to write to the MODE flag of STATR register.
  25.     FLASH->BOOT_MODEKEYR = 0x45670123; // KEY1
  26.     FLASH->BOOT_MODEKEYR = 0xCDEF89AB; // KEY2
  27.     // Set to run BOOT flash at next reset (MODE = 1).
  28.     FLASH->STATR = 0x4000;
  29.     // Clear all reset status flags (RMVF = 1).
  30.     RCC->RSTSCKR |= 0x1000000;
  31.     // Perform software reset (KEYCODE = 0xBEEF, RESETSYS = 1).
  32.     PFIC->CFGR = 0xBEEF0080;
  33. }
  34. //*************************************************************************************************
  35. void GPIO_Initialize(void){
  36.     RCC->APB2PCENR |= RCC_APB2Periph_GPIOD;
  37.     //PD2 (GPIO_Mode_OUT_PP)
  38.     GPIOD->CFGLR  = (GPIOD->CFGLR & ~(GPIO_CFGLR_CNF2_0 | GPIO_CFGLR_CNF2_1));
  39.     GPIOD->CFGLR |= GPIO_CFGLR_MODE2;
  40.     GPIOD->BSHR = GPIO_BSHR_BS2;
  41. }
  42. //*************************************************************************************************
  43. void main (void){
  44.     GPIO_Initialize();
  45.     SysTick_Init();
  46.     while(1){
  47.        if(counter > 10){
  48.            Switch_on_Boot();
  49.           }
  50.     }
  51. }
  52. #endif
  53.  
  54. #ifdef BOOT_LED_AFTER_UPLOAD
  55. // Программа быстро моргает светодиодом подключенным к PD2 в подтверждение того, что произошло обновление прошивки
  56.  
  57. uint32_t counter;
  58.  
  59. void SysTick_Init(void){
  60.    SysTick->SR = 0;
  61.    SysTick->CMP = SystemCoreClock/20-1;
  62.    SysTick->CNT = 0;
  63.    SysTick->CTLR = 0x0F;
  64.    NVIC_EnableIRQ(SysTicK_IRQn);
  65. }
  66. //*************************************************************************************************
  67. void GPIO_Initialize(void){
  68.     RCC->APB2PCENR |= RCC_APB2Periph_GPIOD;
  69.     //PD2 (GPIO_Mode_OUT_PP)
  70.     GPIOD->CFGLR  = (GPIOD->CFGLR & ~(GPIO_CFGLR_CNF2_0 | GPIO_CFGLR_CNF2_1));
  71.     GPIOD->CFGLR |= GPIO_CFGLR_MODE2;
  72.     GPIOD->BSHR = GPIO_BSHR_BS2;
  73. }
  74. //*************************************************************************************************
  75. void __attribute__((interrupt("WCH-Interrupt-fast")))SysTick_Handler(void){
  76.       SysTick->SR = 0;
  77.       GPIOD->OUTDR ^= GPIO_OUTDR_ODR2;
  78.       counter++;
  79. }
  80. //*************************************************************************************************
  81. void main (void){
  82.     GPIO_Initialize();
  83.     SysTick_Init();
  84.     while(1);
  85. }
  86. #endif
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement