Files
GD32E50X_BOOT/GD32E50X_BOOT/sys/config.h
T
cbb d1beb3b615 feat(device): SPI OTA模块改用DMA发送替代TBE中断
SPI OTA模块从PendSV延迟响应模式改为DMA发送模式,主要改进包括:

- 添加DMA支持,使用DMA0_CH2自动发送SPI0数据,消除字节错位问题
- EXTI ISR直接完成帧校验+处理+响应准备,不再依赖PendSV
- 移除PendSV相关代码和中断处理函数
- CS释放后直接处理帧数据,响应帧写入s_txBuf由DMA自动发送
- 更新注释文档说明新的工作流程和DMA通道映射关系
2026-05-26 02:44:25 +08:00

108 lines
4.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef __CONFIG_H__
#define __CONFIG_H__
#include <stdint.h>
/** 项目内部统一使用的简写类型。 */
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
/** 调试打印总开关。置 1 时所有 printf 调试输出编译进去;置 0 时完全剔除,零开销。 */
#define DEBUG_PRINT 0
/**
* Flash 布局说明(GD32E508VE,512KB)
* -----------------------------------
* 0x08000000 ~ 0x08011FFF : Bootloader 区(72KB)
* 0x08012000 ~ 0x08047FFF : 备份应用区(216KB)
* 0x08048000 ~ 0x0807DFFF : 当前主应用区(216KB)
* 0x0807E000 ~ 0x0807E7FF : OTA 状态配置页
* 0x0807E800 ~ 0x0807EFFF : 睡眠配置页
*/
inline constexpr u32 BOOTLOADER_START_ADDR = 0x08000000U;
inline constexpr u32 BOOTLOADER_SIZE = 0x00012000U; /**< 72KB */
inline constexpr u32 APPBACK_START_ADDR = 0x08012000U; /**< 备份应用起始地址 */
inline constexpr u32 APPLATEST_START_ADDR = 0x08048000U; /**< 当前有效应用起始地址 */
inline constexpr u32 APP_MAX_SIZE = 0x00036000U; /**< 216KB */
inline constexpr u32 FMC_PAGE_SIZE = 0x00000800U; /**< 2KB,GD32E50x 单页大小 */
inline constexpr u32 OTA_CONFIG_PAGE_ADDR = 0x0807E000U; /**< OTA 元数据页 */
inline constexpr u32 SLEEP_CONFIG_START = 0x0807E800U; /**< 睡眠配置页起始 */
inline constexpr u32 SLEEP_CONFIG_END = 0x0807F000U; /**< 睡眠配置页结束(开区间) */
/** Flash 默认擦除值,以及睡眠开关标志值。 */
inline constexpr u32 FLASH_EMPTY = 0xFFFFFFFFU;
inline constexpr u32 SLEEP_ENABLE = 0x11111111U;
inline constexpr u32 SLEEP_DISABLE = 0x00000000U;
/**
* OTA 配置页一共使用 6 个 word,分别保存:
* latest_aval / backup_aval / latest_en / backup_en / latest_check / backup_check
*/
inline constexpr u32 OTA_CONFIG_NUM = 6U;
inline constexpr u32 n_APP_LATEST_AVAL_ADDR = OTA_CONFIG_PAGE_ADDR + 0x00U;
inline constexpr u32 n_APP_BACKUP_AVAL_ADDR = OTA_CONFIG_PAGE_ADDR + 0x04U;
inline constexpr u32 n_APP_LATEST_EN_ADDR = OTA_CONFIG_PAGE_ADDR + 0x08U;
inline constexpr u32 n_APP_BACKUP_EN_ADDR = OTA_CONFIG_PAGE_ADDR + 0x0CU;
inline constexpr u32 n_APP_LATEST_CHECK_ADDR = OTA_CONFIG_PAGE_ADDR + 0x10U;
inline constexpr u32 n_APP_BACKUP_CHECK_ADDR = OTA_CONFIG_PAGE_ADDR + 0x14U;
/**
* 本项目把 0x00000000 视为“有效/可用”,
* 把 0xFFFFFFFF 视为“无效/未写入”。
* 这样设计是因为 Flash 擦除态天然就是 0xFFFFFFFF。
*/
inline constexpr u32 OTA_NOT_AVAL = 0xFFFFFFFFU;
inline constexpr u32 OTA_AVAL = 0x00000000U;
inline constexpr u32 FLASH_EEPROM_OK = 0U;
inline constexpr u32 FLASH_EEPROM_ERROR = 1U;
/** CAN-FD OTA 链路使用的扩展帧 ID。 */
inline constexpr u32 CANFD_OTA_REQ_ID = 0x00000100U;
inline constexpr u32 CANFD_OTA_DATA_ID = 0x00000101U;
inline constexpr u32 CANFD_OTA_ACK_ID = 0x00000102U;
inline constexpr u32 CANFD_OTA_WAIT_ID = 0x00000103U;
inline constexpr u32 CANFD_OTA_CANCEL_ID = 0x00000000U;
/** GD32E50x 芯片 UID 三段地址。 */
inline constexpr u32 DEVICE_SERIAL_ADDR_LSB = 0x1FFFF7E8U;
inline constexpr u32 DEVICE_SERIAL_ADDR_MID = 0x1FFFF7ECU;
inline constexpr u32 DEVICE_SERIAL_ADDR_MSB = 0x1FFFF7F0U;
/**
* OTA 数据包设计:
* - 每帧总长 64 字节
* - 其中真实加密固件数据为 48 字节
* - 其余用于会话号、包序号、结束标志和 CRC32
*/
inline constexpr u32 OTA_PACKET_SIZE = 48U;
/** 便于按字节/按字访问同一个 32bit 数值。 */
typedef union {
u32 u;
u8 b[4];
} u32_union_t;
/**
* 主密钥:用于 OTA 握手阶段派生会话密钥。
* 当前是写死在固件中的固定密钥。
*/
inline constexpr uint8_t K_master[16] = {
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10
};
/**
* 超时与启动等待参数:
* - OTA_TIMEOUT:OTA 会话超时时间计数上限
* - APP_DELAY_BOOT_TIME:发现应用存在但被禁用时,Bootloader 等待 OTA 请求的窗口
*/
inline constexpr u32 OTA_TIMEOUT = 10000U;
inline constexpr u32 APP_DELAY_BOOT_TIME = 10000U;
/** 常用尺寸常量。 */
static const u8 SIZE_U32 = sizeof(uint32_t);
static const u8 SIZE_FLOAT = sizeof(float);
#endif