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-09-13 18:59:57 +08:00
|
|
|
|
/** @brief SPI 命令é€�帧日志(#if)。1.6.29 诊æ–:开å�¯å�Žä»…异常路径会输出
|
|
|
|
|
|
* (�v2帧/未知type/SEQ跳�/session�匹�),�帧"收到�刷写"行已在
|
|
|
|
|
|
* app_spi_command.cpp å…³é—,æ£å¸¸çжæ€� UART é�™é»˜ã€‚定ä½�完改回 0。 */
|
|
|
|
|
|
#define CONFIG_SPI_APP_LOG_ENABLE 1
|
2026-07-20 02:36:56 +08:00
|
|
|
|
/** @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: æ•°æ�®æ®µç”¨ä»²è£�段å�Œé€ŸçŽ‡ï¼Œç‰¢ç‰¢æ€§æ›´é«˜ã€‚
|
2026-09-06 00:20:51 +08:00
|
|
|
|
* 电机 BOOT æ— æ³•æ£ç¡®æŽ¥æ”¶ BRS 高速段→nonce(16B FD+BRS)被拒ç»�→æ�¡æ‰‹å¤±è´¥ã€‚
|
|
|
|
|
|
* 1.6.1 起:�� 1U 也�——motor_ota_relay 在 OTA 期间� CanFd::setChannelBrsSuppress
|
|
|
|
|
|
* 按通é�“压制 BRS(与 ARD 切æ�¢å�Œä¸€ enterState é’©å�,结æ�Ÿå¿…æ�¢å¤�),日常å�žå��ä¸�å�—å½±å“�。 */
|
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-09-09 03:04:53 +08:00
|
|
|
|
/** @brief [DIFF-STATS] 输入镜åƒ�差分统计(0x2000 sub13..23,é‡�化差分写能çœ�多少å—节ã€�
|
|
|
|
|
|
* run 碎片有多严é‡�ã€�比对自身è¦�多少钱)。临时仪表,å�–è¯�完置 0 å�³ä¸Žæ”¹é€ å‰�é€�å—节ç‰ä»·ã€‚
|
|
|
|
|
|
* @note å¼€å�¯æ—¶æ¯�æ‹�在 PDI_Isr 内多一次 600B å—粒度比对 + 一次快照拷è´�(约 10µs é‡�级,
|
|
|
|
|
|
* 实测è§� sub23ï¼‰ï¼Œå› æ¤ **sub9/sub10 的写侧耗时会包å�«è¿™éƒ¨åˆ†**,ä¸�能直接与历å�²
|
2026-09-13 18:59:57 +08:00
|
|
|
|
* �能与历�写侧基准对�——�看差分潜力就�看 sub13..22,�看真实写侧耗时请置 0 �测。 */
|
2026-09-09 03:04:53 +08:00
|
|
|
|
#define CONFIG_ECAT_DIFF_STATS 0
|
2026-09-12 01:59:42 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 输入 PDO 稀�写 ESC(1.6.22 P1):按密排 count �写「段1+段2有效区�与「段3+段5�,
|
|
|
|
|
|
* 跳过未用到的空槽区(40+count*56 .. 543),çœ� HW_EscWriteIsr çš„ PRAM å—节数。
|
|
|
|
|
|
* @note 0=� 600B 整包写(A/B 基线);1=分段写。� 1.6.21 密排布局(magic≠0xA5)或
|
|
|
|
|
|
* count 撑满时自动回退整包。**总长/SII/主站解ç �å�‡ä¸�å�˜**;空洞区在 ESC ä¸ä¸ºè¯¥
|
|
|
|
|
|
* SM 缓冲上次残留,主站必须继ç»å�ªæŒ‰ count è¿ä»£ï¼ˆ1.6.21 已如æ¤ï¼‰ã€‚
|
|
|
|
|
|
* 验收看 0x2000 sub10(EscWrite 周期)与 load_perm,�工况开关�测一轮。
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_ECAT_SPARSE_ESC_WRITE 1
|
2026-09-12 20:10:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 输入 PDO 差分写 ESC(1.6.25 P1):在稀�写之上,按「段头(0..543)+段尾(544..599)�
|
|
|
|
|
|
* 与上次写入影å�比对;内容稳定且冲刷完æˆ�则整段跳过,çœ� PRAM å—节。
|
|
|
|
|
|
* @note 3-buffer 安全:SM3 三缓冲轮转,ä¸�能å�ªå¯¹ã€Œä¸Šä¸€æ‹�å�‘布镜åƒ�ã€�æ¯”â€”â€”ç›®æ ‡ç¼“å†²
|
|
|
|
|
|
* 里是 2 æ‹�å‰�的内容。采用「å�˜åŒ–å�Žè¿žç»å†™ 3 æ‹�冲刷ã€�å��议:å�˜åŒ–当æ‹�写并置
|
|
|
|
|
|
* flush=2,�� 2 �强制写完 3 个缓冲,稳定���许跳过。全段跳过时强制
|
|
|
|
|
|
* 写末 2 å—节完æˆ� SM 事件应ç”。0=å…³é—,退回稀ç–�写/整包。SII/主站解ç �ä¸�å�˜ã€‚
|
|
|
|
|
|
* 验收:CONFIG_ECAT_DIFF_STATS �数�对� sub10;或与 1.6.22 基线 A/B。
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_ECAT_DIFF_ESC_WRITE 1
|
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-09-06 00:20:51 +08:00
|
|
|
|
constexpr uint32_t APP_FW_VERSION_MINOR = 6U;
|
2026-09-13 18:59:57 +08:00
|
|
|
|
constexpr uint32_t APP_FW_VERSION_PATCH = 33U; /* 1.6.33: OP 输入新鲜度ä¸�å�˜é‡�(EcatDbg_OpInputFreshness)——SM-Synchron 下输入 PDO å�ªé� PDI_Isr,通路一å�œä¸»ç«™è¯»åˆ°å†»ç¼“冲(WKC/AL ä»�æ£å¸¸=å�‡è¿žæŽ¥);现 OP 内输入å�œæ›´>5ms 由主循环强制 PDO_InputMapping+é‡�å¼€é—¨ã€‚æ ¹æ²»"连接看起æ�¥æ£å¸¸ä½† CPU/CAN ä¸�æ›´æ–°ã€�å¤�ä½� GD32 æ‰�好"。 */ /* 1.6.32: SPI CS EXTI æ��到抢å� 级0(è§� app_spi_command configureExtiï¼‰ï¼Œæ ¹æ²» CS release 被 PDI/RT_CRITICAL 延迟导致的 RX 撕裂(0xE8) *//* /* 1.6.28:ESC ç�¡çœ 挂起门控(EscLan9252::pmSuspended)。pmDrive è¿› D1-D3 ç½®ä½�å�Žå…¨å›ºä»¶ HBI 消费者é�™é»˜â€”—task_runner å�œè°ƒ MainLoop/AL 守护/AL 心跳(MainLoop æ¯�圈 HBI 读 0x220,ç�¡çœ ä¸ä»»ä½• HBI 访问å�«è¯»éƒ½æŠŠèŠ¯ç‰‡æ‰“å›ž D0,2026-09-12 å®žæµ‹ä¼‘çœ ~20s å�³è¢«ä¸»ç«™"å¤�æ´»":芯片毫秒级被 GD32 自己å�«é†’ã€�SM 失效å�Žä¸»ç«™ wedge é‡�建 OP);ethercat_sync 三 EXTI ISR 与 timer Sync0 路径清 pending å�³è¿”。解除:pmDrive 唤醒æˆ�功/op0 读到 D0 自愈/nrstDrive 释放å¤�ä½�/hardwareReset。é…�套主站侧 ecat_native /api/pm/hold 楔æ»çœ‹é—¨ç‹—è±�å…�。 */ /* A/B 结æ�Ÿ: æ�¢å¤� 1.6.25 稀ç–�+差分写(用户è£�定, 主站侧已有å�Žå�°æ�¢å¤�兜底) */ /* A/B C组: SPARSE=0+DIFF=0, 回 1.6.21 æ�’å…¨é‡� 600B 写 ESC(查开机楔æ») */ /* 1.6.25:P1 输入 PDO 差分写 ESC(三区:段1 桥状æ€�/段2 电机密排/段3+5 快照诊æ–ï¼›å�˜åŒ–å�Ž 3-buffer 冲刷å��议,稳定段跳过;全跳过写末 2 å—节完æˆ� SM)。P2 csrRead 分级:verify å�‚数,SM/AL/邮箱默认å�Œè¯»ï¼Œè¯Šæ–/MII busy/init 轮询å�•读。开关 CONFIG_ECAT_DIFF_ESC_WRITE。 */ /* 1.6.24:pmDrive è¿› D1/D2/D3 移除读回验è¯�。æ�¿çº§å®žæµ‹ï¼šè¿›å…¥ç�¡çœ å�Žä»»ä½• HBI 访问(å�«è¯»ï¼Œæ‰‹å†Œ 6.3.4.2 å�ªè¯´å†™å”¤é†’,芯片实际按主机 CS 活动判定)都会 <50ms 触å�‘唤醒回 D0——读回验è¯�自è¯�å¤±è´¥ï¼Œæ”¹ä¸ºç½®ä¿¡æž„é€ è¿”å›žå€¼ï¼ˆREADY=0|SLEEP_EN=1|MODE=op);「读状æ€�ã€�è¯ä¹‰æ”¹ä¸º"若在ç�¡çœ åˆ™ä¸»åŠ¨æ‰“ç ´ç�¡çœ "。 */ /* 1.6.23:LAN9252 芯片级电æº�管ç�†è¯Šæ–路径。EscLan9252::pmDrive()(0xA2 action 30~34:30 读状æ€�/31 è¿› D1/32 è¿› D2/33 è¿› D3/34 手动唤醒),按 DS 6.3 写 PMT_CTRL(0x084) PM_MODE+PM_SLEEP_EN(分两次写);D3 å‰�置两 PHY General Power Down(ç»� ESC æ ¸å¿ƒ MII 管ç�† 0x0510-0x0514,PHY A 地å�€ 0/2 è¿�行期判定),唤醒=HBI 写 BYTE_TEST å�Žè½®è¯¢ BYTE_TEST/READY(DWT CYCCNT å¿™ç‰ï¼Œ50µs æ¥è¿›ã€�上é™� 10ms——0xA2 在 CS EXTI ISR 上下文执行,ç¦�用 SysTickTimer::delayMs 会æ»ç‰ï¼›HBI 段 maskEnter å±� EXTI0/1 防 SYNC0 çª�入)。唤醒å�Žè‡ªåЍæ�¢å¤� PHY 上电(自å��å•†éœ€æ•°ç§’ï¼‰ã€‚ä¼‘çœ æœŸé—´ EtherCAT é€šä¿¡ä¸æ–属预期,主站 wkc 报错。 */ /* 1.6.22:P1 稀ç–�写 ESC。PDO_InputMapping 在密排布局下按 count å�ªå†™ã€Œæ®µ1+段2有效区(0..40+count*56)ã€�与「段3+段5(544..599)ã€�,跳过空槽区,çœ� HW_EscWriteIsr çš„ PRAM å—节。开关 CONFIG_ECAT_SPARSE_ESC_WRITE=1ï¼›é�žå¯†æŽ’/count 撑满自动回退整包。总长 600B/SII/主站解ç �ä¸�å�˜ã€‚A/B:置 0 é‡�ç¼–å�³ 1.6.21 写侧。 */ /* 1.6.21:段 2 改「一帧=总线电机整轮状æ€�ã€�。用户è£�定旧需求ä¸�对:ä¸�è¦� win_base 滑窗扫 27 槽,也ä¸�è¦�段 4 历å�²å¸§è¦†ç›–窗å��å¤�é‡�å�‘。实测病ç�†ï¼šæŽ¥ 3 个电机网页å�´çœ‹åˆ° 5 个状æ€�帧——固定 5 槽里空槽 node_id=0 也å� ä½�,主站ä¸�滤就多报。本版:(1) 段 2 密排,count=本æ‹�实际电机数(0..9),空节点ä¸�å� ä½�,槽åº�按 node_id å�‡åº�,å�Œå�·å¤šé€šé�“å�– seq 最新;主站 `for i in 0..count` 按槽内 node_id è‡ªåŠ¨è¯†åˆ«ï¼Œæ— éœ€æ»‘çª—ã€‚(2) åˆ æ®µ 4 覆盖窗å�£ï¼ˆfillRxWindow/RxWinSlot 整套),é�ž STATUS ä»�走段 1/3 最近一帧。(3) 差分填充:节点集å�ˆä¸Žå�„ seq 未å�˜æ—¶æ•´æ®µå¤�用影å�,跳过 MotorState é‡�读与é€�æ§½ 48B æ‹·è´�。(4) 输入 PDO 总长ä»� 600B,SII æ— éœ€é‡�刷;段 2 扩到 32..543ã€�段 3 å‰�移到 544ã€�段 5 ä»� 584。**主站解ç �å¿…é¡»å�Œæ¥**(decode_input/transport-ecat.js:count 密排 + 段 3 å��ç§
|
2026-09-09 03:04:53 +08:00
|
|
|
|
/* 1.6.19:[DIFF-STATS] 仪表æˆ�本终于测对了,并推翻 1.6.18 自己的判æ–。1.6.18 认定"是 -Oz 把 memcpy(&a,p,4) ç¼–æˆ�函数调用",改æˆ�手拼 4 å—节移ä½�,结果å��汇编出**æ¯�å— 8 æ�¡ ldrb.w**ã€�比开销从 21.3µs/æ‹�涨到 41µs/æ‹� —— æ–¹å�‘完全å��äº†ã€‚çœŸæ ¹å› ä¸�在这里:alignas(4) æ ‡åœ¨æ•°ç»„å£°æ˜Žä¸Šå�ªåˆ°è°ƒç”¨ç‚¹ä¸ºæ¢ï¼Œè€Œ observe(const uint8_t*) 的形å�‚ç¾å��ä¸�带对é½�ä¿¡æ�¯ï¼Œä¼˜åŒ–å™¨æ— ä»Žè¯�明指针 4 å—节对é½�,两版都å�ªèƒ½é€�å—节走。修法是对两个入å�‚å�„å�šä¸€æ¬¡ __builtin_assume_aligned(p,4) å†�èµ° memcpy —— å��汇编确认循环体已缩æˆ� ldr.w/ldr.w/cmp/bne æ¯�å— 4 æ�¡ (150 å— â‰ˆ 750 cycle ≈ 4.2µs/æ‹�,与最åˆ�ä¼°ç®—å�Œé‡�级),且整个函数 bl å½’é›¶(600B å¿«ç…§æ‹·è´�也被折æˆ�å—æ�¬è¿�)。教è®ï¼š**测é‡�工具的开销会直接å�˜æˆ�结论**,"差分判æ–很贵"è¿™å�¥è¯�å·®ä¸€ç‚¹å°±è¢«æˆ‘è‡ªå·±é€ çš„å�‡è±¡å��实。被测é‡�(å�˜åŒ–å—节数 25%ã€�run 峰值 12)ä¸�å�—æ¤å½±å“�,两版读数一致,ä»�然有效。 */
|
|
|
|
|
|
/* 1.6.18:修 [DIFF-STATS] 仪表自己的å�‡è±¡ —— 比对循环里 `memcpy(&a,p,4)` 在 -Oz 下被编æˆ�**函数调用**而é�žå�•æ�¡ LDR,首轮实测 compare 开销虚报æˆ� 21.3µs/æ‹�(≈300 次调用×995 æ‹�),若拿它当"差分判æ–很贵"çš„è¯�æ�®å°±ç»“论å��了。改æˆ�å°�端 4 å—节移ä½�拼装:å�ˆæ³•ã€�ä¸�ç¢°ä¸¥æ ¼åˆ«å��ã€�且是 Clang 认得折 LDR 的模å¼�。顺带把 alignas(4) çš„ç�†ç”±æ”¹æˆ�"æœ�务整å�— memcpy",比对本身ä¸�å†�ä¾�赖它。Code 52716→52768(+52B),代价是体积ä¸�是速度。 */
|
2026-09-13 18:59:57 +08:00
|
|
|
|
/* 1.6.17:新增 [DIFF-STATS] 临时仪表,为"输入 PDO 改差分写"å�–è¯�,**零行为å�˜æ›´**。动机:差分写的收益完全å�–决于æ¯�æ‹�真æ£å�˜äº†å¤šå°‘å—节ã€�å�˜åŒ–点碎æˆ�å‡ ä¸ª run,而 run 碎片数决定它会ä¸�会把一次 600B æ•´å�—写退化æˆ�å‡ ç™¾æ¬¡å¸¦ PRAM_AVAIL 轮询的å°�写——这两个数今天没有实测ä¾�æ�®ï¼Œæ‰€ä»¥å…ˆå�ªä¸Šä»ªè¡¨å†�决定å�šä¸�å�šã€‚实现:comm/ethercat_diff_stats.{h,cpp},æ¯�æ‹�在 PDI_Isr 里与上一份已å�‘布镜åƒ�å�š u32 粒度比对,按 1s 窗å�£(DWT 周期,å�Œ cpu_load 手法)滚动,getter å�ªå›žæŠ¥"上一个完整窗å�£"以å…�主站读到å�Šç´¯ç§¯å€¼ï¼›é‡�为 cycles / changedMax / runsTotal / runsMax / 段1..段5 å�„自å�˜åŒ–å—节 / 比对自身 DWT 开销。ç»�对象å—å…¸ 0x2000 sub13..23 上报(新增 11 个å�ªè¯» UINT32)。**å�ªåŠ SDO å�索引ã€�PDO é•¿åº¦ä¸Žæ˜ å°„é€�å—节ä¸�动 ⇒ æ— éœ€é‡�生æˆ� SIIã€�æ— éœ€æ–电冷å�¯åЍ**,å�¯ä¸Žä¸»ç«™ç‹¬ç«‹å�‡çº§ã€‚整模å�—ç”± CONFIG_ECAT_DIFF_STATS 门控,置 0 å�Žä¸Ž 1.6.16 ç‰ä»·ï¼›æŒ‚接点统一 [DIFF-STATS] æ ‡è®°ï¼Œåˆ é™¤=åˆ 2 文件+åˆ æ ‡è®°è¡Œã€‚å·²çŸ¥å‰¯ä½œç”¨ï¼šå¼€å�¯æ—¶ sub9/sub10 写侧耗时å�«æ¯”对开销,ä¸�能直接与旧基线对æ‹�,真实写侧基准须置 0 é‡�测。 */
|
2026-09-09 03:04:53 +08:00
|
|
|
|
/* 1.6.16:修段 1/段 3 å¿«ç…§ drop 的计数å�£å¾„(纯判æ�®ä¿®å¤�,PDO 布局é€�å—节ä¸�动)。病ç�†ï¼š`onCanFrame` 里判的是 `if (s_rxValid) ++s_dropCount`,而 s_rxValid ç½®ä½�å�Ž**æ°¸ä¸�清零**(å�ªæœ‰ flags bit0 清统计会归零计数,ä¸�动 valid),于是开机收到第一帧之å�Ž**æ¯�一帧都算一次丢弃**,drop ≡ rx−1 (mod 2^16)。实测 period=1msã€�CAN ä¾§ 6000 帧/s æ—¶ drop å�Œæ · 6000/s,与 rx_count é€�æ‹� 1:1(Δ 完全相ç‰ï¼‰ï¼Œ(rx−1) mod 65536 与上报值精确å�»å�ˆã€‚å�Žæžœï¼šä¸»ç«™ `/api/motor/state` çš„ bridge.drop 被 transport-ecat.js 当状æ€�æ � **ERR** 显示ã€�且它是桥全局值三通é�“å�Œæ•° → 网页"ERR 多得离谱"其实å�ªæ˜¯æ”¶å¸§é€ŸçŽ‡ï¼Œé›¶ç�µæ•�度ã€�纯å�‡ä»ªè¡¨ï¼›calibrate_ecat_metrics 一类拿 drop å�šåˆ†å�分æ¯�的判æ�®æ�’å¾— 100%ã€‚æœ¬ç‰ˆåŠ s_rxPublished(写侧置 false / buildInput 段 1 å�‘布分支置 true,与段 4 çš„ s_rxWinSeen å�Œä¸€å¥—"未被任何一æ‹�å�–èµ°æ‰�算丢"约定),判æ�®æ”¹ `s_rxValid && !s_rxPublished`;计数è�½åœ¨ xrxSeq 奇数窗å�£å†…,消费者判奇会跳过段 1/段 3 æ•…ä¸�会并å�‘ç½®ä½�,读+è‡ªå¢žå¯¹æ¶ˆè´¹è€…ç‰æ•ˆåŽŸå�。flags bit0 清统计时一并置 published=true,å…�得清零å�Žçš„第一帧被误计。s_rxValid è¯ä¹‰ä¸�å�˜ï¼ˆ"有过接收",flags bit0 与 backlog å�–通é�“都ä¾�赖它常驻),故 ecat.html çŸå¿«ç…§ã€�daemon çš„ xrx 分派ã€�ESP32 ä¾§ 0xC1 全部零改动。**修完ä¸�会归零**:段 1/段 3 是å�•æ§½ã€�æ¯�æ‹�å�ªèƒ½å�‘布 1 帧,6000 帧/s @1ms 下ä»�约 5000/s(≈rx çš„ 0.83),这个数自æ¤çœŸæ£çš„å�«ä¹‰æ˜¯"å¿«ç…§æ§½ä½�è·Ÿä¸�上收帧速率",ä¸�是总线错误;真·CAN 错误ä»�看 ESP32 `/can/feedback` çš„ err/TEC/REC,真·入窗丢帧看段 4 çš„ OVF(362) 与 seq 空洞。 */
|
2026-09-13 18:59:57 +08:00
|
|
|
|
/* 1.6.15:批é‡�接收改**定长覆盖窗å�£**,输入 PDO 496→600(75×64bit)。动机:1.6.1 瘦身å�Žæ‰¹é‡�区是"环形队列 + å�˜é•¿ç´§æŽ’排空",容é‡� 3 帧/æ‹�(=3000 帧/s),现场 4000 帧/s 下æ¯�æ‹�æ�’丢 1 帧(can_cadence lost=512/drain FAILï¼‰ï¼›æ›´ç³Ÿçš„æ˜¯æŽ’ç©ºèµ¤å—æŠŠé˜Ÿåˆ—é•¿æœŸåŽ‹åœ¨é¥±å’Œæ€�,而 1.6.9~1.6.13 è¿½çš„é”™æ ‡/拼接竞æ€�æ£æ˜¯é¥±å’Œæ€�喂出æ�¥çš„(判满用的 tail 一旦滞å�Žï¼Œç”Ÿäº§è€…就写进消费者刚读过的槽)。本版按用户è£�定改æˆ�覆盖å¼�:生产者(onCanFrame)æŒ‰è‡ªå·±æ¸¸æ ‡å†™ã€�绕圈覆盖,消费者(fillRxWindow)æ¯�æ‹�æ•´å�—å�–值 —— 没有 tail/判满/pending,那个滞å�Žæ�¡æ‰‹çš„载体直接ä¸�å˜åœ¨ã€‚定长(5×44B@364)让主站ä¸�å¿…æŽ¨æ¸¸æ ‡ï¼Œ1.6.10 那类边界越界写诊æ–区的错在结构上ä¸�å�¯èƒ½å†�犯。**æ¯�槽必须带 u32 seqlock**:buildInput 跑在 PDI_Isr(preempt=0) 会抢å� 主循环写侧,没有它主站能拿到"æ–° ID + æ—§æ•°æ�®"拼出的å�‡å¸§ï¼ˆä¸�是"差一个周期",是现实ä¸ä¸�å˜åœ¨ä½†çœ‹èµ·æ�¥å�ˆæ³•的帧,与刚修的拼接å�Œå½¢ï¼‰ã€‚seq 兼作主站去é‡�与丢帧判æ�®ï¼ˆç©ºæ´žæ•°=被覆盖未å�–çš„å¸§ï¼‰ï¼Œä¸Žä»Žç«™ä¾§æ–°åŠ çš„ OVF("未å�–先覆"次数) 互为对账仪表。è¯ä¹‰å�˜æ›´ï¼šæ‰¹é‡�区从"ä¿�è¯�ä¸�丢的事件æµ�"å�˜æˆ�"最近 N 帧窗å�£"——å�Œä¸€å¸§ä¼šè¿žç»å‡ æ‹�é‡�å¤�出现,低频一次性帧(版本/节点应ç”)在çª�å�‘下å�¯èƒ½è¢«é�™é»˜è¦†ç›–;主站 daemon 层按 seq 去é‡�å�Žå½’一æˆ�事件æµ�,故 motor.js/ecat.html/can_cadence.py 判æ�®ä¸�å�˜ã€�å‰�端零改动。容é‡�:5 æ§½=5000 帧/s@1ms,对 4000 帧/s ç•™ 25% ä½™é‡�(STATUS 自 1.6.9 èµ·ä¸�入窗,实际入窗é‡�是 CONFIG é‡�级);覆盖窗å�£**ä¸�åˆ›é€ å®¹é‡�**,槽数 < 帧/æ‹� ä»�会é�™é»˜ä¸¢å¸§ã€‚段1..3(0..359) é€�å—节ä¸�动,段5 诊æ–区 484→584。三端å�Œæ¥ï¼šethercat_pdo_size.h / bridge.h+cpp / dc_app.c(62→75) / gen_eeprom.py / DCU_ESI.xml / ecat_native.c decode_input(新增 600..639 分支,å�‘å�Žè‡ªé€‚应 496 与 640)。必须é‡�烧固件 + 烧 EEPROM + æ–电冷å�¯åŠ¨ï¼Œå�ªçƒ§ä¸€è¾¹ SAFEOP 报 AL 0x001A/0x0011。 */
|
2026-09-09 03:04:53 +08:00
|
|
|
|
/* 1.6.14:CAN-FD æ•°æ�®æ®µ 2Mbps→5Mbps(CONFIG_CAN_DATA_PRESCALER 9→3ã€�CONFIG_CAN_DATA_BS1 3TQ→4TQ ⇒ 90MHz/(3×6TQ)ï¼Œé‡‡æ ·ç‚¹ 80%→83.3%ï¼›TDC filter/offset 4→12 tq ç»´æŒ�约 400nsï¼Œå› TDCF/TDCO 以数æ�®æ®µ tq 为å�•ä½�)。动机:电机 STATUS48B+CONFIG24B×2 节点@1kHz åŠ 1kHz 下行 CMD,2Mbps 下负载约 120%(实测总线帧数被钉在 ~4993 帧/s),高频下å�‘æ—¶ RX FIFO 拥塞。仲è£�段ä»� 1Mbps ä¸�å�˜ã€‚é…�套:电机 APP 与 BOOT çš„ data_prescaler å�Œæ¥æ”¹ 2(60MHz/(2×6TQ)=5Mbps)——FD æ•°æ�®æ®µé€ŸçŽ‡å¿…é¡»å…¨æ€»çº¿ä¸€è‡´ï¼ŒèŠ‚ç‚¹ TX 都带 fd_brs。 */
|
|
|
|
|
|
/* 1.6.13ï¼šæ ¹æ²» —— 1.6.12 çš„ PDI å…¥å�£é¢„抽实测(60s æ£å¼¦æŒ‡ä»¤è´Ÿè½½ï¼Œé“¾è·¯æ´»æ€§å·²æ–言):overfull 50/s→0 但指纹è¿�è§„ä»� ~92/sã€�torn åœ¨æ— æº¢å‡ºé˜¶æ®µ 1-7/s æŒ�ç»æ¶¨ —— 判决:溢出å�ªæ˜¯å…±çŠ¯ä¹‹ä¸€ï¼Œ**357µs çš„ PDI 阻塞窗å�£æœ¬èº«**æ‰�是病ç�†æ¯�体(窗å�£å†… FIFO 满溢æ¯�窗å�£ + 被冻结的å�–帧路径留ç�€ä¸�ä¾�赖溢出的æ�¢å¸§è·¯å¾„,MI/MP å�ªæŠ“到少数)。本版釜底抽薪:CAN RX ISR æ��到 preempt=0(CONFIG_IRQ_PREEMPT_CAN_RX,与 SYNC0 å�Œçº§äº’ä¸�抢å� )—— RX ä¸�å†�被 PDI/SYNC1/SCHED 压ä½�,FIFO 深度 ≤2ã€�溢出与冻结å�Œæ—¶æ¶ˆå¤±ï¼ŒreceiveFrameChecked 的多å—å�–数自æ¤çœŸæ£åŽŸå�ï¼›TX ISR 留在 2(PDI 上下文有 TX æ��交,æ�� 0 会引入æ��交/释放竞争)。代价:SYNC0/PDI å�¶å�‘ µs 级延迟(RX ISR ~3µs/帧×8kHz≈2.4% å� 空),相对 1ms 周期是零头。PDI 预抽 pumpAllChannels éš�之撤除(失去æ„�义且引入 PDI/ISR å�Œæ¶ˆè´¹è€…风险)。ä¿�ç•™ 1.6.12 的诚实管é�“ï¼ˆæ ¡éªŒå�ªè®¡ä¸�丢)与诊æ–布局(overfull@490ã€�relto@492ã€�seq u16@488)作为验è¯�仪表:修好 = reject/torn/overfull æ�’ 0。 */
|
2026-09-08 00:52:35 +08:00
|
|
|
|
/* 1.6.12:æº�头修å¤� —— 用户è£�定"过滤是é�®ç¾žå¸ƒï¼Œä¿®é‡‡é›†æº�头,å‰�端å�ªè®¸è¯šå®žå��馈"。1.6.11 上线å�Žå®žæµ‹ï¼ˆrepro_cmdload æ£å¼¦è´Ÿè½½ï¼‰reject@494 ä»�以 ~384/s 增长:RFOD=DISABLE 挡ä¸�ä½�溢出æ¯�窗å�£ï¼ˆæœ¬ IP 满溢时 DISCARD è¯ä¹‰å˜ç–‘,或æ¯�帧å�‘生在满æ€�下的读并å�‘è·¯å¾„ï¼‰ï¼Œå†…å®¹æ ¡éªŒä¸¢å¼ƒå�ªæ˜¯æŠŠå��æ•°æ�®æ‹¦åœ¨è®¡æ•°å‰�。本版两处:(1) **æº�头**:CanFd::pumpAllChannels() 挂进 onEscIrqExti çš„ PDI_Isr å…¥å�£ —— 在 buildInput 357µs 长阻塞(CAN ISR preempt=2 全程被压)开始之å‰�把三路 FIFO 抽干,阻塞窗å�£èµ·ç‚¹æ·±åº¦=0ã€�窗å�£å†…到达 ≤2-3 帧,3 深度 FIFO 从"必然打满"å�˜æˆ�"å¿…ç„¶ä¸�满"ï¼›preempt=1 + SYNC0 已关的上下文ä¿�è¯�与 CAN ISR å�–帧互斥,与主循环批é‡�队列生产零交集。(2) **诚实管é�“**ï¼šå†…å®¹æ ¡éªŒæ”¹ä¸ºå�ªè®¡ä¸�丢(reject@494 æ�’ 0 = æº�头修好;还在涨 = æº�头未愈且页é�¢å¦‚实显示),诊æ–åŒºåŠ æŒ‚åˆ¤å†³æ€§æµ‹é‡�:seq 488 拆 u16ã€�overfull(RFO0)@490ã€�release_timeout@492(原é‡�入计数ä½�,æ�’ 0 让出)。reject 与 overfull 是å�¦å�Œæ¶¨ = "残余拼接是å�¦ä»�æº�自溢出"的判决。 */
|
|
|
|
|
|
/* 1.6.11ï¼šæ ¹æ²»æ®‹ä½™æ‹¼æŽ¥ —— 1.6.10 çš„ settle å»¶è¿Ÿå®žæµ‹æ— æ•ˆï¼ˆæ£å¼¦æŒ‡ä»¤è´Ÿè½½ä¸‹æ‹¼æŽ¥çއä¸�å�˜ï¼‰ï¼ŒèŠ‚ç‚¹æŒ‡çº¹å®žéªŒï¼ˆä¸¤ç”µæœºå��相æ£å¼¦+速度é™� 200/150 打指纹)实锤拼接是**跨节点**的:node3 çš„ STATUS 帧头 24B = node2 的完整 CONFIG(速度指纹 200.0ã€�角度 1142° å�‡å±ž node2 轨迹),且 CONFIG↔CONFIG å�Œåž‹æ‹¼æŽ¥ç»“æž„æ ¡éªŒæŠ“ä¸�到(两边都å�ˆæ³•)—— 电机 TX ä¸�å�¯èƒ½å�‘出别的电机的å—节 ⇒ æ··å�ˆç‚¹åœ¨ GD32 RX ä¾§ã€‚çœŸæ ¹å› ï¼šcan_init çš„ rec_fifo_overwrite=ENABLE —— FIFO æ»¡æ—¶è¦†ç›–æœ€æ—§é‚®ç®±ï¼Œè€Œæœ€æ—§é‚®ç®±æ£æ˜¯ CPU æ£åœ¨è¯»çš„输出窗å�£ï¼›buildInput 在 PDI_Isr å� ~357µs 压ä½� CAN ISR,å�‘指令时总线 ~8kHzã€�阻塞窗å�£å†… ~3 帧打满 FIFO 深度 → 覆盖进行ä¸è¢«è¯»èµ° = 拼接(MI/MP 回读挡ä¸�ä½�:MI 是覆盖åº�列最å�Žæ›´æ–°çš„一环;settle 延迟也挡ä¸�ä½�:é�žæ—¶é—´ç«žæ€�而是溢出ç–略)。本版:(1) rec_fifo_overwrite=DISABLE —— 溢出丢新帧置 RFO0(rx_fifo_overfull_count 已统计),周期é‡�丢一æ‹�下æ‹�å�³è¡¥ï¼Œä¸Žè½¯ä»¶é˜Ÿåˆ—"满丢新ä¸�覆旧"å�Œåˆ™ï¼›(2) æ’¤ settle å»¶è¿Ÿï¼ˆæ— æ•ˆä¸”ç™½çƒ§ CPU);(3) ä¿�ç•™ 1.6.10 çš„é‡�å�–å¾ªçŽ¯åˆ é™¤ä¸Žè¾¹ç•Œä¿®æ£ï¼Œå¹¶æ–°å¢žå…¥é˜Ÿå‰�å†…å®¹æ ¡éªŒï¼ˆSTATUS 温度/电压é‡�程+帧间斜率ã€�CONFIG 未使用区/模å¼�)丢结构矛盾帧ã€�计数段5@494 —— 作为溢出之外的纵深防御(实测能挡跨型拼接,挡ä¸�ä½�å�Œåž‹ CONFIG↔CONFIG,故必须é…�å�ˆ (1))。验è¯�:æ£å¼¦æŒ‡ä»¤è´Ÿè½½ 60s,指纹è¿�è§„ 40→0。 */
|
|
|
|
|
|
/* 1.6.10ï¼šæ ¹æ²»æ‹¼æŽ¥å¸§ —— 1.6.9 çš„"队列覆写"定性被自测推翻为**次è¦�**:段 2 电机槽(MotorState 路径,与批é‡�环形队列完全独立)出现å�Œç¾å��拼接(node2 槽头 = node3 CONFIG å‰�ç¼€ 03c12200,解出 mcuTemp=-161.25),且 rx_torn/pdo_reentry 自å�¯åЍæ�’ 0 —— 两æ�¡ç‹¬ç«‹ä¸‹æ¸¸å�Œæ—¶ä¸æ‹› ⇒ æ··å�ˆç‚¹åœ¨å…±å�Œä¸Šæ¸¸ CAN RX ISRï¼›æ ¡éªŒæ�’ä¸�报 ⇒ 拼接å�‘生在 MI/MP 判æ�®ç›²åŒºã€‚çœŸæ ¹å› =1.6.7 çš„"æ ¡éªŒå¤±è´¥åŽŸåœ°é‡�å�–":RFIFOMDATA0 读指针éš�读自动å‰�进且ä¸�å› æ�¢å¸§å¤�ä½�,attempt1 失败å�Ž attempt2 从错ä½�指针开读,MI/MP 比对的是窗å�£èº«ä»½ã€�管ä¸�ä½�指针错ä½�,于是"æ ¡éªŒé€šè¿‡ã€�内容为上一帧尾巴拼下一帧开头"。实测(自测脚本 scripts/selftest_torn.py,按æ‹�去é‡�+ç�µæ•�度自è¯�):空闲 0%(35k æ�¡),电机活跃时 9.155%(56835/620838,STATUS é”™æ ‡ä¸º CONFIG å� ç»�对多数)。本版:(1) 去掉é‡�å�–å¾ªçŽ¯ï¼Œæ ¡éªŒå¤±è´¥å�³ release+丢帧+rx_torn 计数(1.6.6 è¯ä¹‰ï¼ŒSTATUS/CONFIG å�‡ 1kHz 周期é‡�,丢一æ‹�下æ‹�å�³è¡¥)ï¼›(2) fillRxBatch 边界改判段 5 起点 ECAT_DIAG_OFF_LOAD(484) 而é�ž PDO 全长(496)——潜ä¼�越界写诊æ–区,当å‰�容é‡�下触ä¸�到,容é‡�放宽å�³å’¬äººï¼›(3) releaseFifo0 自清å�Žè¡¥ settle 延迟 —— 烧(1)(2)å�Žå®žæµ‹æ´»è·ƒæµ�é‡�下ä»�残余 0.11% 跨节点拼接(node2 槽头=node3 CONFIG å‰�缀,且 rx_torn å·²æ£å¸¸è®¡æ•° 146,è¯�明窗å�£æ�¢å¸§è·¯å¾„已被挡ä½�),定性为 RFD 自清å�ªä»£è¡¨ dequeue æ�¡æ‰‹å®Œæˆ�ã€�下一帧 MDATA 还在é€�å—æ�¬è¿�(MI/MP å…ˆè�½æ•°æ�®åŒºå�Žè�½),while 连排的第二次读紧跟 release å�³æ‹¿åˆ°é™ˆæ—§å¤´+新鲜尾,MI/MP 回读对这ç§�陈旧全盲;空闲æ¯� ISR å�•帧故 0%ã€�活跃连排æ‰�䏿‹›ï¼Œä¸Žå®žæµ‹åˆ†å¸ƒå�»å�ˆã€‚ */
|
|
|
|
|
|
/* 1.6.9:拿到实è¯�并定ä½�çœŸæ ¹å› â€”â€” ç»™ä¸»ç«™åŠ äº†å�Œæ‹� raw+parsed çš„å�ªè¯»è¯Šæ–路由(/api/motor/rxraw)å�ŽæŠ“åˆ°ï¼š**å��帧在原始 PDO å—节里就已ç»�是错的**(如 off=72 处æ�¡ç›®å£°ç§° id=0x20101/dlc=24,数æ�®å�´æ˜¯å�ˆæ³• STATUS:mcuTemp=35.92 motTemp=33.55 pwrV=23.972),而主站 parsed 与 raw é€�å—节一致 —— å��在从站写入侧,与主站解æž�æ— å…³ã€‚æ ¹å› ï¼šæ‰¹é‡�接收环形队列长期饱和下,生产者覆写了消费者æ£åœ¨è¯»çš„æ§½ã€‚实测è¯�æ�®ï¼šCAN 侧约 4000 帧/s 而批é‡�区æ¯�æ‹�最多 3 æ�¡(=3000 帧/s),净积压使 pending æ�’ 8/12ã€�lost å‡ ä¹Žæ¯�æ‹�都有ã€�count æ�’å�–满 3;消费者 fillRxBatch å�ˆæ”’到循环末æ‰�å�‘布 s_rxRingTailï¼Œç”Ÿäº§è€…åˆ¤æ»¡ç”¨çš„æ£æ˜¯è¿™ä¸ªæ»žå�Žå€¼ï¼ŒäºŽæ˜¯æŠŠæ–°å¸§å†™è¿›æ¶ˆè´¹è€…刚读过但未å�‘布的槽,拷进 PDO çš„ id/dlc/data é�‚æ�¥è‡ªä¸�å�Œå¸§ï¼ˆé”™æ ‡çއ 1.77%)。两处修å¤�:(1) onCanFrame 入队**过滤 STATUS 帧** —— 完整 STATUS 本就由段 2 按槽上报,主站 drainRx() 拿到 STATUS 也直接 continue 丢掉,让它å� 队列纯属é‡�å¤�ï¼Œæ£æ˜¯å®ƒæŠŠé˜Ÿåˆ—压爆;(2) fillRxBatch 改为整æ�¡æ‹·è´�到局部副本å†�用,并é€�æ�¡å�‘布 tail,使生产者判满始终基于真实进度。
|
|
|
|
|
|
1.6.8:曾判定为"输入 PDO 填充跨上下文é‡�å…¥"å¹¶åŠ äº†å�Œç¼“冲å�‘布 + é‡�入计数(段5@492)。**该å�‡è¯´äº‹å�Žè¢«è¯�伪**:SM-Synchron 稳æ€�下 MainLoop 分支的门控 (!bEscIntEnabled||!bEcatFirstOutputsReceived)&&!bDcSyncActive æ�’为å�‡ä¸�执行,Sync0 å› free-run æ— DC 脉冲ä¸�触å�‘,Sync1 与 PDI_Isr å�Œä¸º preempt=1 ä¸�能抢å� —— buildInput 实际å�ªåœ¨ PDI_Isr å�•上下文跑。å�Œç¼“冲å�‘布本身是æ£ç¡®åŠ å›ºï¼Œäºˆä»¥ä¿�留。
|
|
|
|
|
|
1.6.7:接ç�€ 1.6.6 æ²» CAN å�–帧拼接。1.6.6 çš„æ ¡éªŒå�ªè¯» MP çš„ TS/DLENC,TS 是 16 ä½�计数器ã€�相邻帧å�¯èƒ½å�Œå€¼ï¼ŒDLENC 更常å�Œä¸º 48,于是"ID 报 STATUSã€�æ•°æ�®å�´æ˜¯ CONFIG 帧"è¿™ç§�é”™é…�ä»Žæ ¡éªŒæ¼�了过去。本版三处改动:(1) å›žè¯»æ ¡éªŒå†�åŠ ä¸Š MI(完整 ID/å¸§æ ¼å¼�),ID å�˜äº†å°±ä¸€å®šæ˜¯æ�¢äº†å¸§ï¼Œæ²¡æœ‰å·§å�ˆç©ºé—´ï¼›(2) æ ¡éªŒå¤±è´¥æ”¹ä¸ºåŽŸåœ°é‡�å�–最多 3 次而ä¸�是直接丢弃 —— 失败时窗å�£é‡Œèººç�€çš„æ£æ˜¯å®Œæ•´çš„æ–°å¸§ï¼Œé‡�读一次通常就能拿全;(3) 整段å�–数放进 BASEPRI 临界区,挡ä½� preempt>=1 çš„ EtherCAT 䏿–。注:事å�Žï¼ˆ1.6.8)è¯�明本版方å�‘ä¸�æ˜¯ä¸»å› ï¼Œä½†è¿™ä¸‰æ�¡æœ¬èº«ä»�是æ£ç¡®çš„åŠ å›ºï¼Œäºˆä»¥ä¿�留。
|
|
|
|
|
|
1.6.6ï¼šæ ¹æ²» ECAT/CAN å�¶å�‘ä¹±ç � —— å�–帧ä¸�å†�用厂商库 can_message_receive。一æ�¡ 48B CANFD 报文è¦�对å�Œä¸€åœ°å�€ CAN_RFIFOMDATA0 连读 12 次æ‰�å�–完,整个过程ä¸�原å�;而厂商库置 RFD0 å�Žæ—¢ä¸�ç‰ç¡¬ä»¶è‡ªæ¸…也ä¸�æ ¡éªŒï¼Œå�–数过程会横跨 dequeueã€�读出两帧拼接。现改为本地 receiveFrameChecked():å�–æ•°å‰�å�Žå�„读一次 MP,比对 TS[31:16] 与 DLENC,ä¸�一致å�³åˆ¤å®šé‚®ç®±çª—å�£è¢«æ�¢å¸§ï¼Œæ•´å¸§ä¸¢å¼ƒå¹¶è®¡å…¥ Diag::rx_torn_count(ç»�输入 PDO 段 5 å��ç§» 486 原ä¿�ç•™ä½�上报,PDO 长度ä¸�å�˜ã€�EEPROM æ— éœ€é‡�刷);releaseFifo0() ç½®ä½�å�Žè½®è¯¢ç‰è‡ªæ¸…,且改用直接赋值 —— 原æ�¥çš„ |= 是读改写,会把期间硬件置起的 RFF0/RFO0(rc_w1) 顺手清掉,FIFO 溢出è¯�æ�®å°±æ˜¯è¿™ä¹ˆä¸¢çš„。å�¦ä¿® ISR 里 frame.id/stats.last_rx_id å�–自三路共享的 s_diag.last_rx_id(而 data å�–自局部 rx_message,会串出"A 通é�“ id é…� B 通é�“æ•°æ�®"),一律改用本帧局部 rxId。
|
|
|
|
|
|
1.6.5:段 2 电机槽补 seqlock(MotorSlot.wr_seq)。buildInput 跑在 PDI_Isr,会抢å� 主循环的 MotorState::onCanFrame,而那里是"å…ˆ seq=++global_seqã€�å�Ž memcpy(slot.data,48)"——抢å� è�½åœ¨ memcpy ä¸é€”就会å�‘布"æ–° seq + å�Šæ–°å�Šæ—§ 48B",主站å�ªæŒ‰ seq 判新鲜度分辨ä¸�出,混å�ˆè¾¹ç•Œè‹¥è�½åœ¨ float 的符å�·/指数å—节(B16/B20/B24)就是网页上的å�¶å�‘离谱值。现消费者è§� wr_seq 为奇数å�³è·³è¿‡æœ¬æ§½ï¼ˆè¯¥ 56B 留零,主站按 node_id==0 跳过ã€�下æ‹�自愈),win_count 改报窗å�£è·¨åº¦è€Œé�žå¡«å……数以ä¿�æŒ�按 i 定ä½�。CONFIG 路径ä¸�套é”�:它å�ªå†™ config_* 与æ�’ç‰çš„ node_id/channel,buildInput ä¸�å�Œè¯»è¿™äº›ã€‚槽布局ä¸�å�˜ ⇒ 输入 PDO ä»� 496B,EEPROM/SII æ— éœ€é‡�刷。
|
|
|
|
|
|
1.6.4:电机槽 40B→56B(8B 头 + v0.74 çš„ 48B STATUS),æ¯�æ‹�槽数 7→5(段 2 çš„ 280B æ£å¥½ 5×56)。修掉两件事:buildInput 按 48B æ‹·è´�时溢出 16B ç›–ä½�段 3 长帧快照;主站侧 STATUS 被截到 32B 使 InitStatus(B32-35) 永远拿ä¸�到ã€�网页把"æ— æ•°æ�®"显示æˆ� NORMAL。槽数×槽长ä¸�å�˜ ⇒ 输入 PDO ä»� 496B,EEPROM/SII æ— éœ€é‡�刷;主站需å�Œæ¥ MOT_SLOT_SIZE / MOT_SLOTS_PER_PDO / MOT_STATUS_DLC。
|
|
|
|
|
|
1.6.3:processOutput ä¸�å†�从 out 回读 WIN@8——1.6.0 èµ· out å�ªåœ¨ seq 沿那æ‹�æ–°é²œï¼Œæ— æ²¿å‘¨æœŸé‡Œå®ƒæ˜¯ä¸Šä¸€æ¬¡å…¨é‡�读的残值,于是æ¯�æ‹�用开机首æ‹�çš„ 0 盖掉 peekOutput 刚å�–到的新值,电机状æ€�扫æ��窗å�£è¢«é’‰æ»åœ¨åŸºå�€ 0,槽ä½� 7..26(node3 å�Šä»¥ä¸Šï¼‰æ°¸ä¸�上报,å�ªæœ‰ä¸»ç«™çœŸå�‘一帧æ‰�å¤�ä½�。WIN çš„æ¯�æ‹�刷新改由 peekOutput 独å� 。判æ�®ï¼šä¸�å�‘任何帧,从站回显 win_base 也应ç‰äºŽä¸»ç«™è¯·æ±‚值。 */
|
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)
|
2026-09-09 03:04:53 +08:00
|
|
|
|
* æ•°æ�®æ®µç›®æ ‡: 5.0 Mbps = 90MHz / (3 × 6 TQ)ï¼Œé‡‡æ ·ç‚¹ 83.3%
|
2026-07-02 02:02:41 +08:00
|
|
|
|
*
|
|
|
|
|
|
* @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
|
|
|
|
|
2026-09-09 03:04:53 +08:00
|
|
|
|
/** @brief 数�段预分频值。
|
|
|
|
|
|
* CAN_DBT 的 DBAUDPSC[9:0] 独立于仲�段 BAUDPSC,数�段�自�分频。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_CAN_DATA_PRESCALER = 3U;
|
|
|
|
|
|
/** @brief æ•°æ�®æ®µå†�å�Œæ¥è·³è·ƒå®½åº¦ã€‚上é™�å�— BS2=1TQ 约æ�Ÿï¼Œä¸�å�¯æ”¾å®½ã€‚ */
|
2026-07-06 19:13:56 +08:00
|
|
|
|
constexpr uint32_t CONFIG_CAN_DATA_SJW = CAN_BT_SJW_1TQ;
|
2026-09-09 03:04:53 +08:00
|
|
|
|
/** @brief æ•°æ�®æ®µæ—¶é—´æ®µ 1。4TQ + 1TQ(å�Œæ¥) + 1TQ(BS2) = 6TQ → 5 Mbps。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_CAN_DATA_BS1 = CAN_BT_BS1_4TQ;
|
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;
|
2026-09-08 00:52:35 +08:00
|
|
|
|
/* 1.6.13:CAN RX �到 preempt=0(与 EtherCAT SYNC0 �级)。
|
|
|
|
|
|
* 1.6.12 的 PDI 入�预抽实测:溢出确实大�(overfull 50/s→0)但拼接照旧
|
|
|
|
|
|
* (指纹è¿�è§„ ~92/s,且 torn åœ¨æ— æº¢å‡ºé˜¶æ®µä»� 1-7/s 在涨)—— 357µs çš„ PDI
|
|
|
|
|
|
* 阻塞窗�本身就是病�:窗�内 FIFO 满溢�窗�的�时,被冻结的�帧路径
|
|
|
|
|
|
* 还留ç�€ä¸�ä¾�赖溢出的æ�¢å¸§è·¯å¾„(MI/MP å�ªæŠ“到少数)。preempt=0 一并æŽ�æ–:
|
|
|
|
|
|
* RX ISR ��被 PDI/SYNC1/SCHED 压�(FIFO 深度 ≤2,溢出与冻结�时消失),
|
|
|
|
|
|
* 且与 SYNC0 å�Œçº§äº’ä¸�抢å� —— receiveFrameChecked 的多å—å�–数自æ¤çœŸæ£åŽŸå�。
|
|
|
|
|
|
* TX ISR 留在 2:PDI 上下文有 TX �交,�到 0 会引入�交/释放竞争。
|
|
|
|
|
|
* 代价:SYNC0/PDI å�¶å�‘ µs 级延迟(RX ISR ~3µs/帧 × ~8kHz ≈ 2.4% å� 空),
|
|
|
|
|
|
* 相对 1ms 周期与 165µs 总线时间是零头。 */
|
|
|
|
|
|
constexpr uint32_t CONFIG_IRQ_PREEMPT_CAN_RX = 0U;
|
2026-07-06 19:13:56 +08:00
|
|
|
|
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 */
|