This not work too
This commit is contained in:
parent
229fd7a73d
commit
4dccded427
@ -87,15 +87,15 @@ volatile uint8_t pmu_irq = 0;
|
|||||||
static uint32_t pmu_online = 0;
|
static uint32_t pmu_online = 0;
|
||||||
|
|
||||||
struct blvt_t {
|
struct blvt_t {
|
||||||
uint32_t __sp;
|
__IO uint32_t __sp;
|
||||||
void (*__bl_call)(void);
|
__attribute((noreturn)) void (*__bl_call)(void);
|
||||||
};
|
};
|
||||||
#define STM32F1xxx_BL_VECTOR_TABLE ((struct blvt_t *)STM32F1xxx_BL_ADDR)
|
#define STM32F1xxx_BL_VECTOR_TABLE ((struct blvt_t *)STM32F1xxx_BL_ADDR)
|
||||||
|
|
||||||
|
|
||||||
// Private variables ---------------------------------------------------------
|
// Private variables ---------------------------------------------------------
|
||||||
//static void lock_cb(uint8_t caps_changed, uint8_t num_changed);
|
//static void lock_cb(uint8_t caps_changed, uint8_t num_changed);
|
||||||
static void reset_to_bootloader(void);
|
static void reset_to_bootloader(uint32_t* addr);
|
||||||
static void key_cb(char key, enum key_state state);
|
static void key_cb(char key, enum key_state state);
|
||||||
static void hw_check_HP_presence(void);
|
static void hw_check_HP_presence(void);
|
||||||
static void sync_bat(void);
|
static void sync_bat(void);
|
||||||
@ -293,6 +293,8 @@ int main(void) {
|
|||||||
|
|
||||||
LL_GPIO_ResetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); // I'm alive!
|
LL_GPIO_ResetOutputPin(SYS_LED_GPIO_Port, SYS_LED_Pin); // I'm alive!
|
||||||
|
|
||||||
|
reset_to_bootloader((uint32_t*)STM32F1xxx_BL_ADDR);
|
||||||
|
|
||||||
// Start the systick timer
|
// Start the systick timer
|
||||||
if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)
|
if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
@ -481,36 +483,63 @@ static void lock_cb(uint8_t caps_changed, uint8_t num_changed) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
__attribute__((naked, noreturn)) static void BootJumpASM(
|
||||||
|
__attribute__((unused)) uint32_t __SP,
|
||||||
|
__attribute__((unused)) uint32_t __RH )
|
||||||
|
{
|
||||||
|
__asm("MSR MSP,r0");
|
||||||
|
__asm("BX r1");
|
||||||
|
}
|
||||||
|
|
||||||
static void reset_to_bootloader(void) {
|
static void reset_to_bootloader(uint32_t* addr) {
|
||||||
// Disable IRQ to not break everything
|
// Disable IRQ to not break everything
|
||||||
__disable_irq();
|
__disable_irq();
|
||||||
|
|
||||||
// Reset the system to a boot state
|
// Reset the system to a boot state
|
||||||
HAL_RCC_DeInit();
|
//HAL_RCC_DeInit();
|
||||||
SysTick->CTRL = 0;
|
SysTick->CTRL = 0;
|
||||||
SysTick->LOAD = 0;
|
SysTick->LOAD = 0;
|
||||||
SysTick->VAL = 0;
|
SysTick->VAL = 0;
|
||||||
|
SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk ;
|
||||||
|
|
||||||
|
// Disable individual fault handlers if the bootloader used them
|
||||||
|
SCB->SHCSR &= ~( SCB_SHCSR_USGFAULTENA_Msk | \
|
||||||
|
SCB_SHCSR_BUSFAULTENA_Msk | \
|
||||||
|
SCB_SHCSR_MEMFAULTENA_Msk ) ;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++) {
|
for (uint8_t i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++) {
|
||||||
NVIC->ICER[i]=0xFFFFFFFF;
|
NVIC->ICER[i]=0xFFFFFFFF;
|
||||||
NVIC->ICPR[i]=0xFFFFFFFF;
|
NVIC->ICPR[i]=0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
__enable_irq();
|
//__enable_irq();
|
||||||
|
|
||||||
// Relocate the main SP
|
// Activate the MSP, if the core is found to currently run with the PSP.
|
||||||
__set_MSP(STM32F1xxx_BL_VECTOR_TABLE->__sp);
|
if( CONTROL_SPSEL_Msk & __get_CONTROL( ) )
|
||||||
|
{ /* MSP is not active */
|
||||||
// Remap NVIC
|
__set_CONTROL( __get_CONTROL( ) & ~CONTROL_SPSEL_Msk ) ;
|
||||||
//SCB->VTOR = STM32F1xxx_BL_ADDR;
|
}
|
||||||
|
|
||||||
// Wait for every datas to be ready
|
// Wait for every datas to be ready
|
||||||
__ISB();
|
__ISB();
|
||||||
__DSB();
|
__DSB();
|
||||||
|
|
||||||
|
// Remap the vector table address of the bootloader. Make sure the address meets the alignment requirements.
|
||||||
|
SCB->VTOR = (uint32_t)addr;
|
||||||
|
|
||||||
|
// Wait for every datas to be ready
|
||||||
|
__ISB();
|
||||||
|
__DSB();
|
||||||
|
|
||||||
|
// Relocate the main SP
|
||||||
|
__set_MSP( addr[0] ) ;
|
||||||
|
//__set_MSP(STM32F1xxx_BL_VECTOR_TABLE->__sp);
|
||||||
|
|
||||||
// Now, jump to the bootloader!
|
// Now, jump to the bootloader!
|
||||||
STM32F1xxx_BL_VECTOR_TABLE->__bl_call();
|
( ( void ( * )( void ) )addr[1] )( ) ;
|
||||||
|
//STM32F1xxx_BL_VECTOR_TABLE->__bl_call();
|
||||||
|
|
||||||
|
//BootJumpASM(((uint32_t*)STM32F1xxx_BL_ADDR)[0], ((uint32_t*)STM32F1xxx_BL_ADDR)[1]);
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
// We should never go here...
|
// We should never go here...
|
||||||
@ -795,7 +824,7 @@ __STATIC_INLINE void check_pmu_int(void) {
|
|||||||
//uint8_t data[4] = {1, 2, 3, 4};
|
//uint8_t data[4] = {1, 2, 3, 4};
|
||||||
//PMU.writeDataBuffer(data, XPOWERS_AXP2101_DATA_BUFFER_SIZE);
|
//PMU.writeDataBuffer(data, XPOWERS_AXP2101_DATA_BUFFER_SIZE);
|
||||||
|
|
||||||
reset_to_bootloader();
|
reset_to_bootloader((uint32_t*)STM32F1xxx_BL_ADDR);
|
||||||
|
|
||||||
/*LL_GPIO_ResetOutputPin(SP_AMP_EN_GPIO_Port, SP_AMP_EN_Pin);
|
/*LL_GPIO_ResetOutputPin(SP_AMP_EN_GPIO_Port, SP_AMP_EN_Pin);
|
||||||
LL_GPIO_ResetOutputPin(PICO_EN_GPIO_Port, PICO_EN_Pin);
|
LL_GPIO_ResetOutputPin(PICO_EN_GPIO_Port, PICO_EN_Pin);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user