EDA365电子论坛网

标题: stm32f103zg程序跳转到系统bootloader失败 [打印本页]

作者: RNGxiaohu    时间: 2021-12-20 09:56
标题: stm32f103zg程序跳转到系统bootloader失败
目前用的芯片STM32f103zg,准备使用串口升级程序,看到手册AN2606中,该芯片是支持USART1通过系统boot loader更新程序的。现在的程序是用stm32cubemx生成的,程序如下


  • int main(void)
  • {
  •   /* USER CODE BEGIN 1 */
  •   /* USER CODE END 1 */
  •   /* MCU Configuration--------------------------------------------------------*/
  •   /* Reset of all peripherals, Initializes the Flash inteRFace and the Systick. */
  •   HAL_Init();
  •   /* USER CODE BEGIN Init */
  •   /* USER CODE END Init */
  •   /* Configure the system clock */
  •   SystemClock_Config();
  •   /* USER CODE BEGIN SysInit */
  •   /* USER CODE END SysInit */
  •   /* Initialize all configured peripherals */
  •   MX_GPIO_Init();
  •   /* USER CODE BEGIN 2 */
  •   /* USER CODE END 2 */
  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •     /* USER CODE END WHILE */
  •     /* USER CODE BEGIN 3 */
  •                 if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_10)==GPIO_PIN_RESET)
  •                 {
  •                         JumpToBootloader();
  •                 }
  •                 else
  •                 {
  •                         JumpToApp();
  •                 }               
  •   }
  •   /* USER CODE END 3 */
  • }
  • /* USER CODE BEGIN 4 */
  • static void JumpToBootloader(void)
  • {
  •         uint32_t i=0;
  •         void (*SysMemBootJump)(void); /*声明一个函数指针*/
  •         __IO uint32_t BootAddr =  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 */
  •         SysMemBootJump();
  • }
  • static void JumpToApp(void)
  • {
  •         uint32_t i=0;
  •         void (*SysMemBootJump)(void);        /*声明一个函数指针*/
  •         __IO uint32_t BootAddr = 0x8001800; /* APP程序地址*/        
  •         
  •         /*关闭全局中断*/
  •         __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();
  •         /* 跳转到系统 BootLoader,首地址是MSP,地址 +4 是复位中断服务程序地址 */
  •         SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
  •         /* 设置主堆栈地址*/
  •         __set_MSP(*(uint32_t *)BootAddr);
  •         
  •         /*在RTOS工程,这条语句很重要,设置为特权模式,使用MSP指针 */
  •         __set_CONTROL(0);
  •         /* 跳转到系统 BootLoader */
  •         SysMemBootJump();
  • }
  • /* USER CODE END 4 */

[color=rgb(51, 102, 153) !important]复制代码


现在这个程序是可以正常跳转到APP程序的,就是跳转bootloader不成功,用stm32programmer,连接不上串口。如果直接把BOOT0置高是可以连接上串口的,所以硬件上应该没有问题。
请各位大神帮我看看到底是什么原因不能跳转到系统boot loader呢?

作者: CLBuu    时间: 2021-12-20 10:18
上电不执行JumpToApp(),不跳转到APP程序,不就是bootloader中吗
作者: showmaker    时间: 2021-12-20 10:18
用到boot时,程序的加载地址,中断向量要是修改的




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2