Ignore:
Timestamp:
Jan 20, 2026, 3:00:17 PM (2 weeks ago)
Author:
f.jahn
Message:

System Bootloader can be activated with 5458 command.

Location:
trunk/fw_g473rct/Core/Src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/fw_g473rct/Core/Src/main.c

    r38 r44  
    6363/* Private define ------------------------------------------------------------*/
    6464/* USER CODE BEGIN PD */
     65
    6566#define MAX_OVERCURRENT_RETRYS  3
     67
    6668/* USER CODE END PD */
    6769
     
    7476
    7577/* USER CODE BEGIN PV */
     78
     79uint32_t bootLoaderMark __attribute__((section(".no_init")));
     80
    7681modbus_t modbusData __attribute__((section(".RAM1")));
    7782
     
    98103void LoadBackupRegister(void);
    99104void SaveBackupRegister(void);
     105void JumpToBootloader(void);
    100106/* USER CODE END PFP */
    101107
     
    111117int main(void)
    112118{
    113 
    114119  /* USER CODE BEGIN 1 */
     120
     121  if (bootLoaderMark == GOTO_SYSTEM_BOOTLOADER_MARK)
     122  {
     123          bootLoaderMark = 0;
     124          JumpToBootloader();
     125  }
     126
    115127  uint8_t firstStartCatcher;
    116128  int mode_button_disable_time=0;
     
    137149
    138150  /* USER CODE BEGIN SysInit */
    139 
     151  printf("System core clock: %uMHz\n", SystemCoreClock / 1000000U);
    140152  /* USER CODE END SysInit */
    141153
     
    165177  AH_COUNTER_Init();
    166178
    167 
    168179  startType_t startType = EEPROM_isFirstStart();
    169180 
     
    189200  LoadBackupRegister();
    190201
    191 
    192     // Modbus Initialisierung
     202  // Modbus Initialisierung
    193203  mbInit(&modbusData, sys_data.s.parameter.baudrate, sys_data.s.parameter.parityMode, sys_data.s.parameter.stopBit, &huart2);
    194204  HAL_IWDG_Refresh(&hiwdg);
     
    206216  //HAL_DMA_Start(hadc2.DMA_Handle,(uint32_t)&hadc2.Instance->DR, (uint32_t)adc2Data,1); //Start ADC slave DMA
    207217  //SET_BIT(hadc1.Instance->CFGR, ADC_CFGR_DMAEN); //Enable DMA transfer for ADC master (ADC12_CCR.MDMA = 0b00 -> MDMA mode disabled)
    208  
     218
    209219    //HAL_ADC_Start_DMA(&hadc2, (uint32_t*)adc2Data, 1);
    210220  if (HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)adc12Data,SAMPLE_ARRAY_SIZE))  //Start ADC interleaved mode
     
    232242     Error_Handler();
    233243  }
    234 
    235244
    236245  // ADS1260 Initialierung
     
    252261  }
    253262
    254  
    255263  /* USER CODE END 2 */
    256264
     
    282290
    283291        }
    284 
    285292
    286293        if (newADC3Data == 1)
     
    330337        }
    331338   
    332 
    333339        if (sys_data.s.values.overcurrentRetryCounter > MAX_OVERCURRENT_RETRYS)
    334340        {
     
    339345          sys_data.s.values.lvpState = OUTPUTS_OVP_SHORT_PROTECTION;
    340346          HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
    341 
    342 
    343 
    344347        }
    345348
     
    386389
    387390      sys_data.s.values.efficiency = EFFICIENCY_Exec();
    388 
    389 
    390     }
     391    }
     392
    391393
    392394
     
    419421          case COMMAND_SET_RDP_LEVEL1:                        SetFlashReadProtection(true);                                                                                               break;
    420422          case COMMAND_SET_RDP_LEVEL1_AND_BOOTSEL:            SetBootFromFlashAndReadOutProtection();                                                                     break;
     423                  case COMMAND_GOTO_SYS_BOOTLOADER:                                       bootLoaderMark = GOTO_SYSTEM_BOOTLOADER_MARK;
     424                                                                                                                          HAL_NVIC_SystemReset();
    421425          default:                                            printf("UNKNOWN COMMAND\n");
    422426        }
     
    601605               
    602606                HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR13, sys_data.s.values.mAh_AutoModeU);
    603 
    604 
    605 
    606 
    607         }
    608 
    609 
    610 }
    611 
    612 
     607        }
     608}
     609
     610//------------------------------------------------------------------------------
    613611
    614612 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
     
    798796}
    799797
     798//------------------------------------------------------------------------------
     799
     800void JumpToBootloader (void)
     801{
     802        typedef void (SystemBootloader)(void);
     803#ifdef DEBUG
     804        printf("Cannot jump in DEBUG mode!\n");
     805        return;
     806#endif
     807        // Disable all interrupts
     808        __disable_irq();
     809
     810#ifdef DEINIT_RCC
     811        // Set the clock to the default state
     812        HAL_RCC_DeInit();
     813#endif
     814#ifdef DEINIT_SYSTICK
     815        // Disable Systick timer
     816        SysTick->CTRL = SysTick->LOAD = SysTick->VAL = 0;
     817#endif
     818        // Clear Interrupt Enable Register & Interrupt Pending Register
     819        for (int i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++)
     820    {
     821      NVIC->ICER[i] = 0xFFFFFFFF;
     822      NVIC->ICPR[i] = 0xFFFFFFFF;
     823    }
     824
     825        // Set up the jump to boot loader address + 4
     826        SystemBootloader* sb = (SystemBootloader*) (*((uint32_t *) ((SYSTEM_BOOTLOADER_START_ADDR + 4))));
     827
     828        // Set the main stack pointer to the bootloader stack
     829        __set_MSP(*(uint32_t *)SYSTEM_BOOTLOADER_START_ADDR);
     830
     831        __HAL_RCC_SYSCFG_CLK_ENABLE();
     832        __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
     833        //__HAL_RCC_SYSCFG_CLK_DISABLE();
     834
     835        // Re-enable all interrupts
     836        __enable_irq();
     837
     838        // Call the function to jump to boot loader location
     839        sb();
     840
     841        // Jump is done successfully
     842        while (1)
     843        {
     844                // Code should never reach this loop
     845                printf("Jump has failed!\n");
     846        }
     847}
    800848
    801849/* USER CODE END 4 */
  • trunk/fw_g473rct/Core/Src/usart.c

    r23 r44  
    9696  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    9797  huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
    98   huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_SWAP_INIT;
     98  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    9999  huart2.AdvancedInit.Swap = UART_ADVFEATURE_SWAP_ENABLE;
    100100  if (HAL_UART_Init(&huart2) != HAL_OK)
Note: See TracChangeset for help on using the changeset viewer.