2b9622f565
- 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构造模式
57 lines
1.4 KiB
C++
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
|