MDHS_ 2025-04-21 10:08 采纳率: 0%
浏览 16

STM32h750vbt6关于usb升级

需要stm32h750vbt6的关于usb固件升级的代码,不介入外部flash,只用内部的。底层代码可用cubemx生成,编译环境是keil5.弄了好几次没能成功,求帮助,boot起始地址为0x08000000,大小为0x10000。app起始地址为0x08010000,大小为0x10000。

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-04-21 10:08
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    USB固件升级解决方案

    你遇到的问题是使用STM32H750VBT6的USB接口进行固件升级,使用内部Flash存储器,而不是外部Flash。下面是一个基本的解决方案:

    1. 使用CUBE-MX生成底层代码 使用CUBE-MX生成底层代码,选择STM32H750VBT6作为目标MCU,选择USB Device作为接口,选择内部Flash作为存储器。
    2. 配置USB固件升级 在CUBE-MX中,配置USB固件升级的相关参数,包括升级包的大小、升级包的格式、升级包的存储位置等。
    3. 实现USB固件升级 使用C语言编写USB固件升级的代码,使用USB Device的API来实现升级操作。升级操作可以分为以下几个步骤:
      • 读取升级包
      • 验证升级包的正确性
      • 将升级包写入内部Flash
      • 重启MCU以生效升级
    4. 使用Keil5编译 使用Keil5编译生成的底层代码,编译器设置为ARM Cortex-M7。

    以下是一个简单的示例代码,用于演示USB固件升级的基本步骤:

    #include "stm32h7xx_hal.h"
    #include "usb_device.h"
    
    #define FLASH_ADDRESS 0x08000000 // 内部Flash的起始地址
    #define UPGRADE_PACKAGE_SIZE 1024 // 升级包的大小
    
    int main(void) {
        // 初始化USB Device
        USB_Device_Init();
    
        // 等待升级请求
        while (1) {
            if (USB_Device_GetState() == USB_DEVICE_STATE_CONNECTED) {
                // 读取升级包
                uint8_t upgrade_package[UPGRADE_PACKAGE_SIZE];
                USB_Device_Read(0x00, upgrade_package, UPGRADE_PACKAGE_SIZE);
    
                // 验证升级包的正确性
                if (validate_upgrade_package(upgrade_package)) {
                    // 将升级包写入内部Flash
                    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_ADDRESS, upgrade_package);
    
                    // 重启MCU以生效升级
                    HAL_Reboot();
                }
            }
        }
    }
    
    int validate_upgrade_package(uint8_t *package) {
        // 验证升级包的正确性
        // ...
        return 0;
    }
    

    这个示例代码只是一个基本的示例,实际实现中可能需要更多的逻辑和错误处理。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月21日