2026-07-20 02:36:56 +08:00
|
|
|
|
/**
|
2026-05-10 17:28:14 +08:00
|
|
|
|
* @file config.h
|
|
|
|
|
|
* @brief 应用级集ä¸é…�置项定义。
|
|
|
|
|
|
* @note 用于统一管ç�†å½“å‰�项目ä¸å�¯è°ƒçš„外设ã€�æ—¶åº�ã€�通信与算法常é‡�。
|
|
|
|
|
|
*/
|
|
|
|
|
|
#ifndef SYS_CONFIG_H
|
|
|
|
|
|
#define SYS_CONFIG_H
|
|
|
|
|
|
|
2026-07-06 19:13:56 +08:00
|
|
|
|
#include <stdint.h>
|
2026-07-16 23:00:52 +08:00
|
|
|
|
#include <stddef.h>
|
2026-07-06 19:13:56 +08:00
|
|
|
|
#include "gd32e50x.h"
|
|
|
|
|
|
|
2026-07-20 02:36:56 +08:00
|
|
|
|
/* ============================================================
|
|
|
|
|
|
* 功能开关(调试/特性总闸 — 改这里��开关,改完�编)
|
|
|
|
|
|
* 0/false=关,1/true=开。需� #if 的�留 #define。
|
|
|
|
|
|
* ============================================================ */
|
2026-07-26 20:39:59 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 5s 诊æ–任务是å�¦è¾“出全é‡� UART 摘è¦�(task_runner)。
|
|
|
|
|
|
* @note 任务本身始终 5s 调度:0=默认仅状��化/错误增�;1=周期打� ADC/CAN/ECAT 全�行。
|
|
|
|
|
|
* 现场抓��/温度时改回 1 ��编��。
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_UART_TEMP_PERIODIC_PRINT 0
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 全�摘�详细级别(仅 PERIODIC_PRINT=1 时生效;0=ADC 精简 1=� CAN 统计)。
|
|
|
|
|
|
* @note 默认 0;需è¦� can_tx/rx/drop ç‰åˆ—时与 PERIODIC_PRINT 一并打开。
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_UART_DIAG_LEVEL 0
|
2026-07-20 02:36:56 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief SPI 调试�馈 0xC4:GD32 ADC 温度/VDDA/VIN 1Hz 主动推�。
|
|
|
|
|
|
* @note 调试用;0=�注册 handler��推�。与 ESP32 GD32_ADC_FEEDBACK_ENABLE �对。
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_SPI_ADC_FEEDBACK_ENABLE 1
|
2026-07-26 20:39:59 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 多电机状æ€�表 0xC5:CAN STATUS å¸§ç¼“å˜ + 250ms 主动推é€�。
|
|
|
|
|
|
* @note 0=�注册 handler��推���解� STATUS 帧。与 ESP32 端 motor_state_task �对。
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_MOTOR_STATE_ENABLE 1
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 多电机版本 0xC6:CAN 版本应ç”帧(0x00FF)ç¼“å˜ + 事件驱动推é€�。
|
|
|
|
|
|
* @note 0=ä¸�识别版本帧ã€�ä¸�推é€�。与 ESP32 端 motor_version 缓å˜é…�对。
|
|
|
|
|
|
* 版本为按需查询的低频数�,独立于 0xC5 周期推�。
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_MOTOR_VERSION_ENABLE 1
|
|
|
|
|
|
/** @brief 最大电机节点数 (node ID 1-9)。 */
|
|
|
|
|
|
constexpr uint8_t CONFIG_MOTOR_MAX_NODES = 9U;
|
|
|
|
|
|
/** @brief 电机离线判定超时 (ms)ã€‚è¶…è¿‡æ¤æ—¶é—´æœªæ”¶åˆ° STATUS å¸§åˆ™æ ‡è®° offline。 */
|
|
|
|
|
|
constexpr uint16_t CONFIG_MOTOR_OFFLINE_MS = 3000U;
|
2026-07-20 02:36:56 +08:00
|
|
|
|
/** @brief SPI 命令�帧日志(#if)。 */
|
|
|
|
|
|
#define CONFIG_SPI_APP_LOG_ENABLE 0
|
|
|
|
|
|
/** @brief CAN_SEND �功帧详细日志(#if)。 */
|
|
|
|
|
|
#define CONFIG_SPI_CAN_SEND_VERBOSE_LOG 0
|
2026-07-26 20:39:59 +08:00
|
|
|
|
/** @brief CAN-FD BRS 使能(canfd.cpp #if)。
|
|
|
|
|
|
* å…³é— BRS: æ•°æ�®æ®µç”¨ä»²è£�段å�Œé€ŸçŽ‡ï¼Œç‰¢ç‰¢æ€§æ›´é«˜ã€‚
|
|
|
|
|
|
* 电机 BOOT æ— æ³•æ£ç¡®æŽ¥æ”¶ BRS 高速段→nonce(16B FD+BRS)被拒ç»�→æ�¡æ‰‹å¤±è´¥ã€‚ */
|
2026-09-01 03:07:48 +08:00
|
|
|
|
#define CONFIG_CAN_FD_BRS_ENABLE 1U
|
2026-07-20 02:36:56 +08:00
|
|
|
|
/** @brief å�¯åŠ¨æ—¶æ€»çº¿æŽ¢æµ‹å¸§ï¼›æ£å¸¸å›ºä»¶å…³ã€‚ */
|
|
|
|
|
|
#define CONFIG_CAN_STARTUP_BUS_TEST_ENABLE 0
|
|
|
|
|
|
/** @brief å�¯åŠ¨æ—¶å†…éƒ¨å›žçŽ¯è‡ªæ£€ï¼›æ£å¸¸å›ºä»¶å…³ã€‚ */
|
|
|
|
|
|
#define CONFIG_CAN_STARTUP_LOOPBACK_TEST_ENABLE 0
|
|
|
|
|
|
/** @brief CAN å�¯åŠ¨è¯¦ç»†è¯Šæ– dump;默认关。 */
|
|
|
|
|
|
#define CONFIG_CAN_STARTUP_DIAG_VERBOSE 0
|
2026-07-26 20:39:59 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 周期测试��任务(taskCanTxSend,� 0x18FF5000 64B FD 帧)。
|
|
|
|
|
|
* @note 调试用:该 PGN æ— ä¸šåŠ¡æŽ¥æ”¶èŠ‚ç‚¹ ACK。auto_retrans=ENABLE æ—¶æ— ACK 被
|
|
|
|
|
|
* æ— é™�é‡�å�‘å�žè¿› TEC(TEC 一直涨);DISABLE æ—¶å�•å�‘失败å�³ MTEn→error_count++。
|
|
|
|
|
|
* ç”µæœºæ‹“æ‰‘ä¸‹æ— å¯¹ç«¯åº”ç”,默认关以消除æŒ�ç»é”™è¯¯å¸§ã€‚需è¦�回放测试波形时打开。
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_CAN_PERIODIC_TEST_TX_ENABLE 0
|
|
|
|
|
|
/** @brief CAN0/1/2 通é�“使能。CH1/CH2 未接设备,关é—é�¿å…�æŒ�ç» CAN 错误 + å� SPI 带宽。 */
|
2026-07-20 02:36:56 +08:00
|
|
|
|
constexpr bool CONFIG_CAN_CH0_ENABLE = true;
|
2026-07-30 02:11:49 +08:00
|
|
|
|
constexpr bool CONFIG_CAN_CH1_ENABLE = true;
|
|
|
|
|
|
constexpr bool CONFIG_CAN_CH2_ENABLE = true;
|
2026-07-20 02:36:56 +08:00
|
|
|
|
/** @brief 主循环 WFI(main.cpp #if)。 */
|
|
|
|
|
|
#define CONFIG_MAIN_LOOP_WFI_ENABLE 0
|
|
|
|
|
|
/** @brief EtherCAT SYNC0 å�Œæ¥æ¨¡å¼�(#if)。 */
|
|
|
|
|
|
#define CONFIG_ETHERCAT_SYNC_MODE 0
|
2026-07-27 01:49:18 +08:00
|
|
|
|
/** @brief MOTOR-OTA INFO 级日志(�手/进度/�控 chatter);错误与关键事件��留。 */
|
|
|
|
|
|
#define CONFIG_OTA_RELAY_LOG_ENABLE 1
|
|
|
|
|
|
/** @brief CAN �始化/自检 INFO 级日志;�始化失败与硬件错误��留。 */
|
|
|
|
|
|
#define CONFIG_CAN_INIT_LOG_ENABLE 1
|
|
|
|
|
|
/** @brief EtherCAT/EXMC �始化 INFO 级日志;FAIL ��留。 */
|
|
|
|
|
|
#define CONFIG_ECAT_INIT_LOG_ENABLE 1
|
2026-09-02 02:38:35 +08:00
|
|
|
|
/** @brief HBI bring-up è¯Šæ–æŽ¢é’ˆï¼ˆbit-bang 探活 + predrive/回显 + 20s 周期å¤�跑)。
|
|
|
|
|
|
* @note 硬件层已确认全通(IDX_0=0x1234ã€�BYTE_TEST=0x87654321),默认关é—以清ç�†ä¸Šç”µæ—¥å¿—,
|
|
|
|
|
|
* 并���次上电/� 20s 把 EXMC 引脚切� GPIO 手动拉一�。��/补焊需�新排查浮空时置 1。
|
|
|
|
|
|
* ç½‘é¡µä¸‡ç”¨è¡¨é€šæ–æµ‹è¯• continuityDrive() ä¸�å�—æ¤å¼€å…³å½±å“�,始终å�¯ç”¨ã€‚ */
|
|
|
|
|
|
#define CONFIG_ESC_EXMC_DIAG 0
|
2026-07-27 01:49:18 +08:00
|
|
|
|
/** @brief �动横幅与 main 进度打�。 */
|
|
|
|
|
|
#define CONFIG_APP_BANNER_LOG_ENABLE 1
|
|
|
|
|
|
|
|
|
|
|
|
/* ============================================================
|
|
|
|
|
|
* 日志分级�:*_LOGI=INFO 级,由上方模�开关编译期�剪,
|
|
|
|
|
|
* æ ¼å¼�串éš�之被链接器回收;LOG_ERR=错误/关键事件,æ�’ä¿�留。
|
|
|
|
|
|
* 使用文件需自行�� printf 声明(<cstdio>)。
|
|
|
|
|
|
* ============================================================ */
|
|
|
|
|
|
#define LOG_ERR(...) printf(__VA_ARGS__)
|
|
|
|
|
|
#if CONFIG_OTA_RELAY_LOG_ENABLE
|
|
|
|
|
|
#define OTA_LOGI(...) printf(__VA_ARGS__)
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define OTA_LOGI(...) ((void)0)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if CONFIG_CAN_INIT_LOG_ENABLE
|
|
|
|
|
|
#define CAN_LOGI(...) printf(__VA_ARGS__)
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define CAN_LOGI(...) ((void)0)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if CONFIG_ECAT_INIT_LOG_ENABLE
|
|
|
|
|
|
#define ECAT_LOGI(...) printf(__VA_ARGS__)
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define ECAT_LOGI(...) ((void)0)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if CONFIG_APP_BANNER_LOG_ENABLE
|
|
|
|
|
|
#define APP_LOGI(...) printf(__VA_ARGS__)
|
|
|
|
|
|
#else
|
|
|
|
|
|
#define APP_LOGI(...) ((void)0)
|
|
|
|
|
|
#endif
|
2026-07-20 02:36:56 +08:00
|
|
|
|
|
2026-07-06 19:13:56 +08:00
|
|
|
|
/* ============================================================
|
|
|
|
|
|
* APP 固件版本�
|
|
|
|
|
|
* ============================================================ */
|
|
|
|
|
|
constexpr uint32_t APP_FW_VERSION_MAJOR = 1U;
|
2026-07-27 01:49:18 +08:00
|
|
|
|
constexpr uint32_t APP_FW_VERSION_MINOR = 5U;
|
2026-09-05 20:07:22 +08:00
|
|
|
|
constexpr uint32_t APP_FW_VERSION_PATCH = 63U; /* 1.5.63:负载率定义收窄——1.5.61 实机实测æ�’ 99.4%ï¼Œæ ¹å› æ˜¯ runPending æ¯�åœˆæ— æ�¡ä»¶è·‘ SSC MainLoop 轮询/å�„ poll() 检查,把常开轮询计入 busy å�ŽæŒ‡æ ‡é¥±å’Œå¤±åŽ»å�‚考价值。改为å�ªè®¡ã€Œä¸æ– + é�žå»¶è¿Ÿå¤„ç�†æ®µã€�å� 墙钟比:ISR 挂钩ä¸�å�˜(TIMER2/SysTick/EXTI0/1/2/TIMER0/CAN0-2 RX+TX/SPI0+EXTI10_15/USART0,DC 模å¼� Sync0 çš„ EXMC 过程数æ�®æ�¬è¿�ä»�计入),主循环侧撤销整圈 begin/end,改为 task_runner.cpp 三段(0xB0 è¿› BOOT 处ç�†ã€�MotorOtaRelay isActive() 门控的 relay 推进ã€�takePending 任务派å�‘段)挂 begin/end,常开轮询(Watchdog/AppSpiCommandBus.poll/MainLoop/ALE mask guard)与 NOP 空转ä¸�计入;1s 窗å�£æ»šåŠ¨ä»Ž endWork 挪到主循环æ¯�åœˆæ— æ�¡ä»¶è°ƒç”¨çš„ CpuLoad::tick(),空闲系统 seq 也按秒推进。PDO 段 5 布局/上报链路ä¸�å�˜ã€‚ 1.5.62:编译è¦å‘Šæ¸…ç�†(固件行为零改动,生æˆ�代ç �与清ç�†å‰�一致)。(1) config.h 历å�²æ³¨é‡Šé‡ŒåµŒå¥—çš„ 1.5.47~1.5.51 å�—æ³¨é‡Šç¬¦ä½¿å‡ ä¹Žæ¯�个编译å�•元报 -Wcomment,改用ã€�1.5.4xã€‘æ ‡æ³¨;(2) SSC sdoserv.c 3 处对 packed æˆ�员 CoeHeader å�–å�€å¼ºè½¬ UINT16 指针报 -Waddress-of-packed-member,ç»� UINT32 æ•´åž‹ä¸è½¬æ¶ˆé™¤(邮箱缓冲实际å�¶å¯¹é½�,指令ä¸�å�˜);(3) SSC objdef.c 2 å¤„æŒ‡é’ˆæˆªæ–æŠ¥ -Wpointer-to-int-castâ€”â€”å…¶ä¸ MEM_ADDR å¼ºè½¬å› MEM_ADDR=UINT16(ecat_def.h:390) 会把 32 ä½�指针截æˆ� 16 ä½�,是 ENUM 奇地å�€è·¯å¾„的潜在 bug(本项目对象å—å…¸ä¸�å�« ENUM 实际ä¸�执行),改用 UINT32 ä¿�真并顺带修æ£;(4) å�¯åŠ¨æ–‡ä»¶ startup_gd32e50x_cl.s èµ° legacy armasm:cproject.yml çš„ ASM misc 增 -Wno-unused-command-line-argument(消 armclang 驱动 4 æ�¡å�‚数未使用告è¦)与 -Wa,armasm,--diag_suppress=A1950W(消 armasm 弃用告è¦),已用真实工具链实测通过ã€�对象文件仅内嵌命令行å—符串有差异。 1.5.61:DCU_APP CPU 负载率ç»� EtherCAT 上报。新增 sys/cpu_load.{h,cpp}:DWT CYCCNT 计时ã€�ä¸»å¾ªçŽ¯ä»»åŠ¡ä¸ŽæŒ‚é’©ä¸æ–(TIMER2/SysTick/EXTI0/1/2/TIMER0/CAN0-2 RX+TX/SPI0/EXTI10_15/USART0)计入å�Œä¸€ busy 区间求并集(å�•æ ¸å†…ä»»æ„�优先级嵌套ä¸�é‡�ä¸�æ¼�,LDREX/STREX 原å�å��议,çƒè·¯å¾„ .ramfunc 与 onSync0Exti å�Œæ¬¾ï¼Œä¸�ç»™ Sync0 å…¥å�£æ·» flash 抖动),1s 滚动窗å�£å‡º 0.1% 分辨率负载率。数值写入输入 PDO 段 5 诊æ–区(632..639,批é‡�接收区最å��å� 用 580 之å�Žæ°¸ä¹…空闲的尾部,å�ªè¿½åŠ ä¸�动既有å��移,PDO 长度/SII/ESI å�‡ä¸�å�˜æ— 需é‡�刷 EEPROM):ECAT_DIAG_OFF_LOAD u16 LE(å�•ä½� 0.1%) + ECAT_DIAG_OFF_SEQ u32 LE(窗å�£åº�å�·)。主站 tools/ecat ecat_native.c decode_input è§£ç �å�Žç»� /api/app/load 暴露,tools/ESP32 OTA 页「è¿�è¡ŒæŒ‡æ ‡ã€�å�¡ç»� /ecat/api 代ç�† 1Hz 轮询显示「GD32 è´Ÿè½½ã€�。1.5.60:SM2 事件路径自愈补全——SM2 事件路径自愈补全——2026-09-05 真机 250µs(4kHz) 档主站楔æ»çœ‹é—¨ç‹—æ¯� 20~35s é‡�拉一次(wr 两å°�æ—¶ +38)ã€�从站槽ä½�æ›´æ–° 4200/s 塌到 28/s çš„æ ¹å› åŠ å›ºã€‚(a) dc_app.c 守护(1) åŠ å›ºï¼šæœŸæœ›å€¼ u16ALEventMask 本身å�¯èƒ½ç¼º PROCESS_OUTPUT_EVENT——下行转æ�¢(ecatslv.c AL_ControlInd 尾部)清 0x204/bEscIntEnabled/bEcatFirstOutputsReceived å�Žï¼ŒSAFEOP é‡�å…¥(SetALEventMask @:1506)没走全时 0x204 丢ä½�,而旧判定 actual⊇期望 在错的是期望值时æ�’通过ã€�缺ä½�永远补ä¸�回;现先补期望å†�比对。(b) dc_app.c 新增自愈(3):OP æ€� bEscIntEnabled==FALSE ä¸�å�¯å�ˆæ³•出现(下行尾 :1273 清,é‡�å…¥æ¼�æ�¢å¤�段å�³ OP 带门关)→ PDI_Isr 整体被门控(ecatappl.c:282)ã€�PDO_OutputMapping å�œè°ƒã€�è¾“å…¥å†»ç»“â€”â€”æ£æ˜¯ä¸»ç«™æ¥”æ»çœ‹é—¨ç‹—盯的窗å�£å›žæ˜¾å†»ç»“;守护é‡�开门 + åº”ç”æŒ‚èµ· SM2 事件,250ms 节æ‹�内自愈,主站 2s é˜ˆå€¼ä»Žæ¤æ‘¸ä¸�到触å�‘æ�¡ä»¶ã€‚本版首次æ�ºå¸¦ 1.5.59 çš„ mailbox 构建期常é‡� + PDI å—节åº�ä¿®å¤�出固件(该轮改动æ¤å‰�å�ªè�½åœ¨ dc_app.c/mailbox.c,config.h 未记档)。 1.5.58:修å¤� EtherCAT 链路 CONFIG å›žæ˜¾ç›®æ ‡å€¼å�¶å�‘离谱浮点(如 -3.2e26°)ã€‚æ ¹å› ï¼šæ¡¥æ®µ 1/段 3"最近一帧快照"æ˜¯å¤šå—æ®µä¸€ç
|
2026-09-05 16:54:38 +08:00
|
|
|
|
03:00 主站侧探针钉æ»å®Œæ•´è¯�æ�®é“¾(æ¥”æ»æ€�ã€�未æ–电):
|
|
|
|
|
|
(1) ESC/SSC 邮箱处�全程活�:手动注入�法 CoE 请求(写满 SM0 256B)� 200ms 内 SM1 出�应;
|
|
|
|
|
|
(2) 但å“�应帧头出现在 SM1 start+8 而é�ž start(é€�会è¯�累积:第一轮 +4ã€�å�Žç» +8),å‰� 8 å—节全零;
|
|
|
|
|
|
(3) 网络侧(FPRD)读 SM0/SM1 寄å˜å™¨æ�’æ£ç¡®(start=0x1000/0x1200,ctl=0x26/0x22,act=01);
|
|
|
|
|
|
=> SSC 的 u16EscAddrSendMbx(Init→PreOP 时� GetSyncMan→CSR 间接读)拿到了错值,�应写到错�地�,
|
|
|
|
|
|
主站按�议从 0x1200 读永远对�上帧头 → SOEM 报 WkcError/MailboxError;且预清��枚举
|
|
|
|
|
|
(é‡�è·‘ StartMailboxHandler é‡�读)ä»�é”™ → æ»é”�,æ–电æ‰�清零。错ä½�é€�会è¯� +4(DWORD 粒度)指å�‘
|
|
|
|
|
|
HBI 访问层状æ€�残留(CSR 间接读或 PRAM 引擎,æˆ�å› å¾…ä¸²å�£æ—¥å¿—确凿——两ç§�æˆ�å› ä¸‹è¿°è‡ªæ„ˆå�‡æœ‰æ•ˆ)。
|
|
|
|
|
|
ä¿®å¤�:EcatDbg_GuardAleventMask 扩展自愈(0):AL>=PREOP 且 bMbxRunning æ—¶,读 SM 寄å˜å™¨çœŸå€¼
|
|
|
|
|
|
(0x0800/0x0808 çš„ start/len)与 SSC 缓å˜(u16EscAddrReceiveMbx/SendMbx/Receive/SendMbxSize)比对,
|
|
|
|
|
|
失é…�å�³å†™å›ž+WARN(旧值/寄å˜å™¨å€¼ä¸€å¹¶æ‰“å�°â€”—下次串å�£å¤�现一行å�³åŒºåˆ†"CSR 读错"还是"å�˜é‡�污染")。
|
|
|
|
|
|
å�˜é‡�仅在 Stop/StartMailboxHandler(主循环上下文)被写,守护å�Œä¸Šä¸‹æ–‡æ— å¹¶å�‘。
|
|
|
|
|
|
守护周期 1s→250ms(task_runner ethercatAleMaskGuard,节�� g_app_uptime_sec→g_scheduler.tick_1ms):
|
|
|
|
|
|
自愈必须快过主站 SDO 超时(~700ms),�则永远�在主站放弃之�形�虚设。
|
|
|
|
|
|
邮箱自愈+主站侧预清ç�†(ecat_server.py 1.5.51)+自动é‡�试三层å� åŠ :é”™ä½�å�‘生 → 250ms 内写回 →
|
|
|
|
|
|
主站é‡�试æˆ�功,彻底消除"æ–电æ‰�æ�¢å¤�"。
|
|
|
|
|
|
主站工具å�Œæ¥(tools/ecat/ecat_server.py):config_map 失败转储扩展为全部 4 个 SM 寄å˜å™¨
|
|
|
|
|
|
(0x0800..0x081F;æ¤å‰� 0x0810/0x0818 æ›¾è¯¯æ ‡ä¸º SM0/SM1,实为 SM2/SM3——已修æ£),
|
2026-09-05 20:07:22 +08:00
|
|
|
|
并注明"SM0/SM1 é…�ç½®æ£å¸¸å�´æŒ�ç»å¤±è´¥=SSC 邮箱地å�€é”™ä½�楔æ»"的判别法。 ã€�1.5.51】主站工具修å¤�"å��å¤�å�¯å�œå�Žå�¡ä½�→闪退"(tools/ecat/ecat_server.py),GD32 功能代ç �零改动(æ— éœ€é‡�新烧录;bump 仅为å�˜æ›´è®°å½•与编译纪律)。
|
2026-09-05 16:54:38 +08:00
|
|
|
|
02:05 å¤�现脚本(faulthandler)é’‰æ»é—ªé€€æ ¹å› :å�Œä¸€è¿žæŽ¥å†…å��å¤� op/start↔op/stop ä¸�é‡�枚举时,从站邮箱é€�轮退化
|
|
|
|
|
|
(第 2 轮起 OP � SDO 读 0x2000 全 WkcError——�用户日志"报个读�失败"),第 4 轮 config_map() 内 SOEM CoE
|
|
|
|
|
|
分段读(ethercatcoe.c ecx_SDOread çš„ memcpy æ— è¾¹ç•Œæ£€æŸ¥,上游缺陷)å�ƒåˆ°æ¥”æ»é‚®ç®±çš„é”™ä½�帧 → 原生访问è¿�例
|
|
|
|
|
|
(0xC0000005) → æœ�务å�进程闪退ã€�GUI 连带退出——与用户 01:40 日志é€�行å�»å�ˆ(01:40:30"进入 OP"å�Ž
|
|
|
|
|
|
æ— ä»»ä½•è¾“å‡º=进程æ»åœ¨ config_map,å“�应未å�Šå›žä¼ ,"å�¡ä½�"å�³ SOEM 分段循环æ»å¾ªçޝ)。
|
|
|
|
|
|
ä¿®å¤�:_require_op_ready å…¥å�£æ— æ�¡ä»¶"回 INIT|ACK + config_init é‡�枚举"预清ç�†(ç‰æ•ˆå®žæµ‹æ�’有效的
|
|
|
|
|
|
"æ–å¼€é‡�连",å�•从站æˆ�本 ~100ms),api_op_start 自动é‡�试简化为直接é‡�è·‘;å�¦ä¿® ecat_server.py 第 99 行
|
|
|
|
|
|
上一轮编辑粘连("g_op_active = Falseg_httpd = None" 被 Python 当链�赋值,g_httpd 全局缺失�
|
|
|
|
|
|
g_op_active åˆ�值错æˆ� None,å…¨é� falsy 侥幸工作);config_map 失败分支新增邮箱 SM 寄å˜å™¨çŽ°åœºè½¬å‚¨
|
|
|
|
|
|
(0x0810/0x0818 � 8B,start/len/ctl/status/activate/pdi)。
|
|
|
|
|
|
02:12 探针进一æ¥å®šæ€§(æ¥”æ»æ€�ã€�未æ–电):AL 状æ€�机活ç�€(PREOP/SAFEOP 都 ack)但 SSC 完全ä¸�处ç�†é‚®ç®±â€”—
|
|
|
|
|
|
SM0/SM1 activate/StartAddr 异常(INIT �读回全零�PREOP �读回 SII 值 ctl=0x64/0x20 act=0)�
|
|
|
|
|
|
config_map 跑完会�写全部 SM(SOI 使能)但 SDO �然全败�close+open 也救�回�
|
|
|
|
|
|
SOEM 读到的"错误帧" Detail=0x1300/0x2300/0x3300 éš�会è¯�递增(=邮箱计数器å—节模å¼�,读回的是错ä½�帧)。
|
|
|
|
|
|
结论:从站侧楔æ»ä¸ºå›ºä»¶å±‚问题(ç–‘ä¼¼ PDI 通路/AL Event Mask 0x204 实测=0x03F3 或 SSC 邮箱处ç�†æŒ‚èµ·),
|
|
|
|
|
|
主站任何手段(å�«æ–å¼€é‡�连)都救ä¸�回,å¿…é¡»æ–电é‡�å�¯â€”â€”ä»Žç«™æ ¹å› å¾…ä¸²å�£æŠ“å�–(下次å¤�现时串å�£
|
|
|
|
|
|
看主循环 5s 心跳 [ECAT][HB] 是��跳 + AEM WARN 是�出现)。
|
|
|
|
|
|
30 è½®å�¯å�œåŽ‹æµ‹:ä¿®å¤�å‰�第 4 轮必崩(0xC0000005);ä¿®å¤�å�Ž 30 轮零崩溃零å�¡æ»
|
2026-09-05 20:07:22 +08:00
|
|
|
|
(第 16 轮起从站进入上述硬楔æ»ã€�主站侧全部为å�¯æ�¢å¤�的干净报错,直至压测结æ�Ÿ)。 ã€�1.5.50】主站工具诊æ–盲区修å¤�(tools/ecat 两文件),GD32 功能代ç �零改动(æ— éœ€é‡�新烧录,æ�¿ä¸Š 1.5.49 å�³æœ€æ–°;bump 仅为å�˜æ›´è®°å½•与编译纪律)。01:31 å¤�测确认 1.5.48 的自动é‡�试机制工作æ£å¸¸:首败("è¿› PREOP 失败: AL=INIT code=0x0000")å�Žè‡ªåЍæ�¢å¤�,OP 真实建立ã€�UI 周期æ£ç¡®å¢žé•¿ã€‚é¦–è´¥æ ¹å› å®šä½�:å�œæ¢å›ž INIT æ—¶ SSC MBX_StopMailboxHandler ç¦�用了邮箱 SM0/SM1(mailbox.c:359-361),而 CheckSmSettings 在 INIT→PREOP è¦�求邮箱 SM 已使能(ecatslv.c:416-418),æ‹’ç»�è¿�ç§»ä¸”ä»Žç«™è‡ªèº«æ— é‡�新使能路径(æ»é”�é—环)——自动é‡�试里 config_init() é‡�写 SM0/SM1(ethercatconfig.c:279-280)æ£æ˜¯è§£è�¯,与"æ–å¼€é‡�连有效"å�Œæœºç�†ã€‚ä¿®å¤�:PREOP/SAFEOP 失败分支改用 read_state() å�–真实 AL Status Code(旧报文的 code=0x0000 是 SOEM å¹¿æ’ state_check ä¸�刷新 al_status 的陈旧缓å˜,与 OP 循环å�Œæ¬¾ç›²åŒº),下次首败将显示真实错误ç �(预期 0x0016/0x001D ç±» INVALIDMBXCFGINPREOP)确凿验è¯�æ ¹å› ã€‚ ã€�1.5.49】SM2 事件楔æ»è‡ªæ„ˆâ€”—01:03 串å�£æ—¥å¿—é’‰æ»çŽ°åœº(evt=0x0400 在 0x220 挂起 10s æ— äººå¤„ç�†ã€�escirq ä»… 2.6/s å�ªéš� AL Control 事件跳动ã€�9s ESM 超时报 0x001Bã€�[ECAT][AEM] 一次未打å�°=å…¶å‰�ç½® bEscIntEnabled==FALSE 未满足):PDI_Isr 被调用了 13 次å�´ä»Žæœªæ‰§è¡Œ SM2 分支(ecatappl.c:287 çš„ ALEvent&PROCESS_OUTPUT_EVENT 从未命ä¸),bEcatFirstOutputsReceived æ°¸ä¸�ç½®ä½�,SAFEOP→OP 挂到 ESM 超时。dc_app.c EcatDbg_GuardAleventMask() 扩展自愈(2):SAFEOP 下检测"0x220 bit10 挂起 + æ ‡å¿—æœªç½®ä½�"å�³ä»Žä¸»å¾ªçŽ¯ç›´æŽ¥æ›¿ PDI_Isr 完æˆ�工作——置ä½� bEcatFirstOutputsReceived + 读 SM2 首/末å—应ç”事件(ecatappl.c:317-320 å�Œæ¬¾)ï¼›å��è®®ç‰ä»·ï¼šbit10 挂起=主站已写过 SM2=WKC=3/3 ä½�è¯�çš„"收到输出"æˆ�立,AL_ControlRes 下一个 MainLoop 周期å�³å®Œæˆ� OP。守护(1) 0x204 缺ä½�自愈ä¿�留并解除 bEscIntEnabledå‰�ç½®(改判 AL>=SAFEOP+nPdOutputSize>0)。WARN æ�ºå¸¦å…¨éƒ¨å†…éƒ¨æ——æ ‡(bEscInt/bDcSync/mask_exp/mask_act/wd 看门狗状æ€�),下次å¤�现一行日志å�³å�¯å®šä½�楔æ»è·¯å¾„(嫌疑:bEscIntEnabled 被æŸ�路径æ„�外清零ã€�或 PDI_Isr 读 0x220 çš„ CSR 间接端å�£ç»“æžœä¸�å�« bit10)。自愈仅在 SAFEOP+æ ‡å¿—æœªç½®ä½�时触å�‘,OP æ€�下 LRW æ¯�周期置ä½�/清除 bit10 属æ£å¸¸ä¸�误报。1.5.48:修å¤�"å�œæ¢å›ž INIT å�Žé‡�è¿› OP"概率性挂起(SAFEOP+0x001B, WKC=3/3 但 9s ESM è¶…æ—¶æ‹’ç»�)。00:58 å¤�测è¯�æ�®é“¾å®šæ¡ˆ:主站 LRW WKC=3/3(输出确实写进 SM2)且看门狗 1000ms(ä¸�会被周期触å�‘)——唯一解释是 bEcatFirstOutputsReceived 未被置ä½�,è¯¥æ ‡å¿—å�ªåœ¨ PDI_Isr 收到 SM2 事件时置ä½�,而 IRQ 上报由 AL Event Mask(0x204) bit10 控制:第二次会è¯�ä¸ 0x204 æ„�外丢 SM2 ä½� → PDI_Isr æ°¸ä¸�触å�‘ → SAFEOP→OP 挂到 ESM 超时报 0x001B。第一次连接æˆ�功ã€�å�œæ¢é‡�连失败 = 状æ€�残留特å¾�(残留的确切æ�¥æº�由新增的 [ECAT][AEM] WARN 日志在下次å¤�现时æ�•获)。修å¤�(1)固件守护:dc_app.c 新增 EcatDbg_GuardAleventMask()(task_runner æ¯� 1s ç»� ethercatAleMaskGuard 调用,runPending 主路径挂载ä¸�ä¾�赖诊æ–任务频率)——从站 AL>=SAFEOP 且 bEscIntEnabled 且 nPdOutputSize>0 时读 0x204 实际值,缺 u16ALEventMask 任一ä½�å�³ HW_SetALEventMask 补写并打 WARN(actual/expect/restore 三值),PREOP/INIT ä¸�干预(SSC 本æ�¥å°±ä¸�ç½® SM2/SM3 ä½�)。修å¤�(2)主站工具(tools/ecat ecat_server.py):(a) OP ç‰å¾…循环æ¯� 1s SDO 读从站 0x2000:3(escirq 计数),å�œæ»žå�³ç›´æŽ¥æŠ¥"PDI_Isr 未触å�‘→0x204 丢 SM2 ä½�"判别性è¯�æ�®;(b) api_op_start 失败å�Žè‡ªåЍé‡�试一次:带 ACK 完整回 INIT(state_check 确认)+config_init é‡�枚举(é‡�写 SM/FMMU,ç‰æ•ˆ"æ–å¼€é‡�连"çš„æ ¸å¿ƒæ¥éª¤,实测该æ“�作能æ�¢å¤�)+完整åº�列é‡�è·‘,ç”¨æˆ·æ— éœ€æ‰‹åŠ¨æ–å¼€é‡�连。 ã€�1.5.48】修å¤�"å�œæ¢å›ž INIT å�Žé‡�è¿› OP"概率性挂起(SAFEOP+0x001B, WKC=3/3 但 9s ESM è¶…æ—¶æ‹’ç»�)
|
2026-07-15 02:49:37 +08:00
|
|
|
|
constexpr uint32_t APP_FW_VERSION_BUILD = 0U;
|
2026-07-06 19:13:56 +08:00
|
|
|
|
|
2026-05-10 17:28:14 +08:00
|
|
|
|
|
|
|
|
|
|
/** @brief USART0 默认波特率。 */
|
2026-07-26 20:39:59 +08:00
|
|
|
|
constexpr uint32_t CONFIG_USART0_BAUDRATE = 3000000U; /* 3Mï¼šè¯Šæ–æ‰“å�°é«˜é€Ÿè¾“出,printf 阻塞æž�å°�ã€�ä¸�æ‹–æ…¢ relay */
|
2026-05-10 17:28:14 +08:00
|
|
|
|
|
|
|
|
|
|
/** @brief ADC 外设实例。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ADC_INSTANCE = ADC0;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief ADC 外部 VIN 检测通��(原�图:PA6 -> VIN_ADC)。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ADC_VIN_CHANNEL = ADC_CHANNEL_6;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief ADC 内部温度通��。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ADC_TEMP_CHANNEL = ADC_CHANNEL_16;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief ADC 内部�考电压通��。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ADC_VREFINT_CHANNEL = ADC_CHANNEL_17;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief ADC 满�程计数值。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr float CONFIG_ADC_MAX_VALUE = 4095.0f;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief 内部�考电压典型值,�� V。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr float CONFIG_ADC_VREFINT_TYPICAL_VOLTAGE = 1.20f;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief æ¸©åº¦ä¼ æ„Ÿå™¨ 25℃ 对应电压,å�•ä½� V。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr float CONFIG_ADC_TEMP_V25 = 1.43f;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief æ¸©åº¦ä¼ æ„Ÿå™¨å¹³å�‡æ–œçŽ‡ï¼Œå�•ä½� V/℃。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr float CONFIG_ADC_TEMP_AVG_SLOPE = 0.0043f;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief ADC 上电å�Žç¨³å®šç‰å¾…时间,å�•ä½� ms。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ADC_STABILIZE_DELAY_MS = 2U;
|
2026-05-30 00:24:31 +08:00
|
|
|
|
/** @brief ADC ä¸å€¼æ»¤æ³¢çª—å�£é•¿åº¦ï¼ˆæœ€ç»ˆæ ·æœ¬æ•°ä¸ºè¯¥å€¼ + 1)。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ADC_FILTER_SIZE = 6U;
|
2026-05-30 00:24:31 +08:00
|
|
|
|
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief CAN 状æ€�æŠ¥æ–‡æ ‡å‡†å¸§ ID。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_STATUS_ID = 0x321U;
|
2026-05-30 00:24:31 +08:00
|
|
|
|
/** @brief ESP32 请求 DCU_APP 进入 Bootloader OTA 窗�的扩展帧 ID(备用 CAN 入�)。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_OTA_BOOT_REQ_ID = 0x00000320U;
|
|
|
|
|
|
/** @brief 进入 Bootloader OTA è¯·æ±‚é”æœ¯å—节 0~3。 */
|
|
|
|
|
|
constexpr uint8_t CONFIG_CAN_OTA_BOOT_MAGIC0 = 0x4FU;
|
|
|
|
|
|
constexpr uint8_t CONFIG_CAN_OTA_BOOT_MAGIC1 = 0x54U;
|
|
|
|
|
|
constexpr uint8_t CONFIG_CAN_OTA_BOOT_MAGIC2 = 0x41U;
|
|
|
|
|
|
constexpr uint8_t CONFIG_CAN_OTA_BOOT_MAGIC3 = 0x21U;
|
2026-05-30 00:24:31 +08:00
|
|
|
|
/** @brief ESP32 在 APP �行期通过 SPI ��的进入 Bootloader OTA 命令。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint8_t CONFIG_SPI_APP_OTA_BOOT_CMD = 0xB0U;
|
2026-05-30 00:24:31 +08:00
|
|
|
|
/** @brief SPI 进入 Bootloader OTA 命令确认状�:�功。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint8_t CONFIG_SPI_APP_OTA_BOOT_ACK_OK = 0xB5U;
|
2026-07-16 23:00:52 +08:00
|
|
|
|
/** @brief SPI DATA_READY 输出端�(PB6 → ESP32;v2:低=有待读,高=空闲)。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_SPI_READY_PORT = GPIOB;
|
2026-07-16 23:00:52 +08:00
|
|
|
|
/** @brief SPI DATA_READY 输出引脚。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_SPI_READY_PIN = GPIO_PIN_6;
|
2026-07-16 23:00:52 +08:00
|
|
|
|
/** @brief APP SPI DMA/软件缓冲(å—节)。业务 payload 上é™� = 本值 − V2_OVERHEAD(20)。 */
|
|
|
|
|
|
constexpr uint16_t CONFIG_SPI_TX_BUF_SIZE = 256U;
|
|
|
|
|
|
constexpr uint16_t CONFIG_SPI_RX_BUF_SIZE = 256U;
|
|
|
|
|
|
constexpr uint16_t CONFIG_SPI_LOG_BUF_SIZE = 256U;
|
|
|
|
|
|
/** @brief 主动按铃超时:ESP32 未在该时间内�读则 cancelRing(ms)。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_SPI_RING_TIMEOUT_MS = 50U;
|
2026-07-26 20:39:59 +08:00
|
|
|
|
/** @brief SPI 命令 handler 注册表容�。
|
|
|
|
|
|
*
|
2026-09-02 02:38:35 +08:00
|
|
|
|
* 当� init 注册 12 个:boot_request / ota_wait / ping / init_status / can_bridge /
|
|
|
|
|
|
* can_burst / can_feedback / id_snapshot / adc_feedback / motor_state / motor_ota / exmc_diag。
|
2026-07-26 20:39:59 +08:00
|
|
|
|
* registerHandler 表满时é�™é»˜ä¸¢å¼ƒï¼Œmotor_ota æ›¾å› å®¹é‡�=8 被丢弃(0xD0 回 0xEE)。
|
2026-09-02 02:38:35 +08:00
|
|
|
|
* � 14 留余�;新增 handler 时须确认本容�足够。 */
|
|
|
|
|
|
constexpr uint8_t CONFIG_SPI_MAX_COMMANDS = 14U;
|
2026-07-16 23:00:52 +08:00
|
|
|
|
/** @brief �通���� ID 快照表最大�目数(与 ESP32 CANFD_ID_SNAPSHOT_MAX 对�)。 */
|
|
|
|
|
|
constexpr uint8_t CONFIG_CANFD_ID_SNAPSHOT_MAX = 16U;
|
|
|
|
|
|
/** @brief å¿«ç…§æ�¡ç›®æœ€å¤§æ•°æ�®å—节数(CAN FD DLC 上é™�)。 */
|
|
|
|
|
|
constexpr uint8_t CONFIG_CANFD_ID_SNAPSHOT_DATA_MAX = 64U;
|
2026-07-11 17:52:05 +08:00
|
|
|
|
|
2026-09-01 03:07:48 +08:00
|
|
|
|
/** @brief ESP32 硬件��控制端�(PC9 接 ESP32 EN/RESET,对应原�图 WLESS_EN)。
|
|
|
|
|
|
* @note ��� PC9 浮空,ESP_CHIP_EN 会被 C41/U11 拉低;BOOT 也必须主动拉高。 */
|
2026-07-11 17:52:05 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ESP32_RESET_PORT = GPIOC;
|
|
|
|
|
|
/** @brief ESP32 硬件��控制引脚。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESP32_RESET_PIN = GPIO_PIN_9;
|
|
|
|
|
|
|
2026-07-02 02:02:41 +08:00
|
|
|
|
/* ============================================================
|
|
|
|
|
|
* 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 仲�段预分频值。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_NOMINAL_PRESCALER = 9U;
|
2026-07-27 00:02:14 +08:00
|
|
|
|
/** @brief 仲è£�段å†�å�Œæ¥è·³è·ƒå®½åº¦ã€‚
|
|
|
|
|
|
* 1TQ→2TQ:总线空闲期å�³æŒ�ç» STUFF 接收错误(REC 冲 120+),OTA æ•°æ�®å¸§è¢«é”™è¯¯å¸§
|
|
|
|
|
|
* 击è�½è§¦å�‘应用层é‡�å�‘;放宽接收å†�å�Œæ¥å®¹å·®ï¼ˆä¸�改波特率/é‡‡æ ·ç‚¹ï¼Œä¸Šé™�å�— BS2=2TQ é™�制)。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_CAN_NOMINAL_SJW = CAN_BT_SJW_2TQ;
|
2026-07-02 02:02:41 +08:00
|
|
|
|
/** @brief 仲�段时间段 1(PHSEG1)。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_NOMINAL_BS1 = CAN_BT_BS1_7TQ;
|
2026-07-02 02:02:41 +08:00
|
|
|
|
/** @brief 仲�段时间段 2(PHSEG2)。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_NOMINAL_BS2 = CAN_BT_BS2_2TQ;
|
2026-07-02 02:02:41 +08:00
|
|
|
|
|
|
|
|
|
|
/** @brief 数�段预分频值。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_DATA_PRESCALER = 9U;
|
2026-07-02 02:02:41 +08:00
|
|
|
|
/** @brief æ•°æ�®æ®µå†�å�Œæ¥è·³è·ƒå®½åº¦ã€‚ */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_DATA_SJW = CAN_BT_SJW_1TQ;
|
2026-07-02 02:02:41 +08:00
|
|
|
|
/** @brief 数�段时间段 1。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_DATA_BS1 = CAN_BT_BS1_3TQ;
|
2026-07-02 02:02:41 +08:00
|
|
|
|
/** @brief 数�段时间段 2。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_DATA_BS2 = CAN_BT_BS2_1TQ;
|
2026-07-02 02:02:41 +08:00
|
|
|
|
|
2026-07-20 02:36:56 +08:00
|
|
|
|
/* BRS / �动探测 / 通�使能:�文件顶部「功能开关� */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
|
2026-05-30 00:24:31 +08:00
|
|
|
|
/** @brief CAN æŽ¥æ”¶è¿‡æ»¤å™¨ç›®æ ‡æ ‡å‡†å¸§ ID。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_RX_FILTER_ID = CONFIG_CAN_STATUS_ID;
|
|
|
|
|
|
/** @brief CAN æŽ¥æ”¶è¿‡æ»¤å™¨æ ‡å‡†å¸§æŽ©ç �ï¼›0x7FF 表示精确匹é…� 11-bit ID。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_CAN_RX_FILTER_MASK = 0x7FFU;
|
|
|
|
|
|
/** @brief �次 CAN 接收解�任务最多消费的软件队列帧数。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_CAN_RX_PARSE_BUDGET = 48U;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
|
|
|
|
|
|
/** @brief 用户调度定时器实例。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_SCHED_TIMER_INSTANCE = TIMER2;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief ç”¨æˆ·è°ƒåº¦å®šæ—¶å™¨ä¸æ–å�·ã€‚ */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr IRQn_Type CONFIG_SCHED_TIMER_IRQn = TIMER2_IRQn;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief 用户调度定时器时钟使能��数。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr rcu_periph_enum CONFIG_SCHED_TIMER_RCU = RCU_TIMER2;
|
2026-07-02 02:02:41 +08:00
|
|
|
|
/** @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。
|
|
|
|
|
|
*/
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_SCHED_TIMER_PRESCALER = 179U;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief 用户调度定时器周期�装值。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_SCHED_TIMER_PERIOD = 99U;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief 用户调度定时器 NVIC 抢å� 优先级。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_SCHED_TIMER_IRQ_PREEMPT_PRIO = 1U;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief 用户调度定时器 NVIC å�优先级。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_SCHED_TIMER_IRQ_SUB_PRIO = 0U;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
|
|
|
|
|
|
/** @brief 调度基准节æ‹�:ADC VREF é‡‡æ ·å‘¨æœŸï¼Œå�•ä½� 100us tick。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_TASK_PERIOD_VREF_SAMPLE_TICKS = 5U;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
/** @brief 调度基准节æ‹�:ADC æ¸©åº¦é‡‡æ ·/处ç�†å‘¨æœŸï¼Œå�•ä½� 100us tick。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_TASK_PERIOD_TEMP_SAMPLE_TICKS = 10U;
|
2026-05-30 00:24:31 +08:00
|
|
|
|
/** @brief 调度基准节�:10ms 计数周期,�� 100us tick。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_TASK_PERIOD_CAN_RX_TICKS = 100U;
|
2026-07-26 20:39:59 +08:00
|
|
|
|
/** @brief 调度基准节�:CAN 周期��任务周期,100 tick = 10ms。
|
|
|
|
|
|
* @note 原 1ms/帧过密,改为 10ms/帧以�低 CAN 总线负载与 GD32 邮箱压力。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_TASK_PERIOD_CAN_TX_TICKS = 100U;
|
2026-07-15 00:34:56 +08:00
|
|
|
|
/** @brief 调度基准节�:心跳周期,�� 100us tick。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_TASK_PERIOD_HEARTBEAT_TICKS = 10000U;
|
2026-07-26 20:39:59 +08:00
|
|
|
|
/** @brief 调度基准节�:多电机状� 0xC5 主动推��动周期,2500 tick = 250ms。
|
|
|
|
|
|
* @note 独立于 1Hz heartbeat,é�¿å…�è¿žå¸¦åŠ é€Ÿ OTA Boot 轮询 / CAN å��馈快照刷新 /
|
|
|
|
|
|
* ADC 推� / checkOffline 离线判定(3s 阈值)。�端 age 应稳定在 ~120ms。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_TASK_PERIOD_MOTOR_STATE_TICKS = 2500U;
|
2026-07-15 00:34:56 +08:00
|
|
|
|
/** @brief 调度基准节æ‹�:APP 状æ€�/è¯Šæ–æ‰“å�°å‘¨æœŸï¼Œ50000 tick = 5s。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_TASK_PERIOD_DIAG_PRINT_TICKS = 50000U;
|
2026-05-10 17:28:14 +08:00
|
|
|
|
|
2026-07-20 02:36:56 +08:00
|
|
|
|
/* UART/SPI 调试开关:�文件顶部「功能开关� */
|
2026-05-30 00:24:31 +08:00
|
|
|
|
|
|
|
|
|
|
/** @brief FWDGT 独立看门狗预分频值。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_FWDGT_PSC = FWDGT_PSC_DIV64;
|
2026-05-30 00:24:31 +08:00
|
|
|
|
/** @brief FWDGT 独立看门狗�载值。
|
|
|
|
|
|
* è¶…æ—¶ = (64 / 40000) * (RLD + 1) = 1.6ms * (RLD+1)
|
|
|
|
|
|
* RLD=1874 → 1.6ms * 1875 ≈ 3.0s
|
|
|
|
|
|
*/
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_FWDGT_RLD = 1874U;
|
2026-05-30 00:24:31 +08:00
|
|
|
|
/** @brief FWDGT 超时近似值(毫秒),仅供文档�考。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_FWDGT_TIMEOUT_MS = 3000U;
|
2026-06-03 03:13:49 +08:00
|
|
|
|
|
|
|
|
|
|
/* ============================================================
|
|
|
|
|
|
* BOOT 版本在 OTA é…�置页ä¸çš„ Flash å˜å‚¨åœ°å�€
|
|
|
|
|
|
* 与 BOOT 工程 sys/config.h ��一致
|
|
|
|
|
|
* ============================================================ */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_OTA_CONFIG_PAGE_ADDR = 0x0807E000U;
|
|
|
|
|
|
constexpr uint32_t CONFIG_BOOT_VERSION_ADDR0 = CONFIG_OTA_CONFIG_PAGE_ADDR + 0x18U;
|
|
|
|
|
|
constexpr uint32_t CONFIG_BOOT_VERSION_ADDR1 = CONFIG_OTA_CONFIG_PAGE_ADDR + 0x1CU;
|
|
|
|
|
|
constexpr uint32_t CONFIG_OTA_CONFIG_WORD_COUNT = 8U;
|
2026-06-03 03:13:49 +08:00
|
|
|
|
|
2026-06-26 00:57:59 +08:00
|
|
|
|
/* ============================================================
|
|
|
|
|
|
* NVIC ä¼˜å…ˆçº§åˆ†ç»„ä¸Žä¸æ–优先级分层
|
|
|
|
|
|
* (EtherCAT å®žæ—¶æž¶æž„æ”¹é€ :PRE4_SUB0,4 ä½�抢å� 优先级)
|
|
|
|
|
|
* ============================================================ */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_NVIC_PRIORITY_GROUP = NVIC_PRIGROUP_PRE4_SUB0;
|
|
|
|
|
|
constexpr uint32_t CONFIG_IRQ_PREEMPT_ETHERCAT_SYNC = 0U;
|
|
|
|
|
|
constexpr uint32_t CONFIG_IRQ_PREEMPT_SCHED = 1U;
|
|
|
|
|
|
constexpr uint32_t CONFIG_IRQ_PREEMPT_CAN = 2U;
|
|
|
|
|
|
constexpr uint32_t CONFIG_IRQ_PREEMPT_ETHERCAT_ESC = 1U;
|
|
|
|
|
|
constexpr uint32_t CONFIG_IRQ_PREEMPT_ETHERCAT_SYNC1 = 1U;
|
|
|
|
|
|
constexpr uint32_t CONFIG_IRQ_PREEMPT_SPI_USART = 3U;
|
2026-06-26 00:57:59 +08:00
|
|
|
|
/* ============================================================
|
2026-07-20 02:36:56 +08:00
|
|
|
|
* EtherCAT LAN9252 �置(开关�顶部 CONFIG_MAIN_LOOP_WFI / ETHERCAT_SYNC_MODE)
|
2026-06-26 00:57:59 +08:00
|
|
|
|
* ============================================================ */
|
2026-09-01 03:07:48 +08:00
|
|
|
|
/* 1.5.27:CONFIG_ETHERCAT_ISR_MAX_US_THRESHOLD / CONFIG_ESC_PDI_INPUT_OFFSET /
|
|
|
|
|
|
* CONFIG_ESC_PDI_OUTPUT_OFFSET / CONFIG_ETHERCAT_PDO_SIZE éš�æ»ä»£ç � EthercatSlave::
|
|
|
|
|
|
* periodicIsr ä¸‰ç¼“å†²ä¸€å¹¶åˆ é™¤;PDO 交æ�¢ç”± SSC(dc_app.c APPL_*, 4×64bit=32B) 完æˆ�。 */
|
2026-06-29 01:51:02 +08:00
|
|
|
|
|
2026-06-26 00:57:59 +08:00
|
|
|
|
/* ---------- EXMC 引脚é…�ç½®(GD32E508 EXMC æ ‡å‡†æ˜ å°„) ---------- */
|
2026-08-09 03:27:21 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ESC_EXMC_BASE_ADDR = 0x60000000U;
|
|
|
|
|
|
/* Region0 = NE0 @ 0x60000000(GD32E50x 用户手册 Rev2.2 图25-3: Bank0 四 Region � 64MB,
|
|
|
|
|
|
* HADDR[27:26]=00 é€‰ä¸ NE0)。LAN9252 CS 接 PD7=EXMC_NE0(数æ�®æ‰‹å†Œ GD32E508xx
|
|
|
|
|
|
* Datasheet Rev1.8 LQFP100 引脚表: PD7 Alternate2 = EXMC_NE0/EXMC_NCE1)。
|
|
|
|
|
|
* 注�: GD32E508Vx (LQFP100) �装�引出 NE0 一个 NOR/SRAM 片选引脚,
|
|
|
|
|
|
* NE1~NE3 仅在 LQFP144 (Zx) 上å˜åœ¨ï¼›å› æ¤å¿…须使用 Region0(SNCTL0),ä¸�能用 Region1。 */
|
|
|
|
|
|
#ifndef EXMC_BANK0_NORSRAM_REGION0
|
|
|
|
|
|
#define EXMC_BANK0_NORSRAM_REGION0 ((uint32_t)0x00000000U)
|
2026-06-26 00:57:59 +08:00
|
|
|
|
#endif
|
2026-08-09 03:27:21 +08:00
|
|
|
|
#define CONFIG_ESC_EXMC_BANK_NOR_SRAM_REGION0 EXMC_BANK0_NORSRAM_REGION0
|
2026-06-26 00:57:59 +08:00
|
|
|
|
|
|
|
|
|
|
/* ---------- ESC 䏿–引脚(PB0/PB1/PB2,三个独立 EXTI å�‘é‡�) ---------- */
|
|
|
|
|
|
/** @note �留 PA0 给未� STANDBY 模�唤醒(WKUP_PIN0)。 */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ESC_SYNC0_PORT = GPIOB;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_SYNC0_PIN = GPIO_PIN_0;
|
|
|
|
|
|
constexpr exti_line_enum CONFIG_ESC_SYNC0_EXTI = EXTI_0;
|
|
|
|
|
|
constexpr IRQn_Type CONFIG_ESC_SYNC0_IRQn = EXTI0_IRQn;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_SYNC0_EXTI_SOURCE_PORT = GPIO_PORT_SOURCE_GPIOB;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_SYNC0_EXTI_SOURCE_PIN = GPIO_PIN_SOURCE_0;
|
2026-06-26 00:57:59 +08:00
|
|
|
|
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ESC_IRQ_PORT = GPIOB;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_IRQ_PIN = GPIO_PIN_1;
|
|
|
|
|
|
constexpr exti_line_enum CONFIG_ESC_IRQ_EXTI = EXTI_1;
|
|
|
|
|
|
constexpr IRQn_Type CONFIG_ESC_IRQ_IRQn = EXTI1_IRQn;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_IRQ_EXTI_SOURCE_PORT = GPIO_PORT_SOURCE_GPIOB;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_IRQ_EXTI_SOURCE_PIN = GPIO_PIN_SOURCE_1;
|
2026-06-26 00:57:59 +08:00
|
|
|
|
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_ESC_SYNC1_PORT = GPIOB;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_SYNC1_PIN = GPIO_PIN_2;
|
|
|
|
|
|
constexpr exti_line_enum CONFIG_ESC_SYNC1_EXTI = EXTI_2;
|
|
|
|
|
|
constexpr IRQn_Type CONFIG_ESC_SYNC1_IRQn = EXTI2_IRQn;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_SYNC1_EXTI_SOURCE_PORT = GPIO_PORT_SOURCE_GPIOB;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_SYNC1_EXTI_SOURCE_PIN = GPIO_PIN_SOURCE_2;
|
2026-06-26 00:57:59 +08:00
|
|
|
|
|
2026-09-01 03:07:48 +08:00
|
|
|
|
/* ---------- ESC 硬件��(PB10 → LAN9252 Pin11 RST#,SCH 第1页 Pin47) ---------- */
|
|
|
|
|
|
/** @note 2026-08-22(1.5.25) å‰�固件从未åˆ�始化 PB10,RST# ä»…é� R44 10k 上拉自然释放,
|
|
|
|
|
|
* �满足 LAN9252 手册 18.6.3 tpurstd(电�稳定→RST#释放)≥25ms�trstia(低脉宽)≥200µs。
|
|
|
|
|
|
* 由 EscLan9252::hardwareReset() 执行�控���列;释放���推挽输出高,
|
|
|
|
|
|
* GD32 自身��期间引脚回浮空,由 R44 上拉维�高,�会误�� ESC。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_NRST_PORT = GPIOB;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_NRST_PIN = GPIO_PIN_10;
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_NRST_ASSERT_MS = 30U; /* 低脉宽,�时覆盖 tpurstd 25ms 与 trstia 200µs */
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_HBI_POLL_TIMEOUT_MS = 300U; /* RST# 释放å�Žç‰å¾… ESC å�¯åЍ/EEPROM åŠ è½½ */
|
|
|
|
|
|
constexpr uint32_t CONFIG_ESC_HBI_POLL_STEP_MS = 5U;
|
|
|
|
|
|
|
2026-06-26 00:57:59 +08:00
|
|
|
|
/* ---------- EXMC æ•°æ�®/控制线引脚(GD32E508 æ ‡å‡†æ˜ å°„) ---------- */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D0_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_D0_PIN = GPIO_PIN_14;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D1_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_D1_PIN = GPIO_PIN_15;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D2_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_D2_PIN = GPIO_PIN_0;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D3_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_D3_PIN = GPIO_PIN_1;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D4_PORT = GPIOE; constexpr uint32_t CONFIG_EXMC_D4_PIN = GPIO_PIN_7;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D5_PORT = GPIOE; constexpr uint32_t CONFIG_EXMC_D5_PIN = GPIO_PIN_8;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D6_PORT = GPIOE; constexpr uint32_t CONFIG_EXMC_D6_PIN = GPIO_PIN_9;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D7_PORT = GPIOE; constexpr uint32_t CONFIG_EXMC_D7_PIN = GPIO_PIN_10;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D8_PORT = GPIOE; constexpr uint32_t CONFIG_EXMC_D8_PIN = GPIO_PIN_11;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D9_PORT = GPIOE; constexpr uint32_t CONFIG_EXMC_D9_PIN = GPIO_PIN_12;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D10_PORT = GPIOE; constexpr uint32_t CONFIG_EXMC_D10_PIN = GPIO_PIN_13;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D11_PORT = GPIOE; constexpr uint32_t CONFIG_EXMC_D11_PIN = GPIO_PIN_14;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D12_PORT = GPIOE; constexpr uint32_t CONFIG_EXMC_D12_PIN = GPIO_PIN_15;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D13_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_D13_PIN = GPIO_PIN_8;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D14_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_D14_PIN = GPIO_PIN_9;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_D15_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_D15_PIN = GPIO_PIN_10;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_A16_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_A16_PIN = GPIO_PIN_11;
|
2026-07-20 02:36:56 +08:00
|
|
|
|
/* A17 (PD12) 用于 HBI Indexed Mode 访问 HBI_DATA_0 寄å˜å™¨ï¼Œå·²å°† LAN9252 A2 (Pin 29) 接到 PD12。
|
|
|
|
|
|
* 注� LAN9252 引脚顺�:Pin25=A1, Pin26=A3, Pin27=A4, Pin28=CS, Pin29=A2。
|
2026-09-01 03:07:48 +08:00
|
|
|
|
* A2 是 IDX/DATA 选择ä½�,必须接到 PD12 æ‰�能访问 DATA 寄å˜å™¨ï¼ŒEEPROM 烧录功能å�¯ç”¨ã€‚
|
|
|
|
|
|
* 注� EXMC 16-bit 模�地�左移 1 �(用户手册 p869):A16(PD11)=CPU �移 0x20000�
|
|
|
|
|
|
* A17(PD12)=CPU �移 0x40000,HBI_DATA_0 访问�移� esc_lan9252.cpp。 */
|
2026-07-20 02:36:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_EXMC_A17_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_A17_PIN = GPIO_PIN_12;
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_EXMC_NOE_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_NOE_PIN = GPIO_PIN_4;
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_NWE_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_NWE_PIN = GPIO_PIN_5;
|
2026-09-01 03:07:48 +08:00
|
|
|
|
/* LQFP100 �有 NE0(PD7) 一个 NOR/SRAM 片选,归 Region0(0x60000000);命�沿用硬件真值 NE0。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_EXMC_NE0_PORT = GPIOD; constexpr uint32_t CONFIG_EXMC_NE0_PIN = GPIO_PIN_7;
|
2026-06-26 00:57:59 +08:00
|
|
|
|
|
2026-05-10 17:28:14 +08:00
|
|
|
|
#endif /* SYS_CONFIG_H */
|