硬汉嵌入式论坛

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

[STM32CubeH7] 关于两块板之间程序升级的问题请教

[复制链接]
回帖奖励 4 个金币 回复本帖可获得 2 个金币奖励! 每人限 1 次(中奖概率 70%)

12

主题

68

回帖

104

积分

初级会员

积分
104
发表于 2022-3-31 10:28:01 | 显示全部楼层 |阅读模式
工具:Keil工况:
       我这里有两块板,一块是电源板,一块是主控板,现在需要使用主控板通过串口通讯给电源板升级,电源板给主控板供电

目前的思路是这样:
      由于主控板RAM比较大,电源板的程序比较小,现在的是通过上位机把电源板的程序发送到主控板的建立的数组中,正确接收完毕后
      主控板通过串口把程序发送到电源板进行升级,电源板的升级需要跳转到boot程序(自己写的,不是系统boot)
     一般我们是用通过复位,但是现在如果复位了,主控板就会掉电,在RMA中的程序就会丢失
问题:
   1)然后就想到了使用程序跳转,从电源板的APP程序直接跳的电源板的Boot,  测试发现电源的确没有掉,但是串口通讯好像是断了,写的boot里的测试程序好像也没有正常运行
   2)电源板的是boot 程序前面有HAL_Init ,SystemClock_Config等等,这个需要去掉吗?

这个是电源板boot的主函数, 其中APPLICATION_ADDRESS 为0x8006000
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();
//  MX_DMA_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
       
       
    while (BackgroudCNT++ <= 10)
    {
        /* Clean the input path */
        __HAL_UART_FLUSH_DRREGISTER(&huart2);

        // Clear ORE
        if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ORE) == SET)
        {
        __HAL_UART_CLEAR_OREFLAG(&huart2);
        }

       /* Receive key */
        HAL_UART_Receive(&huart2, &BackgroudMark, 1, 500);
        HAL_Delay(10);
    }
               
    UpgradeMark = *(__IO uint32_t*)UpgradeAddr;

    if(BackgroudMark == '1' )
    {        
         Main_Menu ();
    }
                else if(UpgradeMark == 1)
                {
                                Main_Menu ();
                }
    else
    {               
                                // Disable Peripheral CLK
                                HAL_UART_MspDeInit(&huart2);
                                MX_GPIO_DeInit();
               
                                /* Jump to user application */
                                JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
                                JumpToApplication = (pFunction) JumpAddress;
                                /* Initialize user application's Stack Pointer */
                                __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
                                JumpToApplication();
    }   
    /* Keep the user application running */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
               
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}



app程序中的跳转到boot,其中BOOT_ADDRESS为0x8000000

                                /* Jump to user application */
                                JumpAddress = *(__IO uint32_t*) (BOOT_ADDRESS + 4);
                                JumpToApplication = (pFunction) JumpAddress;
                                /* Initialize user application's Stack Pointer */
                                __set_MSP(*(__IO uint32_t*) BOOT_ADDRESS);
                                JumpToApplication();

回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2022-3-31 11:13:23 | 显示全部楼层

回帖奖励 +2 个金币

改一下升级流程。
1、发一个命令给主控板,让它转告电源板,要电源板复位并进入 boot。
2、复位进 boot 就会给主控板断电,进入boot 后再给 主控板上电。
3、再发程序到 主控板,主控板接收并校验完成后,发送到电源板。

这样在升级过程中主控板就不会断电了。
回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2022-3-31 14:21:35 | 显示全部楼层

回帖奖励 +2 个金币

如果Flash空间够的话,可以考虑电源板先把程序存到Flash其他空间,Boot时再覆盖原来的
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2022-3-31 20:50:56 | 显示全部楼层
emwin 发表于 2022-3-31 14:21
如果Flash空间够的话,可以考虑电源板先把程序存到Flash其他空间,Boot时再覆盖原来的

先写到主控板的flash里面吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2022-4-1 10:18:23 | 显示全部楼层

回帖奖励 +2 个金币

还有个好思路,不用往boot跳转,直接设置一段代码是在RAM里面运行的,这样你想更新boot,更新app都可以。

此贴混合运行方案的配置方法学习下,然你配置一段代码在RAM跑即可

爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户单独制作BOOT和APP
https://www.armbbs.cn/forum.php? ... 1011&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2022-4-1 14:53:37 | 显示全部楼层
eric2013 发表于 2022-4-1 10:18
还有个好思路,不用往boot跳转,直接设置一段代码是在RAM里面运行的,这样你想更新boot,更新app都可以。
...

电源板的RAM是不够的,而且目前来看主控板的flash也是不够用的
本来的想法是想通过
1)上位将电源板程序写到主控板flash中,并将电源板升级的标志位写入到flash
2)让电源板重启同时写电源板升级标志位,重启后读取标志位,进入boot
3)主控板也会重启,通过读取标志位,将电源板程序发送到电源板boot用于升级
但是现在主控板的flash不够用,这种做法也不行
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2022-4-1 14:54:02 | 显示全部楼层
ihavedone 发表于 2022-3-31 11:13
改一下升级流程。
1、发一个命令给主控板,让它转告电源板,要电源板复位并进入 boot。
2、复位进 boot  ...

唉,目前来看只能这样了
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2022-4-1 16:32:49 | 显示全部楼层
楼主,PC端的升级软件是你自己写的吗?如果是可以采用以下思路。
1.客户端增加一个连接功能。点连接后一直发送命令,等待回应。有回才可升级。
2.主控板在接到连接命令后,透传至电源板。如果主控板同样需要升级,则主控板和电源板的连接命令需区分。
3.电源板在启动时先进入boot程序。boot程序等待连接命令N秒,如果超时直接启动。boot程序接收到连接命令,应答。
4.客户端发送数据至电源板,烧写app程序。

这种方式要求先点击客户端的连接,再给板卡上电启动。这样做的好处为在升级过程中由于断电或其它意外情况导致
升级失败,还可以再次升级。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 20:05 , Processed in 0.269925 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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