Files
hm 2b9622f565 refactor: UartBus全面重构为USART,支持直接构造即可用
- UartBus -> USART (类名更符合外设命名规范)
- 构造函数 USART(UartPort port, uint32_t baudrate) 自动完成GPIO+外设初始化
- 移除default_instance()单例模式,移除init()/deinit()/irq_handler()
- 新增reinit(baudrate)支持时钟切换后波特率重新校准
- 新增static setDefault()用于printf路由选择
- 移除UartConfig配置结构体
- 更新iap.h/iap.cpp中UartBus引用为USART
- 更新main.cpp使用新USART构造模式
2026-04-27 11:14:22 +08:00

57 lines
1.4 KiB
C++

#ifndef __IAP_H__
#define __IAP_H__
#include <cstdint>
#include "common_types.h"
class USART;
#define IAP_APP_BASE_ADDR 0x08010000U
#define IAP_BOOTLOADER_SIZE (64U * 1024U)
#define IAP_FIRMWARE_MAX_SIZE (1024U * 1024U - IAP_BOOTLOADER_SIZE)
#define IAP_BUFFER_SIZE (1024U * 1024U)
class Iap {
public:
static Iap &instance();
RetCode init();
RetCode receiveFirmware(USART &uart, uint32_t timeout_ms = 120000);
RetCode programFirmware(uint32_t flash_addr);
RetCode verifyFirmware(uint32_t flash_addr);
__attribute__((noreturn)) void jumpToApp(uint32_t app_addr);
static bool isValidApp(uint32_t app_addr);
static void bootFlagWrite(uint32_t magic);
static uint32_t bootFlagRead(void);
uint32_t firmwareSize() const { return firmware_size_; }
const char *firmwareName() const { return firmware_name_; }
private:
Iap();
~Iap() = default;
Iap(const Iap &) = delete;
Iap &operator=(const Iap &) = delete;
static RetCode backupDomainEnable(void);
RetCode ymodemReceive(USART &uart, uint32_t timeout_ms);
int ymodemReadPacket(USART &uart, uint8_t *buf, uint32_t timeout_ms);
void ymodemSend(USART &uart, uint8_t b);
int ymodemRead(USART &uart, uint32_t timeout_ms);
static uint16_t crc16(const uint8_t *data, uint32_t len);
bool initialized_;
uint32_t firmware_size_;
char firmware_name_[32];
};
#endif