Files
DCU_APP/GD32E508_DCU_APP/sys/config.h
T
cbb 6aa21a1f9d feat(canfd): 添加CANFD自检功能和桥接模式支持
- 添加完整的CANFD初始化流程,包括硬复位机制解决CAN1卡死问题
- 实现CANFD自检功能,包含物理总线测试和内部回环测试
- 支持CAN0到CAN1/CAN2的透传桥接模式
- 添加详细的初始化诊断信息输出
- 修复CAN滤波器配置和GPIO映射问题
- 增强错误处理和状态监控功能

perf(system): 优化系统时钟配置提高性能

- 将AHB时钟从SYSCLK/4调整为SYSCLK/2 (60MHz)
- 优化PLL预分频配置参数
- 更新相关时序注释以反映实际频率变化

docs(esc): 更新EXMC总线时序配置注释

- 添加LAN9252 HBI时序要求详细说明
- 注明当前ESC未启用状态下的占位符说明
- 提供实际计算得出的HCLK延迟要求
2026-07-02 02:02:41 +08:00

311 lines
14 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.
/**
* @file config.h
* @brief 应用级集中配置项定义。
* @note 用于统一管理当前项目中可调的外设、时序、通信与算法常量。
*/
#ifndef SYS_CONFIG_H
#define SYS_CONFIG_H
/** @brief 应用启动横幅字符串。 */
#define APP_BANNER_TEXT "GD32E508 DCU task scheduler start"
/** @brief USART0 默认波特率。 */
#define CONFIG_USART0_BAUDRATE 115200U
/** @brief ADC 外设实例。 */
#define CONFIG_ADC_INSTANCE ADC0
/** @brief ADC 外部 VIN 检测通道号(原理图:PA6 -> VIN_ADC)。 */
#define CONFIG_ADC_VIN_CHANNEL ADC_CHANNEL_6
/** @brief ADC 内部温度通道号。 */
#define CONFIG_ADC_TEMP_CHANNEL ADC_CHANNEL_16
/** @brief ADC 内部参考电压通道号。 */
#define CONFIG_ADC_VREFINT_CHANNEL ADC_CHANNEL_17
/** @brief ADC 满量程计数值。 */
#define CONFIG_ADC_MAX_VALUE 4095.0f
/** @brief 内部参考电压典型值,单位 V。 */
#define CONFIG_ADC_VREFINT_TYPICAL_VOLTAGE 1.20f
/** @brief 温度传感器 25℃ 对应电压,单位 V。 */
#define CONFIG_ADC_TEMP_V25 1.43f
/** @brief 温度传感器平均斜率,单位 V/℃。 */
#define CONFIG_ADC_TEMP_AVG_SLOPE 0.0043f
/** @brief ADC 上电后稳定等待时间,单位 ms。 */
#define CONFIG_ADC_STABILIZE_DELAY_MS 2U
/** @brief ADC 规则通道采样时间配置。 */
#define CONFIG_ADC_SAMPLE_TIME ADC_SAMPLETIME_239POINT5
/** @brief ADC 空输入保护时默认 VDDA,单位 V。 */
#define CONFIG_ADC_DEFAULT_VDDA 3.3f
/** @brief ADC 中值滤波窗口长度(最终样本数为该值 + 1)。 */
#define CONFIG_ADC_FILTER_SIZE 6U
/** @brief CAN 外设实例。 */
#define CONFIG_CAN_INSTANCE CAN0
/** @brief CAN 外设时钟使能枚举。 */
#define CONFIG_CAN_RCU RCU_CAN0
/** @brief CAN 状态报文标准帧 ID。 */
#define CONFIG_CAN_STATUS_ID 0x321U
/** @brief ESP32 请求 DCU_APP 进入 Bootloader OTA 窗口的扩展帧 ID(备用 CAN 入口)。 */
#define CONFIG_CAN_OTA_BOOT_REQ_ID 0x00000320U
/** @brief 进入 Bootloader OTA 请求魔术字节 0。 */
#define CONFIG_CAN_OTA_BOOT_MAGIC0 0x4FU
/** @brief 进入 Bootloader OTA 请求魔术字节 1。 */
#define CONFIG_CAN_OTA_BOOT_MAGIC1 0x54U
/** @brief 进入 Bootloader OTA 请求魔术字节 2。 */
#define CONFIG_CAN_OTA_BOOT_MAGIC2 0x41U
/** @brief 进入 Bootloader OTA 请求魔术字节 3。 */
#define CONFIG_CAN_OTA_BOOT_MAGIC3 0x21U
/** @brief ESP32 在 APP 运行期通过 SPI 发送的进入 Bootloader OTA 命令。 */
#define CONFIG_SPI_APP_OTA_BOOT_CMD 0xB0U
/** @brief SPI 进入 Bootloader OTA 命令确认状态:成功。 */
#define CONFIG_SPI_APP_OTA_BOOT_ACK_OK 0xB5U
/** @brief SPI 进入 Bootloader OTA 命令确认状态:失败。 */
#define CONFIG_SPI_APP_OTA_BOOT_ACK_ERROR 0xE2U
/* ============================================================
* CAN-FD 位时序配置(三路 CAN0/CAN1/CAN2 共用)
* 时钟链: SYSCLK=180MHz → AHB=/1=180MHz(RCU_MODIFY_UP 强制)
* → APB1=/2=90MHz (CAN_CLK)
*
* 仲裁段目标: 1.0 Mbps = 90MHz / (9 × 10 TQ)
* 数据段目标: 2.0 Mbps = 90MHz / (9 × 5 TQ)
*
* @note RCU_MODIFY_UP 宏在 system_clock_180m_hxtal() 末尾将 AHB 从 /4
* 临时切到 /1,这是 GigaDevice 官方行为,不可删除。
* 最终 AHB=180MHz, APB1=90MHz, APB2=180MHz, TIMER2_CLK=180MHz。
* ============================================================ */
/** @brief 仲裁段预分频值。 */
#define CONFIG_CAN_NOMINAL_PRESCALER 9U
/** @brief 仲裁段再同步跳跃宽度。 */
#define CONFIG_CAN_NOMINAL_SJW CAN_BT_SJW_1TQ
/** @brief 仲裁段时间段 1(PHSEG1)。 */
#define CONFIG_CAN_NOMINAL_BS1 CAN_BT_BS1_7TQ
/** @brief 仲裁段时间段 2(PHSEG2)。 */
#define CONFIG_CAN_NOMINAL_BS2 CAN_BT_BS2_2TQ
/** @brief 数据段预分频值。 */
#define CONFIG_CAN_DATA_PRESCALER 9U
/** @brief 数据段再同步跳跃宽度。 */
#define CONFIG_CAN_DATA_SJW CAN_BT_SJW_1TQ
/** @brief 数据段时间段 1。 */
#define CONFIG_CAN_DATA_BS1 CAN_BT_BS1_3TQ
/** @brief 数据段时间段 2。 */
#define CONFIG_CAN_DATA_BS2 CAN_BT_BS2_1TQ
/** @brief BRS(比特率切换)使能开关:1=启用数据段加速,0=关闭仅经典 CAN。 */
#define CONFIG_CAN_FD_BRS_ENABLE 1U
/** @brief CAN 接收过滤器目标标准帧 ID。 */
#define CONFIG_CAN_RX_FILTER_ID CONFIG_CAN_STATUS_ID
/** @brief CAN 接收过滤器标准帧掩码;`0x7FFU` 表示精确匹配 11-bit ID。 */
#define CONFIG_CAN_RX_FILTER_MASK 0x7FFU
/** @brief 单次 CAN 接收解析任务最多消费的软件队列帧数,避免主循环长期被接收流量占用。 */
#define CONFIG_CAN_RX_PARSE_BUDGET 48U
/** @brief CAN 状态载荷中调试标识字符 0。 */
#define CONFIG_CAN_STATUS_TAG0 0x43U
/** @brief CAN 状态载荷中调试标识字符 1。 */
#define CONFIG_CAN_STATUS_TAG1 0x41U
/** @brief CAN 状态载荷中调试标识字符 2。 */
#define CONFIG_CAN_STATUS_TAG2 0x4EU
/** @brief CAN 状态载荷中调试标识字符 3。 */
#define CONFIG_CAN_STATUS_TAG3 0x46U
/** @brief 用户调度定时器实例。 */
#define CONFIG_SCHED_TIMER_INSTANCE TIMER2
/** @brief 用户调度定时器中断号。 */
#define CONFIG_SCHED_TIMER_IRQn TIMER2_IRQn
/** @brief 用户调度定时器时钟使能宏参数。 */
#define CONFIG_SCHED_TIMER_RCU RCU_TIMER2
/** @brief 用户调度定时器预分频值。
* 时钟链: SYSCLK=180MHz → AHB=/1=180MHz(RCU_MODIFY_UP 强制) → APB1=/2=90MHz → TIMER2_CLK=APB1×2=180MHz。
* 保持 100us tick: (PSC+1)×(PER+1)=18000 → 180×100 → PSC=179, PER=99。
*/
#define CONFIG_SCHED_TIMER_PRESCALER 179U
/** @brief 用户调度定时器周期重装值。 */
#define CONFIG_SCHED_TIMER_PERIOD 99U
/** @brief 用户调度定时器 NVIC 抢占优先级。 */
#define CONFIG_SCHED_TIMER_IRQ_PREEMPT_PRIO 1U
/** @brief 用户调度定时器 NVIC 子优先级。 */
#define CONFIG_SCHED_TIMER_IRQ_SUB_PRIO 0U
/** @brief 调度基准节拍:ADC VREF 采样周期,单位 100us tick。 */
#define CONFIG_TASK_PERIOD_VREF_SAMPLE_TICKS 5U
/** @brief 调度基准节拍:ADC 温度采样/处理周期,单位 100us tick。 */
#define CONFIG_TASK_PERIOD_TEMP_SAMPLE_TICKS 10U
/** @brief 调度基准节拍:10ms 计数周期,单位 100us tick。 */
#define CONFIG_TASK_PERIOD_CAN_RX_TICKS 100U
/** @brief 调度基准节拍:CAN 发送/状态灯周期,单位 100us tick。 */
#define CONFIG_TASK_PERIOD_CAN_TX_TICKS 1000U
/** @brief 调度基准节拍:心跳/诊断打印周期,单位 100us tick。 */
#define CONFIG_TASK_PERIOD_HEARTBEAT_TICKS 10000U
/** @brief 周期温度/电压 UART 打印开关:0=关闭,1=开启。 */
#define CONFIG_UART_TEMP_PERIODIC_PRINT 1
/** @brief UART 诊断打印级别:0=仅温度/电压,1=温度/电压+CAN 统计。 */
#define CONFIG_UART_DIAG_LEVEL 1
/** @brief SPI 命令逐帧日志开关:0=关闭,1=开启。高速 CAN 桥接时应关闭。 */
#define CONFIG_SPI_APP_LOG_ENABLE 0
/** @brief CAN_SEND 成功帧详细日志开关:0=关闭,1=开启。开启会显著影响高速传输。 */
#define CONFIG_SPI_CAN_SEND_VERBOSE_LOG 0
/** @brief FWDGT 独立看门狗预分频值。 */
#define CONFIG_FWDGT_PSC FWDGT_PSC_DIV64
/** @brief FWDGT 独立看门狗重载值。
* 超时 = (64 / 40000) * (RLD + 1) = 1.6ms * (RLD+1)
* RLD=1874 → 1.6ms * 1875 ≈ 3.0s
*/
#define CONFIG_FWDGT_RLD 1874U
/** @brief FWDGT 超时近似值(毫秒),仅供文档参考。 */
#define CONFIG_FWDGT_TIMEOUT_MS 3000U
/* ============================================================
* APP 固件版本号
* ============================================================ */
/** @brief APP 主版本号。 */
#define APP_FW_VERSION_MAJOR 1U
/** @brief APP 次版本号。 */
#define APP_FW_VERSION_MINOR 2U
/** @brief APP 补丁版本号。 */
#define APP_FW_VERSION_PATCH 2U
/** @brief APP 构建编号。 */
#define APP_FW_VERSION_BUILD 0U
/* ============================================================
* BOOT 版本在 OTA 配置页中的 Flash 存储地址
* 与 BOOT 工程 sys/config.h 保持一致
* ============================================================ */
/** @brief OTA 配置页基地址。 */
#define CONFIG_OTA_CONFIG_PAGE_ADDR 0x0807E000U
/** @brief BOOT 版本存储地址(word 6,低 32 位:major|minor)。 */
#define CONFIG_BOOT_VERSION_ADDR0 (CONFIG_OTA_CONFIG_PAGE_ADDR + 0x18U)
/** @brief BOOT 版本存储地址(word 7,低 32 位:patch|build)。 */
#define CONFIG_BOOT_VERSION_ADDR1 (CONFIG_OTA_CONFIG_PAGE_ADDR + 0x1CU)
/** @brief OTA 配置页总 word 数(6 个 OTA 标志 + 2 个 BOOT 版本)。 */
#define CONFIG_OTA_CONFIG_WORD_COUNT 8U
/* ============================================================
* NVIC 优先级分组与中断优先级分层
* (EtherCAT 实时架构改造:PRE4_SUB0,4 位抢占优先级)
* ============================================================ */
/** @brief NVIC 优先级分组:4 位抢占 + 0 位子优先级。 */
#define CONFIG_NVIC_PRIORITY_GROUP NVIC_PRIGROUP_PRE4_SUB0
/** @brief EtherCAT SYNC0 周期中断抢占优先级(最高,永不被阻塞)。 */
#define CONFIG_IRQ_PREEMPT_ETHERCAT_SYNC 0U
/** @brief 调度器定时器抢占优先级。 */
#define CONFIG_IRQ_PREEMPT_SCHED 1U
/** @brief CAN RX0 抢占优先级。 */
#define CONFIG_IRQ_PREEMPT_CAN 2U
/** @brief EtherCAT ESC 事件中断抢占优先级(可被 SYNC0 抢占)。 */
#define CONFIG_IRQ_PREEMPT_ETHERCAT_ESC 1U
/** @brief EtherCAT SYNC1 备用抢占优先级。 */
#define CONFIG_IRQ_PREEMPT_ETHERCAT_SYNC1 1U
/** @brief SPI / EXTI / USART 抢占优先级(最低)。 */
#define CONFIG_IRQ_PREEMPT_SPI_USART 3U
/* ============================================================
* 主循环与实时策略
* ============================================================ */
/** @brief 主循环 WFI 开关:0=关闭(忙等,适配 EtherCAT),1=开启(省电)。 */
#define CONFIG_MAIN_LOOP_WFI_ENABLE 0
/* ============================================================
* EtherCAT LAN9252 使能与配置
* ============================================================ */
/** @brief SYNC0 同步模式:0=EXTI 外部触发(ESC 硬件同步,默认),1=TIMER0 降级(DC 未同步时)。 */
#define CONFIG_ETHERCAT_SYNC_MODE 0
/** @brief periodicIsr 最大执行时间告警阈值(µs)。实测超过此值需评估减小 PDO 大小或优化 EXMC 时序。
* 当前阈值 5µs:基于 180MHz + 32 字节 PDO + EXMC 6 HCLK 时序的估算上限。
* preempt=0 ISR 阻塞窗口 ≤ 此阈值时,CAN/SPI 中断需容忍。
* @note 启用 ESC 后需根据实测 HCLK 数重新评估。 */
#define CONFIG_ETHERCAT_ISR_MAX_US_THRESHOLD 5U
/** @brief 输入 PDO(TxPDO)在 PDI 内存区的起始偏移。
* 对应 LAN9252 SyncManager 内存映射,需与主站 ESI 配置匹配。
* @note 占位值,实际数值待主站配置确定后在集成阶段填入。 */
#define CONFIG_ESC_PDI_INPUT_OFFSET 0x1000U
/** @brief 输出 PDO(RxPDO)在 PDI 内存区的起始偏移。
* 对应 LAN9252 SyncManager 内存映射,需与主站 ESI 配置匹配。
* @note 占位值,实际数值待主站配置确定后在集成阶段填入。 */
#define CONFIG_ESC_PDI_OUTPUT_OFFSET 0x1200U
/* ---------- EXMC 引脚配置(GD32E508 EXMC 标准映射) ---------- */
/** @brief EXMC NOR/SRAM Region1 基址(NE1 片选)。 */
#define CONFIG_ESC_EXMC_BASE_ADDR 0x60000000U
/** @brief EXMC BANK 选择(BANK0 Region1)。
* @note EXMC 库未纳入编译时回退为 0U;启用 EtherCAT 时 EXMC 组件将被引入。 */
#ifdef EXMC_BANK0_NORSRAM_REGION1
#define CONFIG_ESC_EXMC_BANK_NOR_SRAM_REGION1 EXMC_BANK0_NORSRAM_REGION1
#else
#define CONFIG_ESC_EXMC_BANK_NOR_SRAM_REGION1 0U
#endif
/* ---------- ESC 中断引脚(PB0/PB1/PB2,三个独立 EXTI 向量) ---------- */
/** @note 保留 PA0 给未来 STANDBY 模式唤醒(WKUP_PIN0)。 */
#define CONFIG_ESC_SYNC0_PORT GPIOB
#define CONFIG_ESC_SYNC0_PIN GPIO_PIN_0
#define CONFIG_ESC_SYNC0_EXTI EXTI_0
#define CONFIG_ESC_SYNC0_IRQn EXTI0_IRQn
#define CONFIG_ESC_SYNC0_EXTI_SOURCE_PORT GPIO_PORT_SOURCE_GPIOB
#define CONFIG_ESC_SYNC0_EXTI_SOURCE_PIN GPIO_PIN_SOURCE_0
#define CONFIG_ESC_IRQ_PORT GPIOB
#define CONFIG_ESC_IRQ_PIN GPIO_PIN_1
#define CONFIG_ESC_IRQ_EXTI EXTI_1
#define CONFIG_ESC_IRQ_IRQn EXTI1_IRQn
#define CONFIG_ESC_IRQ_EXTI_SOURCE_PORT GPIO_PORT_SOURCE_GPIOB
#define CONFIG_ESC_IRQ_EXTI_SOURCE_PIN GPIO_PIN_SOURCE_1
#define CONFIG_ESC_SYNC1_PORT GPIOB
#define CONFIG_ESC_SYNC1_PIN GPIO_PIN_2
#define CONFIG_ESC_SYNC1_EXTI EXTI_2
#define CONFIG_ESC_SYNC1_IRQn EXTI2_IRQn
#define CONFIG_ESC_SYNC1_EXTI_SOURCE_PORT GPIO_PORT_SOURCE_GPIOB
#define CONFIG_ESC_SYNC1_EXTI_SOURCE_PIN GPIO_PIN_SOURCE_2
/* ---------- EXMC 数据/控制线引脚(GD32E508 标准映射) ---------- */
#define CONFIG_EXMC_D0_PORT GPIOD
#define CONFIG_EXMC_D0_PIN GPIO_PIN_14
#define CONFIG_EXMC_D1_PORT GPIOD
#define CONFIG_EXMC_D1_PIN GPIO_PIN_15
#define CONFIG_EXMC_D2_PORT GPIOD
#define CONFIG_EXMC_D2_PIN GPIO_PIN_0
#define CONFIG_EXMC_D3_PORT GPIOD
#define CONFIG_EXMC_D3_PIN GPIO_PIN_1
#define CONFIG_EXMC_D4_PORT GPIOE
#define CONFIG_EXMC_D4_PIN GPIO_PIN_7
#define CONFIG_EXMC_D5_PORT GPIOE
#define CONFIG_EXMC_D5_PIN GPIO_PIN_8
#define CONFIG_EXMC_D6_PORT GPIOE
#define CONFIG_EXMC_D6_PIN GPIO_PIN_9
#define CONFIG_EXMC_D7_PORT GPIOE
#define CONFIG_EXMC_D7_PIN GPIO_PIN_10
#define CONFIG_EXMC_D8_PORT GPIOE
#define CONFIG_EXMC_D8_PIN GPIO_PIN_11
#define CONFIG_EXMC_D9_PORT GPIOE
#define CONFIG_EXMC_D9_PIN GPIO_PIN_12
#define CONFIG_EXMC_D10_PORT GPIOE
#define CONFIG_EXMC_D10_PIN GPIO_PIN_13
#define CONFIG_EXMC_D11_PORT GPIOE
#define CONFIG_EXMC_D11_PIN GPIO_PIN_14
#define CONFIG_EXMC_D12_PORT GPIOE
#define CONFIG_EXMC_D12_PIN GPIO_PIN_15
#define CONFIG_EXMC_D13_PORT GPIOD
#define CONFIG_EXMC_D13_PIN GPIO_PIN_8
#define CONFIG_EXMC_D14_PORT GPIOD
#define CONFIG_EXMC_D14_PIN GPIO_PIN_9
#define CONFIG_EXMC_D15_PORT GPIOD
#define CONFIG_EXMC_D15_PIN GPIO_PIN_10
#define CONFIG_EXMC_A16_PORT GPIOD
#define CONFIG_EXMC_A16_PIN GPIO_PIN_11
#define CONFIG_EXMC_NOE_PORT GPIOD
#define CONFIG_EXMC_NOE_PIN GPIO_PIN_4
#define CONFIG_EXMC_NWE_PORT GPIOD
#define CONFIG_EXMC_NWE_PIN GPIO_PIN_5
#define CONFIG_EXMC_NE1_PORT GPIOD
#define CONFIG_EXMC_NE1_PIN GPIO_PIN_7
#endif /* SYS_CONFIG_H */