你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
求助,有没有大神使用cubeMX生成初始代码开发实现通过USB(HID)进行OTA升级功能的
举报
在 usbd_hid.c 中修改报告描述符(64字节输入/输出):
usbd_hid.c
c
复制
__ALIGN_BEGIN static uint8_t HID_ReportDesc[] __ALIGN_END = { 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined) 0x09, 0x01, // Usage (Vendor Usage 1) 0xA1, 0x01, // Collection (Application) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x75, 0x08, // Report Size (8 bits) 0x95, 0x40, // Report Count (64 bytes) 0x09, 0x01, // Usage (Vendor Usage 1) 0x81, 0x02, // Input (Data, Var, Abs) 0x95, 0x40, // Report Count (64 bytes) 0x09, 0x01, // Usage (Vendor Usage 1) 0x91, 0x02, // Output (Data, Var, Abs) 0xC0 // End Collection };
void USBD_HID_SendReport(uint8_t *report, uint16_t len) { if (USBD_HID_HandleTypeDef *hid = hUsbDeviceFS.pClassData) { USBD_LL_Transmit(&hUsbDeviceFS, HID_EPIN_ADDR, report, len); } } void USBD_HID_Receive(uint8_t *data, uint32_t length) { if (data[0] == OTA_HEADER) { // 检查固件头 write_to_flash(APP_ADDRESS, &data[1], length - 1); } }
stm32f1xx_hal_flash.c
void write_to_flash(uint32_t addr, uint8_t *data, uint32_t len) { HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef erase = { .TypeErase = FLASH_TYPEERASE_PAGES, .PageAddress = APP_ADDRESS, .NbPages = (len + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE }; uint32_t page_error; HAL_FLASHEx_Erase(&erase, &page_error); for (uint32_t i = 0; i < len; i += 2) { uint16_t val = *(uint16_t*)(data + i); HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + i, val); } HAL_FLASH_Lock(); }
main.c
void jump_to_app(void) { void (*app_reset_handler)(void) = (void (*)(void))(*((uint32_t*)(APP_ADDRESS + 4))); __disable_irq(); HAL_RCC_DeInit(); HAL_DeInit(); __set_MSP(*(__IO uint32_t*)APP_ADDRESS); app_reset_handler(); }
while (1) { if (ota_complete) { jump_to_app(); } HAL_Delay(100); }
python
import hid device = hid.device() device.open(0x0483, 0x5750) # STM32默认VID/PID # 发送固件 with open("firmware.bin", "rb") as f: data = f.read() chunk_size = 64 for i in range(0, len(data), chunk_size): chunk = data[i:i+chunk_size] device.write([0x00] + list(chunk)) # HID报告ID为0x00
.bin
0x08004000
HAL_FLASH_Unlock()
STM32WB55使用cubemx生成的代码编译报错
《年中视频学习心得》+我在年中学习STM32心得
stm32g431rbt怎么显示汉字
stm32cubemx在联网时无法启动,断网时可正常启动。
STM32H7R7 CubeMX无配置问题
個人中心的頭像怎麽換掉
开发逆变器进行STM32学习,路径如何规划?
cubeide登录不了,软件连不上网
怎么在CubeIDE里面显示出导入的官方例程的全部文件?
如何调整CubeMX的默认引脚
1. 硬件与软件准备
2. CubeMX配置
步骤1:创建工程
步骤2:启用USB
步骤3:配置GPIO和时钟
步骤4:生成代码
3. 代码实现
3.1 修改HID描述符
在
usbd_hid.c
中修改报告描述符(64字节输入/输出):c
复制
3.2 实现OTA协议
usbd_hid.c
中):c
复制
stm32f1xx_hal_flash.c
):c
复制
main.c
中):c
复制
3.3 主循环逻辑
c
复制
4. 上位机工具(Python示例)
python
复制
5. 测试步骤
.bin
文件。0x08004000
,避开Bootloader)。6. 常见问题
HAL_FLASH_Unlock()
)。7. 优化建议