硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1124|回复: 3
收起左侧

[有问必答] STM32F1 APP 跳转BOOT 问题

[复制链接]

16

主题

43

回帖

91

积分

初级会员

积分
91
发表于 2024-6-14 00:50:17 | 显示全部楼层 |阅读模式
STM32F103VC,BOOT里设置的是按键加RESET 进入YMODE BOOT,升级,此功能更新跳转到APP正常;现想加入收到特定串口命令后进入BOOT,再通过YMODE更新APP(因功能无法用按键组合进入BOOT)
但是APP 跳转BOOT一直失败,未正确执行BOOT功能(按键加RESET进BOOT没问题)。以下两种都试过都不行,不知道哪里出问题,请各位帮忙看下哪里出问题了,在此感谢。

关键APP里的代码如下:
主循环查询

    if(cmd == 0xFA)
    {      
      printf("\r\n System will Reset and then in bootloader mode!\r\n");
      printf("********************\r\n");
      //方法1
      if(g_JumpInit == 0xAA553344)
      {
          SftJumpToBootloader();  /* 软件复位后跳转 */
      }   
      g_JumpInit = 0xAA553344;
      HAL_NVIC_SystemReset();         /* 软件自动复位后跳转 */
      
      //方法2
      //JumpToBootLoader();   
    }


void JumpToBootLoader(void) //App跳BootLoader
{

  __set_PRIMASK(1);
  /* 关闭滴答定时器,复位到默认值 */
        SysTick->CTRL = 0;
        SysTick->LOAD = 0;
        SysTick->VAL = 0;
  HAL_DMA_DeInit(&hdma_adc1);  跳转BOOT 失败跟踪会跳到DMA,uart中断所以加上,但是还是没用!
  HAL_DMA_DeInit(&hdma_adc3);
  HAL_UART_MspDeInit(&huart1);
  HAL_UART_MspDeInit(&huart2);
        HAL_RCC_DeInit();
        HAL_DeInit();
        /* 关闭所有中断,清除所有中断挂起标志 */
        for (i = 0; i < 8; i++)
        {
                NVIC->ICER[i]=0xFFFFFFFF;
                NVIC->ICPR[i]=0xFFFFFFFF;
        }
        /* 使能全局中断 */
        __enable_irq();

        /* 跳转到系统 BootLoader,首地址是 MSP,地址+4 是复位中断服务程序地址 */
        JumpToBL = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

        /* 设置主堆栈指针 */
        __set_MSP(*(uint32_t *)BootAddr);

        /* 跳转到系统 BootLoader */
        JumpToBL();

        /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
        while (1)
        {

        }
}

static void SftJumpToBootloader(void)
{
  void (*SysMemBootJump)(void);
        //volatile uint32_t BootAddr = 0x8000000;
       g_JumpInit = 0xAA553344;   
        SysMemBootJump = (void (*)(void)) *((uint32_t *) ((BootAddr + 4)));  /* Set up the jump to boot loader address + 4 */
        __set_MSP(*(uint32_t *)BootAddr);  /* Set the main stack pointer to the boot loader stack */   
        SysMemBootJump();          /* Call the function to jump to boot loader location */       
        while (1)
        {
                /* Jump is done successfully */
                /* Code should never reach this loop */
        }
}


关键BOOT 程序

  if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6) == GPIO_PIN_SET)
  {
    /* Initialise Flash */
    FLASH_If_Init();
    //IAP_Init();
    Main_Menu();
  }
  else if(STM32_BOOT_FLAG_BUFFER[0] == 0xFFFFFFFF && STM32_BOOT_FLAG_BUFFER[1] == 0xFFFFFFFF)// 本意是想在APP里 通过串口升级命令后写FLASH 标记位,然后复位到BOOT程序就不用组合按键了
  {
    FLASH_If_Init();
    //IAP_Init();
    Main_Menu();
   
  }
  else if(STM32_BOOT_FLAG_BUFFER[0] == 0xF0A1A2A3 || STM32_BOOT_FLAG_BUFFER[1] == 0xF1A1A2A3)
  {
    /* Keep the user application running */
    /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
      /* execute the new program */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      /* Jump to user application */
      JumpToApplication = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      JumpToApplication();
    }
  }

回复

使用道具 举报

23

主题

71

回帖

140

积分

初级会员

积分
140
发表于 2024-6-14 08:39:19 | 显示全部楼层
变量两次赋值你这是要干嘛?

下载.png
回复

使用道具 举报

16

主题

43

回帖

91

积分

初级会员

积分
91
 楼主| 发表于 2024-6-14 15:54:13 | 显示全部楼层
2360985396 发表于 2024-6-14 08:39
变量两次赋值你这是要干嘛?

抄的网上的方法
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-6-15 09:03:12 | 显示全部楼层
APP 跳转BOOT 直接NVIC RESET即可
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 03:59 , Processed in 0.042360 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表