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延迟要求
This commit is contained in:
@@ -60,6 +60,40 @@
|
||||
#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。 */
|
||||
@@ -81,7 +115,10 @@
|
||||
#define CONFIG_SCHED_TIMER_IRQn TIMER2_IRQn
|
||||
/** @brief 用户调度定时器时钟使能宏参数。 */
|
||||
#define CONFIG_SCHED_TIMER_RCU RCU_TIMER2
|
||||
/** @brief 用户调度定时器预分频值。 */
|
||||
/** @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
|
||||
@@ -127,7 +164,7 @@
|
||||
/** @brief APP 主版本号。 */
|
||||
#define APP_FW_VERSION_MAJOR 1U
|
||||
/** @brief APP 次版本号。 */
|
||||
#define APP_FW_VERSION_MINOR 1U
|
||||
#define APP_FW_VERSION_MINOR 2U
|
||||
/** @brief APP 补丁版本号。 */
|
||||
#define APP_FW_VERSION_PATCH 2U
|
||||
/** @brief APP 构建编号。 */
|
||||
@@ -179,8 +216,9 @@
|
||||
#define CONFIG_ETHERCAT_SYNC_MODE 0
|
||||
|
||||
/** @brief periodicIsr 最大执行时间告警阈值(µs)。实测超过此值需评估减小 PDO 大小或优化 EXMC 时序。
|
||||
* 当前阈值 5µs:基于 32 字节 PDO + EXMC 6 HCLK 时序的估算上限。
|
||||
* preempt=0 ISR 阻塞窗口 ≤ 此阈值时,CAN/SPI 中断需容忍。 */
|
||||
* 当前阈值 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 内存区的起始偏移。
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/**
|
||||
/**
|
||||
* @file hardfault.cpp
|
||||
* @brief HardFault 诊断处理——通过 USART0 输出故障寄存器信息。
|
||||
*
|
||||
@@ -56,7 +56,7 @@ static uint32_t detectApb2Clock(void) {
|
||||
uint32_t scss = (cfg0 >> 2) & 0x3U;
|
||||
uint32_t sysclk;
|
||||
if (scss == 0x2U) {
|
||||
sysclk = 180000000U; /* PLL = 180MHz(唯一配置的 PLL 目标频率) */
|
||||
sysclk = 180000000U; /* PLL = 180MHz(当前 PLL 目标频率) */
|
||||
} else {
|
||||
sysclk = 8000000U; /* IRC8M = 8MHz 或 HXTAL(未倍频时视为 8MHz) */
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ void TaskManager::tick100us()
|
||||
if(++g_scheduler.div_can_tx >= CONFIG_TASK_PERIOD_CAN_TX_TICKS) {
|
||||
g_scheduler.div_can_tx = 0U;
|
||||
g_scheduler.tick_100ms++;
|
||||
set(1UL << TASK_STATUS_LED);
|
||||
set((1UL << TASK_STATUS_LED) | (1UL << TASK_CAN_TX_SEND));
|
||||
}
|
||||
|
||||
if(++g_scheduler.div_heartbeat >= CONFIG_TASK_PERIOD_HEARTBEAT_TICKS) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/**
|
||||
/**
|
||||
* @file task_runner.cpp
|
||||
* @brief 任务执行器实现。
|
||||
*/
|
||||
@@ -152,7 +152,37 @@ void TaskRunner::taskCanRxPoll() { CanFd::poll(); }
|
||||
*/
|
||||
void TaskRunner::taskCanTxSend()
|
||||
{
|
||||
/* 当前阶段不做周期性发送调度。 */
|
||||
/* 启动后每 100ms 向三路 CAN 通道发送 CANFD+BRS 64 字节测试帧。
|
||||
* 帧格式:扩展帧 29-bit ID,CANFD+BRS,DLC=64。
|
||||
* 载荷布局:
|
||||
* [0] 通道号 0/1/2
|
||||
* [1] 保留
|
||||
* [2..5] 发送序号(小端 uint32,每通道独立递增)
|
||||
* [6..9] 系统运行秒数 g_app_uptime_sec(小端 uint32)
|
||||
* [10..63] 递增填充 0x00..0x35(固定模式,便于抓包校验) */
|
||||
static uint32_t seq[3] = {0U, 0U, 0U};
|
||||
|
||||
for (uint8_t ch = 0U; ch < 3U; ++ch) {
|
||||
uint8_t data[64];
|
||||
data[0] = ch;
|
||||
data[1] = 0U;
|
||||
const uint32_t s = seq[ch];
|
||||
data[2] = static_cast<uint8_t>(s & 0xFFU);
|
||||
data[3] = static_cast<uint8_t>((s >> 8) & 0xFFU);
|
||||
data[4] = static_cast<uint8_t>((s >> 16) & 0xFFU);
|
||||
data[5] = static_cast<uint8_t>((s >> 24) & 0xFFU);
|
||||
data[6] = static_cast<uint8_t>(g_app_uptime_sec & 0xFFU);
|
||||
data[7] = static_cast<uint8_t>((g_app_uptime_sec >> 8) & 0xFFU);
|
||||
data[8] = static_cast<uint8_t>((g_app_uptime_sec >> 16) & 0xFFU);
|
||||
data[9] = static_cast<uint8_t>((g_app_uptime_sec >> 24) & 0xFFU);
|
||||
for (uint8_t i = 10U; i < 64U; ++i) {
|
||||
data[i] = i;
|
||||
}
|
||||
|
||||
const uint32_t extId = 0x1FFFFF00U | static_cast<uint32_t>(ch);
|
||||
CanFd::transmitFrame(ch, extId, data, 64U);
|
||||
seq[ch]++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -357,6 +387,7 @@ void TaskRunner::runPending()
|
||||
if(pending & (1UL << TASK_ADC_PROCESS)) taskAdcProcess();
|
||||
if(pending & (1UL << TASK_CAN_RX_POLL)) taskCanRxPoll();
|
||||
if(pending & (1UL << TASK_CAN_RX_PARSE)) taskCanRxParse();
|
||||
if(pending & (1UL << TASK_CAN_TX_SEND)) taskCanTxSend();
|
||||
if(pending & (1UL << TASK_STATUS_LED)) taskStatusLed();
|
||||
if(pending & (1UL << TASK_HEARTBEAT)) taskHeartbeat();
|
||||
if(pending & (1UL << TASK_DIAGNOSTIC_PRINT)) taskDiagnosticPrint();
|
||||
|
||||
Reference in New Issue
Block a user