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:
@@ -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