问答

汇集网友智慧,解决技术难题

jing880311

TA的家园币:54  

  • stm32f103zg程序跳转到系统bootloader失败

    目前用的芯片是stm32f103zg,准备使用串口升级程序,看到手册AN2606中,该芯片是支持USART1通过系统bootloader更新程序的。现在的程序是用stm32cubemx生成的,程序如下intmain(void){/*USERCODEBEGIN1*//*USERCODEEND1*//*MCUConfiguration--------------------------------------------------------*//*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/HAL_Init();/*USERCODEBEGINInit*//*USERCODEENDInit*//*Configurethesystemclock*/SystemClock_Config();/*USERCODEBEGINSysInit*//*USERCODEENDSysInit*//*Initializeallconfiguredperipherals*/MX_GPIO_Init();/*USERCODEBEGIN2*//*USERCODEEND2*//*Infiniteloop*//*USERCODEBEGINWHILE*/while(1){/*USERCODEENDWHILE*//*USERCODEBEGIN3*/if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_10)==GPIO_PIN_RESET){JumpToBootloader();}else{JumpToApp();}}/*USERCODEEND3*/}/*USERCODEBEGIN4*/staticvoidJumpToBootloader(void){uint32_ti=0;void(*SysMemBootJump)(void);/*声明一个函数指针*/__IOuint32_tBootAddr=0x1FFFE000;//0x1FFF0000;/*STM32F103的系统BootLoader地址*//*关闭全局中断*/__disable_irq();/*关闭滴答定时器,恢复到默认值*/SysTick->CTRL=0;SysTick->LOAD=0;SysTick->VAL=0;/*设置所有时钟到默认状态,使用HSI时钟*/HAL_RCC_DeInit();/*关闭所有中断,清除中断挂起标志*/for(i=0;i<8;i++){NVIC->ICER=0xFFFFFFFF;NVIC->ICPR=0xFFFFFFFF;}/*使能全局中断*/__enable_irq();/*设置重映射到系统Flash*///__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();/*跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址*/SysMemBootJump=(void(*)(void))(*((uint32_t*)(BootAddr+4)));/*设置主堆栈地址*/__set_MSP(*(uint32_t*)BootAddr);/*在RTOS工程,这条语句很重要,设置为特权模式,使用MSP指针*/__set_CONTROL(0);/*跳转到系统BootLoader*

    Bootloader STM32F103 se ic rc TI

    2021-09-04 0