STM32 HAL库CAN通信:轮询发送与中断接收的实战配置指南
1. 项目背景与核心需求解析最近在做一个基于STM32的工业数据采集节点需要和上位机以及几个传感器模块通过CAN总线进行数据交换。场景很简单就是我的主控STM32需要周期性地向上位机发送采集到的数据包同时又要能随时响应其他节点发来的控制指令或状态信息。这种“我主动发但不知道别人什么时候会发给我”的模式在嵌入式网络通信里太常见了。一开始图省事想用HAL库的轮询方式全包了但实测下来发现如果主循环里一直去轮询检查CAN是否收到数据会严重拖慢其他任务的执行效率整个系统响应变得很迟钝。而如果发送也用中断在需要保证发送周期稳定的场景下中断嵌套和优先级管理又会带来额外的复杂度。所以一个折中且实用的方案就浮出水面了CAN通讯采用“轮询发送 中断接收”。发送端由我的主循环控制想什么时候发就什么时候调用发送函数简单直接易于实现定时或触发式的发送逻辑。接收端交给中断任何节点发来的报文都能被即时响应、存入缓冲区不会阻塞主程序。这个组合拳在中小型、实时性要求中等的STM32项目里堪称黄金搭档。它平衡了代码复杂度、实时性和CPU占用率是很多工程师从裸机开发转向HAL库时实现可靠CAN通信的首选架构。2. CAN外设与HAL库驱动框架浅析在动手写代码之前有必要先捋清楚STM32的CAN外设在HAL库中是如何被“包装”和管理的。如果你以前用过标准外设库会发现HAL库的抽象层次更高它把很多硬件细节都封装起来了好处是移植方便坏处是如果不了解其机制一旦出问题调试起来就像隔着一层毛玻璃。2.1 CAN控制器的核心邮箱与过滤器STM32的CAN控制器如F1/F4系列常见的bxCAN硬件上提供了3个发送邮箱和2个接收FIFOFIFO0和FIFO1。发送邮箱你可以理解为三个并行的发送队列当调用发送函数时HAL库会帮你找一个空闲的邮箱把报文配置好然后启动发送。轮询发送本质上就是程序主动去“喂”数据给这些邮箱。接收端的核心是过滤器。CAN总线上的报文浩如烟海你的设备可能只关心其中一小部分。过滤器就是守门人它根据你设定的ID标准或扩展、掩码模式决定哪些报文能进入接收FIFO。在HAL库中过滤器的配置是一个重点配置不当会导致你收不到任何数据或者收到一堆垃圾数据。HAL库将过滤器的管理集成在初始化函数HAL_CAN_ConfigFilter中你需要理解掩码模式Mask Mode和列表模式List Mode的区别这直接决定了过滤的粒度。2.2 HAL_CAN_StateTypeDef状态机的妙用HAL库为每个外设驱动定义了一个状态机CAN也不例外其状态类型是HAL_CAN_StateTypeDef。常见的状态有HAL_CAN_STATE_RESET复位、HAL_CAN_STATE_READY就绪、HAL_CAN_STATE_LISTENING监听即正常模式、HAL_CAN_STATE_SLEEP_PENDING睡眠挂起等。这个状态机非常重要很多HAL库函数在执行前都会检查外设状态。例如在启动接收中断前CAN必须处于HAL_CAN_STATE_READY状态。在调试时如果发现函数调用返回HAL_ERROR不妨先打印一下CAN Handle的状态很可能就是状态不对。2.3 回调函数与中断处理流程HAL库采用了“初始化-启动中断-回调函数响应”的三段式中断处理。对于CAN接收流程是这样的调用HAL_CAN_Start()启动CAN。调用HAL_CAN_ActivateNotification()激活特定中断通知比如CAN_IT_RX_FIFO0_MSG_PENDINGFIFO0有新消息挂起。当符合条件的CAN报文到来触发中断进入HAL_CAN_RxFifo0MsgPendingCallback()这个弱定义的回调函数。我们在自己的代码中**重写Override**这个回调函数在里面调用HAL_CAN_GetRxMessage()获取报文数据并进行处理。这种设计将中断服务程序ISR的硬件响应与用户的应用处理逻辑解耦了使得代码更清晰。但要注意回调函数是在中断上下文被调用的因此里面的代码必须简短高效绝不能进行长时间操作或调用可能阻塞的函数如某些HAL_Delay。通常的做法是在回调函数里只做最核心的“取数据”和“设标志”操作把复杂的处理逻辑放到主循环中基于标志位去执行。3. CubeMX工程配置与代码生成要点现在我们从零开始使用STM32CubeMX工具来搭建一个“轮询发送中断接收”的CAN工程。这里以STM32F407VG和CAN1为例。3.1 Pinout Configuration 配置首先在Pinout视图找到“CAN1”。使能后默认的RX会映射到PA11TX映射到PA12。如果你的板子引脚不同可以重映射例如F1系列可以重映射到PB8,PB9。接着进入“Configuration”标签页点击CAN1进行详细配置。Basic Parameters基本参数:Prescaler (for Time Quantum): 这是决定CAN波特率的关键。时间份额tq (PCLK1) / (Prescaler)。对于F407如果APB1总线时钟PCLK142MHz目标波特率为1Mbps一个位时间通常设为10-13个tq。以12tq为例计算Prescaler PCLK1 / (BaudRate * TimeQuanta) 42M / (1M * 12) 3.5。取整为4则实际波特率为42M / (4 * 12) 875kbps。这里需要根据你的时钟和需求仔细计算。Time Quanta in Bit Segment 1和Segment 2: 这决定了采样点的位置。常见配置是BS15tq,BS22tq加上同步段SyncSeg1tq总共1528tq。上面我们用了12tq可以配置为BS19tq,BS22tq19212tq。采样点位于(1BS1) / (1BS1BS2)即(19)/12 ≈ 83.3%这是一个在工业中比较常用的位置。Mode: 选择Normal正常模式。Loopback环回和Silent静默模式用于自测试。Filter Configuration过滤器配置: 这是接收功能的灵魂。点击“Add Filter”。Filter Activate: 勾选启用。Filter Bank: 选择任意一个空闲的Filter Bank如0。STM32有多个过滤器组Bank每个组可以配置一个过滤器。Filter Mode: 选择Mask mode掩码模式。掩码模式更灵活它指定ID和掩码。掩码位为0表示“不关心”为1表示“必须匹配”。例如设置Filter ID 0x123Filter Mask 0x7FF标准ID全11位则表示只接收ID为0x123的报文。如果Filter Mask 0x7F0二进制11111110000则表示只关心高7位低4位任意那么ID从0x120到0x12F的报文都会被接收。Filter Scale: 选择32-bit或16-bit。32位模式可以配置一个标准/扩展ID的过滤器16位模式可以配置两个标准ID的过滤器。根据你的ID复杂程度选择。Filter FIFO Assignment: 选择FIFO0。我们让这个过滤器过滤出来的报文进入FIFO0。Filter Identifier和Filter Mask: 根据你的需求填写。例如想接收所有标准ID报文可以设Filter ID 0x0000,Filter Mask 0x0000掩码全0表示所有位都不关心。但注意在实际项目中强烈建议根据通信规划设置精确的过滤器以减少不必要的CPU中断。Parameter Settings参数设置:Auto Retransmission: 建议Enable。发送失败后自动重试提高可靠性。Transmit Fifo Priority: 选择By identifier按标识符优先级或By request order按请求顺序。根据你的应用决定。3.2 NVIC Settings 中断配置在“NVIC Settings”标签页找到CAN1 RX0 interruptsCAN1接收FIFO0中断。勾选Enabled并设置一个合适的优先级。如果你的系统还有其他中断需要合理规划优先级。CAN接收中断的优先级通常设置为比SysTick、关键任务定时器低但比一些非实时外设高。3.3 生成代码配置完成后在“Project Manager”设置好工程名、路径、IDE如MDK-ARM在“Code Generator”中选择“Copy only necessary library files”以减小工程体积。最后点击“GENERATE CODE”。生成的代码中重点关注main.c中的MX_CAN1_Init()函数它包含了我们刚才的所有硬件配置。stm32f4xx_it.c中自动生成了CAN1_RX0_IRQHandler()中断服务函数它内部会调用HAL_CAN_IRQHandler(hcan1)。我们不需要修改这个文件。我们需要在main.c或者自己的应用文件中重写回调函数并编写主应用逻辑。4. 核心代码实现轮询发送与中断接收工程生成后我们开始编写应用层代码。整个流程可以概括为初始化 - 启动CAN并激活接收中断 - 主循环中轮询发送 - 中断回调中处理接收。4.1 初始化与启动在main.c的main()函数中系统初始化后我们调用CubeMX生成的MX_CAN1_Init()。然后需要手动启动CAN并开启接收中断。// 变量定义 CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t TxData[8]; uint8_t RxData[8]; uint32_t TxMailbox; // 1. 启动CAN if (HAL_CAN_Start(hcan1) ! HAL_OK) { Error_Handler(); } // 2. 激活FIFO0消息挂起中断通知 if (HAL_CAN_ActivateNotification(hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) ! HAL_OK) { Error_Handler(); } // 3. 配置发送报文头可以放在循环外如果固定的话 TxHeader.StdId 0x123; // 标准ID TxHeader.ExtId 0x00; // 扩展ID标准帧时设为0 TxHeader.IDE CAN_ID_STD; // 标识符类型标准帧 TxHeader.RTR CAN_RTR_DATA; // 帧类型数据帧 TxHeader.DLC 8; // 数据长度码1-8字节 TxHeader.TransmitGlobalTime DISABLE; // 是否使用全局时间戳根据需求注意HAL_CAN_ActivateNotification必须在HAL_CAN_Start之后调用且CAN外设处于HAL_CAN_STATE_READY状态。一个常见的错误是初始化流程不对导致中断无法激活。4.2 中断接收回调函数实现这是中断接收的核心。我们在main.c的/* USER CODE BEGIN 4 */区域或其他用户文件中重写这个回调函数。/** * brief Rx FIFO0 消息挂起回调函数。 * param hcan: CAN句柄指针 * retval None */ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { // 1. 检查是否是CAN1触发的中断如果工程有多个CAN if (hcan-Instance CAN1) { // 2. 从FIFO0获取报文 if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, RxHeader, RxData) HAL_OK) { // 3. 成功获取到数据这里进行快速处理 // 例如设置一个接收完成标志位或者将数据拷贝到环形缓冲区 // 切记中断回调里不要做耗时操作 uint32_t receivedId RxHeader.StdId; // 或 RxHeader.ExtId uint8_t dataLength RxHeader.DLC; // 示例简单地将ID和数据存入全局变量供主循环查询 extern volatile uint32_t g_canRxId; extern volatile uint8_t g_canRxData[8]; extern volatile uint8_t g_canRxFlag; // 接收标志位 g_canRxId receivedId; for (int i 0; i dataLength; i) { g_canRxData[i] RxData[i]; } g_canRxFlag 1; // 置位标志通知主循环 } else { // 获取报文失败可能是FIFO溢出或其他错误应进行错误处理 // 可以调用 HAL_CAN_GetError(hcan) 获取错误码 } } }4.3 主循环中的轮询发送发送逻辑放在while (1)主循环中。你可以用定时器来精确控制发送周期也可以用简单的HAL_Delay在实时性要求不高的场合。while (1) { // 1. 检查接收标志位处理接收到的数据非中断上下文可以处理复杂逻辑 if (g_canRxFlag) { g_canRxFlag 0; // 清除标志 // 这里处理接收到的数据 g_canRxId, g_canRxData // 例如解析指令、更新状态、转发数据等 ProcessCANMessage(g_canRxId, g_canRxData); } // 2. 轮询发送逻辑例如每100ms发送一次 static uint32_t lastSendTick 0; if (HAL_GetTick() - lastSendTick 100) { lastSendTick HAL_GetTick(); // 准备要发送的数据 TxData[0] 0xAA; TxData[1] 0xBB; // ... 填充其他数据 // 调用HAL_CAN_AddTxMessage将报文加入发送邮箱 if (HAL_CAN_AddTxMessage(hcan1, TxHeader, TxData, TxMailbox) ! HAL_OK) { // 发送请求失败可能是所有发送邮箱都满了 // 可以加入重试机制或错误计数 } else { // 发送请求成功报文已加入邮箱硬件会自动发送 // 可以通过 HAL_CAN_GetTxMailboxesFullLevelStatus 检查邮箱状态 } } // 其他任务... // USER CODE END WHILE // USER CODE BEGIN 3 }提示HAL_CAN_AddTxMessage是一个非阻塞函数。它只是将报文配置到空闲的发送邮箱中并立即返回。真正的发送是由CAN控制器硬件在总线空闲时自动完成的。函数返回的TxMailbox参数告诉你报文被放入了哪个邮箱0,1,2这在需要监控特定报文发送状态时有用。5. 避坑指南与实战调试心得理论配置和代码框架都有了但让CAN真正稳定跑起来还得趟过几个常见的坑。下面是我在实际项目中总结的一些经验和调试方法。5.1 波特率计算不准导致通信失败这是头号杀手。症状是自发自收环回模式正常但两个节点之间无法通信。根因Prescaler、BS1、BS2计算错误或者系统时钟PCLK1配置有误。排查使用示波器或逻辑分析仪测量CAN_TX引脚波形计算实际波特率。与目标值对比。仔细核对SystemClock_Config()函数中APB1总线的分频系数。在CubeMX的Clock Configuration界面确认PCLK1的最终频率。使用公式反复验算波特率 PCLK1 / (Prescaler * (SyncSeg BS1 BS2))。其中SyncSeg固定为1个时间份额。心得在项目初期可以先将两个节点的波特率设得低一些如125kbps因为低频容错性更高。等通信稳定后再尝试提高速率。务必保证通信双方波特率严格一致包括采样点位置。5.2 过滤器配置不当收不到目标报文症状发送正常但收不到其他节点发来的数据或者收到了不该收的数据。根因过滤器ID或掩码设置错误导致报文被硬件过滤掉了。排查最直接的调试方法先将过滤器配置为“接收所有报文”。设置FilterIdHigh 0,FilterIdLow 0,FilterMaskIdHigh 0,FilterMaskIdLow 0模式为掩码模式。如果此时能收到数据说明硬件连接和基础配置没问题问题出在过滤器逻辑上。理解掩码计算在掩码模式下(收到的ID Mask) (Filter ID Mask)为真时报文才能通过。例如你想接收ID为0x18FF1001和0x18FF1002的扩展帧可以设Filter ID 0x18FF1000Filter Mask 0x1FFFFFF0低4位不关心。这样ID的低4位是任意值的报文都能通过。注意标准帧和扩展帧的区别标准帧是11位ID扩展帧是29位ID。在32位过滤器配置下它们存储在寄存器中的格式不同CubeMX帮我们处理了这些细节但自己写寄存器时需要特别注意。心得在复杂网络中合理规划ID和过滤器是网络设计的一部分。可以使用“过滤器组”将不同优先级的报文分配到不同的FIFO如高优先级进FIFO0低优先级进FIFO1并在中断回调中区别处理。5.3 中断回调函数处理不当导致系统卡死症状程序运行一段时间后死机或者响应变慢。根因在中断回调函数HAL_CAN_RxFifo0MsgPendingCallback中执行了耗时操作如打印大量信息printf、复杂的浮点运算、等待标志位等导致中断无法及时退出影响了其他中断和任务调度。解决严守“快进快出”原则回调函数里只做最必要的操作——读取数据、存入缓冲区、设置软件标志位。使用环形缓冲区这是最专业的做法。在回调函数中将RxHeader和RxData拷贝到一个预先定义好的环形缓冲区中。主循环定期检查并从这个缓冲区中取出数据包处理。这能有效应对数据突发。避免使用HAL_Delay任何形式的延时函数在中断中都是禁止的。注意变量共享中断和主循环共享的变量如标志位、缓冲区索引应使用volatile关键字声明防止编译器优化。对于多字节数据如数组在读写时考虑临界区保护简单的项目可以暂时关闭中断进行短时保护。5.4 发送邮箱满错误症状调用HAL_CAN_AddTxMessage返回HAL_ERROR通过HAL_CAN_GetError检查发现是HAL_CAN_ERROR_TX_ALST或邮箱满错误。根因发送频率过高或者总线负载太重导致报文发送不出去三个发送邮箱都被占满。解决检查总线状态使用HAL_CAN_GetError或HAL_CAN_GetState查看是否有总线离线错误。总线错误会导致发送失败邮箱被占。实现发送重试机制如果发送失败可以等待一小段时间如检查HAL_CAN_GetTxMailboxesFreeLevel再重试而不是直接丢弃。降低发送频率评估你的应用是否真的需要如此高的发送频率。监控发送完成中断可以激活发送完成中断CAN_IT_TX_MAILBOX_EMPTY在回调函数中获知邮箱已空再进行下一次发送实现流控。但这会引入更多中断需要权衡。5.5 硬件连接与终端电阻这是最基础也最容易被忽视的。CAN_H 和 CAN_L 接反通信完全无法建立。确保CAN_H通常黄色接CAN_HCAN_L通常绿色接CAN_L。缺少终端电阻CAN总线两端最远的两个节点必须各接一个120欧姆的终端电阻用于阻抗匹配消除信号反射。如果只有两个节点直接在它们之间并联一个120欧姆电阻也行。用万用表测量CAN_H和CAN_L之间的电阻在总线断电情况下应为60欧姆左右两个120欧并联。共地确保所有CAN节点有良好的共地连接否则可能导致差分信号电平异常。调试时可以遵循“由简到繁”的步骤先确保单个节点自发自收环回模式正常再测试两个节点点对点通信最后加入更多节点。善用逻辑分析仪或专业的CAN总线分析仪如PCAN-USB, ZLG的CAN卡抓取总线上的原始报文这是定位问题最强大的武器。

相关新闻

C++异常处理:从错误码到异常机制的全面解析与实践指南

C++异常处理:从错误码到异常机制的全面解析与实践指南

1. 从“错误码”到“异常”:为什么我们需要另一种错误处理方式?如果你写过一段时间的C,尤其是和底层系统、网络或者复杂业务逻辑打过交道,那你一定对“错误码”这套机制不陌生。函数返回一个int,0代表成功,…

2026/10/16 11:32:02 阅读更多 →
接口测试从工具操作到体系化思维的跨越:面试与实战深度解析

接口测试从工具操作到体系化思维的跨越:面试与实战深度解析

1. 接口测试面试的核心战场:从“会测”到“懂测”的跨越又到了一年一度的招聘旺季,最近帮团队面试了不少软件测试工程师,发现一个挺有意思的现象:几乎每个候选人简历上都写着“熟练掌握接口测试”,Postman、JMeter这些…

2026/10/20 15:30:21 阅读更多 →
单片机信号链设计:运放与AD/DA转换原理及工程实践

单片机信号链设计:运放与AD/DA转换原理及工程实践

1. 项目概述:从模拟到数字的桥梁搞单片机开发,尤其是涉及到传感器数据采集或者控制信号输出,AD和DA这两个词你肯定绕不过去。AD(模数转换)负责把现实世界连续变化的模拟信号,比如温度、压力、光照强度&…

2026/10/19 10:33:12 阅读更多 →

最新新闻

lingbot-map:自然语言驱动的空间语义理解系统

lingbot-map:自然语言驱动的空间语义理解系统

1. “lingbot-map”不是地图SDK,而是一个语义驱动的空间认知原型系统第一次看到“lingbot-map”这个名字时,我下意识去查了主流地图服务商的开放平台文档、GitHub上热门的地理可视化库,甚至翻了几个开源GIS项目的命名惯例——结果一无所获。它…

2026/10/21 4:15:42 阅读更多 →
思维链原理与三大模型实测:从Prompt到Agent多步推理落地指南

思维链原理与三大模型实测:从Prompt到Agent多步推理落地指南

思维链这个词,这两年在大模型圈子里几乎是绕不开的热词。我自己在调Agent、做复杂任务拆解的时候,也明显感受到:同一个模型,用不用思维链,效果差距就像实习生直接交作业和逐步汇报思路之间的差距。很多朋友问我说Claud…

2026/10/21 4:15:42 阅读更多 →
人脸识别实战指南:从One-Shot学习到工程部署踩坑总结

人脸识别实战指南:从One-Shot学习到工程部署踩坑总结

人脸识别这块内容,我在整理某知名深度学习公开课程的笔记时反复啃过好几遍。课程原话讲得精简,逻辑也很清晰,但真到项目里去落地,中间会冒出不少课程里没有细讲的工程细节。这篇文章把我对课程笔记的深入理解、在实际项目中补充验…

2026/10/21 4:15:42 阅读更多 →
YOLOv5s部署实战:PyTorch转ONNX再到OpenVINO的CPU推理全流程

YOLOv5s部署实战:PyTorch转ONNX再到OpenVINO的CPU推理全流程

最近刚把一个 YOLOv5s 目标检测模型完整走了一遍部署链路:从 PyTorch 预训练权重转成 ONNX,再用 OpenVINO 变成推理加速模型,最后在 Windows 10 上用 Python 做实际推理测试。整个过程在 CPU 上完成,没有碰 GPU,效果却…

2026/10/21 4:15:42 阅读更多 →
用Metal优化Transformer推理:从CPU 4.9到GPU 31.5 tok/s的完整实践

用Metal优化Transformer推理:从CPU 4.9到GPU 31.5 tok/s的完整实践

把Transformer模型的推理链路整体搬到苹果芯片的GPU上,用Metal从头组织计算图和算子,这件事我从去年底开始做,前后改了四版。最终效果是解码吞吐从CPU路线的个位数涨到了30 tokens/s,同一个约1.1B参数的decoder-only模型&#xff…

2026/10/21 4:15:42 阅读更多 →
系统化提升个人技能:从技能地图到学习闭环

系统化提升个人技能:从技能地图到学习闭环

今年我陆续和朋友聊了十几场关于个人成长的私话,发现大家焦虑的点出奇一致:不是没在学,而是学的东西太多太散——今天刷两节剪辑课,明天收藏几个AI工具,后天又报名一个Excel进阶班,忙活大半年,最…

2026/10/21 4:14:42 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →