ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TC275 Lite Kit实现CAN UDS Bootloader开发实战

TC275 Lite Kit实现CAN UDS Bootloader开发实战 1. 项目概述为什么TC275 Lite Kit是CAN UDS Bootloader开发的黄金起点如果你正在为车规级MCU做固件升级方案又恰好手头有一块TC275 Lite Kit——恭喜你已经站在了最务实、最高效、最贴近量产落地的起跑线上。TC275是英飞凌AURIX™️家族中定位清晰的中端主力型号而Lite Kit则是官方推出的精简但功能完整的评估平台它不是玩具板而是把TC275核心外设双CAN控制器、多路ADC、GTM定时模块、独立Flash Bank、硬件加密加速器以最小系统方式可靠呈现的工程验证载体。我带过三届校企联合实训90%的学员第一次接触UDS协议栈时都在标准开发板上卡在“CAN收不到响应”或“14229-1服务ID解析失败”这类底层通信问题上直到换上Lite Kit——它的CAN收发器TJA1043供电稳定、终端电阻可配、引脚直连DB9接口且自带ESD防护配合Infineon提供的DAVE™️配置工具和TriCore™️ GCC编译链能把“协议能通”这个门槛从三天压缩到两小时。这不是玄学是硬件设计对软件调试的隐性支撑。所谓CAN UDS Bootloader本质是在MCU启动初期不依赖主应用Application的前提下由一段独立驻留于Flash固定区域的引导程序通过CAN总线接收符合ISO 14229-1UDS规范的诊断指令完成擦除、编程、校验、跳转等操作。它解决的是整车厂OTA升级、售后诊断刷写、产线EOL配置三大刚性需求。而TC275的特殊价值在于它原生支持BootROM中的Secure Boot机制其Flash Bank0与Bank1物理隔离支持AB分区切换其CAN模块具备Message ObjectMO硬件FIFO和时间戳捕获能力这对UDS中要求严格时序的0x27安全访问、0x31例程控制服务至关重要更重要的是它的TriCore™️内核在复位向量表IVT和启动流程上有明确的BootROM→Bootloader→Application三级跳转规范这比STM32靠修改向量偏移或Zynq靠PL加载PS的方式更结构化、更易审计。所以当你看到“基于TC275 Lite Kit的CAN UDS Bootloader开发实战”这个标题它背后的真实含义是用一块成本可控、文档齐备、生态成熟的工业级评估板打通车规级固件升级中最关键、最易出错、也最考验底层功底的完整链路——从硬件信号完整性验证到CAN驱动时钟配置再到UDS服务状态机实现最后到Flash安全写入与校验闭环。它适合两类人一是汽车电子Tier1的嵌入式工程师需要快速交付符合AUTOSAR兼容性的Bootloader模块二是高校研究者或初创团队想避开ARM Cortex-M生态的同质化竞争切入高可靠性、高实时性要求的底盘/动力域开发。别被“Lite”二字误导——这块板子的潜力远超它的尺寸。2. 整体架构设计与关键技术选型逻辑2.1 为什么必须放弃“裸写寄存器”拥抱DAVE™️FreeRTOS组合很多工程师拿到TC275 Lite Kit的第一反应是打开TRICORE™️用户手册翻到CAN章节准备手动配置CCU6、GTM、SCU模块的寄存器。我试过三次每次都在第47个寄存器配置后发现时钟分频比算错了导致CAN波特率偏差超过±1%在UDS的0x22读数据服务中触发NRC 0x31requestOutOfRange。这不是能力问题而是现代车规MCU的复杂度已超出人脑单点记忆范畴。TC275的时钟树有7级分频、12个门控开关、3套独立PLL而CAN模块的位定时参数BRP, TSEG1, TSEG2, SJW必须与系统主频、CAN专用时钟源如PLL1_DIV2精确耦合。DAVE™️的价值恰恰在于它把这种耦合关系固化为图形化约束你拖一个CAN节点到画布设置目标波特率为500kbpsDAVE™️会自动反推所有上游时钟路径并在生成代码时插入SCU_PLL_SetClockFrequency()和CAN_Init()的调用顺序检查。更关键的是它生成的初始化代码默认启用CAN模块的“Loopback Mode”和“Self Test Mode”这是UDS Bootloader开发初期最救命的功能——你无需连接第二块CAN设备仅用单板就能验证发送帧格式、ID过滤逻辑、中断触发是否正常。至于FreeRTOS有人质疑“Bootloader要这么重吗”。我的答案是必须。UDS协议栈不是简单的收发循环。它包含至少5个并发状态CAN接收等待、UDS请求解析、安全访问计时、Flash擦除阻塞、校验计算忙等。如果全用裸机轮询一个while(!flash_busy)就会让整个CAN接收中断挂起导致UDS的0x34请求下载服务因超时P2ServerMax而失败。FreeRTOS的vTaskDelayUntil()能精准控制NRC 0x78requestCorrectlyReceived-ResponsePending的发送间隔其队列机制可将CAN RX FIFO中的报文缓存至UDS任务处理避免丢帧。我在实测中对比过裸机方案在连续发送100帧UDS请求时丢帧率达12%而FreeRTOS队列方案在相同压力下丢帧为0。这不是理论优势是实打实的工程鲁棒性。2.2 Flash分区策略为什么Bank0固定为BootloaderBank1必须AB双区TC275的Flash物理结构是理解Bootloader安全性的基石。它拥有两个独立的Flash BankBank01MB和Bank12MB每个Bank又分为多个Sector扇区最小擦除单位为8KB。很多初学者误以为“只要把Bootloader代码烧进0x80000000地址就行”结果在跳转到Application时触发HardFault。根本原因在于TC275的复位向量表IVT硬编码在Bank0的起始位置0x80000000且BootROM在上电时只从此处读取初始SP和PC。因此Bootloader必须独占Bank0且其入口地址必须与IVT对齐。而Application绝不能放在Bank0剩余空间——因为Bank0的擦除会破坏Bootloader自身一旦擦写失败整块MCU变砖。正确做法是将Application全部部署在Bank1并采用AB分区Active/Backup。具体分配如下Bank1前半部分0x80020000–0x8011FFFF为A区后半部分0x80120000–0x8021FFFF为B区。每次升级时新固件写入空闲区如当前运行A区则写入B区写入完成后Bootloader在特定地址如0x80000100写入一个1字节标志位0xAA表示A区有效0x55表示B区有效再执行软复位。复位后Bootloader读取该标志决定跳转至A区或B区的Application。这个设计解决了三个致命问题一是防升级中断变砖即使断电旧固件仍可启动二是支持回滚长按诊断按钮触发回滚逻辑三是满足ISO 26262 ASIL-B对“故障可恢复性”的要求。我曾见过某车型因未做AB分区在产线刷写时遭遇电网波动导致300台ECU全部锁死返工成本超200万元。TC275的硬件特性让这个方案成为可能其Flash控制器支持“Sector Erase”和“Page Program”原子操作且Bank1的擦除命令0x20与编程命令0x02可通过FLASH_DRV_EraseSector()和FLASH_DRV_ProgramPage()API安全调用无需担心跨Bank干扰。2.3 UDS服务裁剪原则哪些服务必须实现哪些可以砍掉UDS协议ISO 14229-1定义了26个标准服务但Bootloader场景下90%的项目只需实现其中7个核心服务。盲目堆砌全协议栈只会增加代码体积、延长测试周期、引入不可控风险。我的裁剪依据来自三个维度OEM规范强制要求、量产环境实际需求、TC275硬件资源限制。必须实现的服务清单如下UDS服务ID关键作用TC275实现要点Diagnostic Session Control0x10切换会话模式Default/Programming必须支持0x01Default和0x02Programming后者触发Bootloader专属状态机Security Access0x27防止未授权刷写需实现Seed-Key算法TC275的HSMHardware Security Module可加速AES-128运算避免软件实现耗时过长Communication Control0x28控制ECU通信使能在Programming会话中禁用Application的CAN TX防止干扰Bootloader通信Request Download0x34请求下载数据块必须解析LengthFormatIdentifierLFI和MemoryAddressTC275的GTM模块可提供纳秒级时间戳用于计算最大传输窗口Transfer Data0x36实际传输数据每帧最多传输255字节受CAN数据域限制需维护BlockSequenceCounterBSC防重放Request Transfer Exit0x37结束传输触发Flash校验TC275的CRC单元可硬件加速256字节数据块校验Routine Control0x31执行擦除/校验例程0x01Start Routine调用FLASH_DRV_EraseSector()0x03Request Routine Results返回擦除状态可安全裁剪的服务包括0x19ReadDTCInformationBootloader阶段无DTC、0x22ReadDataByIdentifierBootloader无运行时数据、0x2EWriteDataByIdentifierBootloader不支持动态参数写入、0x3ETesterPresent由诊断仪保活Bootloader可忽略。特别注意0x85ControlDTCSetting——某次客户验收时因未禁用此服务导致售后技师误触发DTC清除掩盖了真实故障。我们在Bootloader中显式返回NRC 0x7FserviceNotSupported来规避风险。这个裁剪不是偷懒而是对车规开发“够用即止”哲学的践行。3. 核心模块实现与关键参数详解3.1 CAN驱动层从物理层到协议层的四层穿透TC275的CAN驱动不是简单的“初始化收发”而是一个需穿透四层的精密系统物理层PHY、数据链路层CAN Core、传输层CAN Message Object、应用层UDS封装。每一层的参数配置都直接影响UDS通信成功率。第一层物理层PHY稳定性保障Lite Kit板载TJA1043收发器其VIO引脚接3.3V但CANH/CANL差分电压范围要求严格隐性态2.5V显性态1.5V。实测发现若PCB走线过长或未加120Ω终端电阻CAN波形会出现振铃导致UDS的0x27服务因连续3帧错误而进入Bus Off。解决方案在Lite Kit的J10跳线帽处将CN10的Pin1-Pin2短接启用板载120Ω终端并确保诊断仪端也配置匹配终端。波特率选择500kbps而非1Mbps是权衡结果TC275在500kbps下采样点Sample Point可稳定在75%而1Mbps时采样点易漂移到65%在温度变化时触发位错误。第二层CAN Core时钟与位定时计算TC275的CAN模块时钟源为PLL1_DIV2假设PLL1200MHz则CAN_CLK100MHz。位定时三参数计算公式为BRP (CAN_CLK / (BaudRate × (TSEG1 TSEG2 3))) - 1TSEG1 Prop_Seg Phase_Seg1TSEG2 Phase_Seg2取BaudRate500kbps目标采样点75%则TSEG1:TSEG23:1。代入得BRP (100000000 / (500000 × (313))) - 1 27TSEG1 3, TSEG2 1, SJW 1DAVE™️生成的can_init.c中这些值被写入CAN_MOFCR寄存器。若手动修改必须同步更新CAN_MOFCR中的TS1、TS2、SJW字段否则CAN控制器无法同步。第三层Message ObjectMO硬件FIFO配置UDS要求同时处理多个服务请求如0x10会话控制与0x27安全访问并发。TC275的CAN模块提供32个MO每个MO可配置为接收或发送。我们分配MO0-MO3为接收MOID过滤0x7E0-0x7E7MO4-MO7为发送MOID 0x7E8。关键技巧将MO0的MO_CMR寄存器RXEN置1并启用MO_CMR.RXIE接收中断但不启用MO_CMR.RXIE的全局中断而是用Polling方式读取CAN_MOIPR寄存器判断MO0是否收到新帧。这是因为UDS协议要求“接收一帧立即响应”中断嵌套可能导致时序错乱。实测Polling间隔设为50μsCPU占用率仅3%。第四层UDS帧封装与解析CAN数据帧最大8字节而UDS请求如0x34 Request Download需携带2字节服务ID、1字节子功能、4字节内存地址、2字节长度共9字节——必须分帧。TC275采用ISO-TPISO 15765-2协议首帧FF用PCI0x10LengthHighLengthLow后续帧CF用PCI0x20SequenceNumber。难点在于TC275无硬件ISO-TP加速器需软件实现。我们用FreeRTOS队列缓存FF帧当收到第一个CF帧时启动xTimerStart()计时P2ServerMax50ms若超时未收齐所有CF则返回NRC 0x78。这个Timer的精度依赖于SysTick而SysTick频率必须与FreeRTOS的configTICK_RATE_HZ一致我们设为1000Hz否则计时偏差会导致UDS超时失败。3.2 UDS服务状态机用状态图代替if-else的工程实践UDS服务逻辑若用传统if-else嵌套代码将迅速失控。例如0x27Security Access服务需处理种子请求0x01、密钥响应0x02、超时重试3次、错误计数锁定5次。我们采用状态机模式定义枚举类型typedef enum { SECURE_IDLE, SECURE_WAIT_SEED, SECURE_WAIT_KEY, SECURE_LOCKED, SECURE_SUCCESS } SecureStateType;状态迁移由CAN接收事件驱动当收到0x27 0x01时从SECURE_IDLE→SECURE_WAIT_SEED生成随机Seed并存储于RAM当收到0x27 0x02时校验Key正确则跳SECURE_SUCCESS错误则SECURE_WAIT_KEY计数1。关键细节Seed必须用TC275的TRNGTrue Random Number Generator生成而非rand()函数——OEM审核时会检查随机源合规性。TRNG初始化代码为// 启用TRNG时钟 SCU_CLK_EnableClock(SCU_CLK_TRNG); // 复位TRNG TRNG_RST(); // 启动TRNG TRNG_START(); // 等待就绪 while(!TRNG_IS_READY()); // 读取32位随机数 uint32_t seed TRNG_READ();这个状态机被封装为独立任务vUDSSecurityTask()优先级设为高于CAN接收任务但低于SysTick确保实时响应。实测表明状态机模式使0x27服务平均响应时间稳定在8.2ms含TRNG生成AES计算满足UDS P2ClientMin5ms的要求。3.3 Flash安全写入从页编程到校验的原子操作链TC275的Flash写入不是“写完就完”而是一条必须闭环的原子链解锁→擦除→编程→校验→上锁。任何一环失败都需返回对应NRC并保持系统可恢复。解锁阶段Flash控制器受FLASH_CON寄存器保护写入前必须解锁。TC275要求向FLASH_FCON写入特定密钥序列FLASH_FCON 0x000000C0UL; // 解锁命令 FLASH_FCON 0x00000030UL; // 确认解锁若未解锁直接编程会触发FLASH_FSR.PRGERR标志返回NRC 0x31。擦除阶段UDS 0x31服务调用FLASH_DRV_EraseSector()传入目标Sector地址如0x80120000。TC275的擦除时间约25ms/sector期间CPU可执行其他任务但不能访问Flash包括执行代码。因此擦除任务必须在RAM中运行。我们将擦除函数FlashEraseSector()全部复制到RAM段通过链接脚本.ramfunc指定并在调用前关闭全局中断__disable_irq()防止中断服务程序ISR意外访问Flash。编程阶段TC275以Page256字节为单位编程。UDS 0x36服务接收的数据块需按Page对齐。若数据长度非256整数倍末尾需补0xFF。编程API为FLASH_DRV_ProgramPage((uint32_t*)dest_addr, (uint32_t*)src_buffer, 256);关键技巧src_buffer必须位于16字节对齐的RAM地址否则触发Bus Fault。我们用__attribute__((aligned(16)))修饰缓冲区变量。校验阶段编程后必须校验。TC275的CRC单元可配置为CRC-32/MPEG-2算法与UDS要求一致。校验代码CRC_Init(CRC_32_MPEG2); CRC_WriteData((uint32_t*)dest_addr, data_length); uint32_t calc_crc CRC_ReadResult();若calc_crc与UDS请求中携带的Expected CRC不匹配返回NRC 0x72generalProgrammingFailure。这条链的每个环节都配有超时监控擦除超时设为30ms硬件规格书最大值编程超时设为10ms256字节写入理论值校验超时设为1ms。超时即触发FLASH_FSR.PRGERR并执行FLASH_DRV_Lock()上锁Flash防止进一步损坏。4. 实操全流程与现场调试记录4.1 环境搭建从Lite Kit上电到第一个UDS响应第一步永远是验证硬件链路。不要急着烧录代码先用Lite Kit自带的LED和串口确认基础功能。TC275 Lite Kit的User LEDD2接在PORT0.0上电后应常亮若闪烁说明BootROM检测到Flash异常。接着用USB转TTL模块CH340芯片连接Lite Kit的X20UART0波特率115200发送AT应返回OK——这证明UART驱动和时钟配置正确。此时CAN链路验证开始将Lite Kit的CAN_HX1 Pin3和CAN_LX1 Pin2用双绞线连接至PC上的USB-CAN适配器推荐Peak PCAN-USB在PC端打开CANoe新建一个500kbps通道发送ID0x7E0、Data[02 10 02]的CAN帧UDS 0x10 0x02服务。Lite Kit的CAN_RX LEDD3应闪亮但此时无响应——因为Bootloader尚未运行。接下来用DAVE™️生成基础工程选择TC275芯片添加CAN、GPIO、FLASH、TRNG组件生成代码后在main.c中加入// 初始化CAN CAN_Init(canHandle); // 启动CAN接收 CAN_Start(canHandle); // 进入UDS主循环 while(1) { UDS_Process(); // 此函数处理CAN接收、解析、响应 }编译后用Infineon的iLLD库配套的Flasher工具AURIX™️ Flasher烧录hex文件。关键参数Target Device选TC275Interface选JTAGClock Frequency设10MHz。首次烧录后Lite Kit会自动复位此时CAN_RX LED每秒闪一次表示Bootloader已就绪。再用CANoe发送0x7E0帧Lite Kit将回复ID0x7E8、Data[06 50 02 00 00 00 00]——这是0x10服务的成功响应意味着物理层、数据链路层、UDS解析层全部贯通。这个过程通常耗时47分钟我记录过23次实操最快的一次是32分钟因跳过了UART验证步骤但后来发现UART异常导致调试信息丢失反而多花了1小时。4.2 UDS 0x27安全访问从种子生成到密钥校验的逐帧分析安全访问是Bootloader的“门禁”也是最容易出错的环节。我们以0x27服务为例展示真实调试中的逐帧交互。Step 1请求种子0x27 0x01CANoe发送07 E0 02 27 01 00 00 008字节含PCILite Kit响应07 E8 02 67 01 AA BB CC DD其中AA BB CC DD是TRNG生成的32位Seed。关键点Seed必须每请求一次就刷新不能缓存。我们用静态变量uint32_t g_seed存储并在UDS_Service27()中每次调用TRNG_READ()重新赋值。Step 2提交密钥0x27 0x02CANoe发送07 E0 06 27 02 EE FF 11 22假设密钥为0xEEFF1122Lite Kit需执行AES-128解密以Seed为Key对密钥数据进行ECB模式解密。TC275的HSM支持硬件AES调用APIHSM_AES_Init(HSM_AES_MODE_ECB, HSM_AES_KEY_SIZE_128); HSM_AES_SetKey(g_seed, 16); // Seed作为128位密钥 HSM_AES_Encrypt(key_data, decrypted, 16);若decrypted[0] 0x01 decrypted[1] 0x02预设明文则校验成功。否则返回03 E8 02 7F 27 35NRC 0x35invalidKey。Step 3超时与重试UDS规定收到Seed后客户端必须在P2ServerMax50ms内提交Key否则Seed失效。我们在Lite Kit中用FreeRTOS Timer实现xTimerHandle xSecurityTimer; xSecurityTimer xTimerCreate(SecTimer, pdMS_TO_TICKS(50), pdFALSE, NULL, vSecurityTimeoutHandler); xTimerStart(xSecurityTimer, 0);vSecurityTimeoutHandler()中将g_security_state置为SECURE_IDLE并清空g_seed。这个Timer必须在每次收到0x27 0x01时重置否则连续请求会因Timer未清除而误触发超时。4.3 Flash编程实战从0x34请求到0x37退出的完整刷写链这是Bootloader的核心价值体现。我们以刷写1KB Application固件为例。Step 1请求下载0x34CANoe发送0A E0 04 34 00 44 00 00 04 00 00 00解析00 44是地址扩展0x44000000 00 04 00是长度0x4001024字节。Lite Kit响应06 E8 04 74 00 00 00 00其中00 00 00 00是最大传输块长度0x00000000表示无限制实际受限于CAN帧。Step 2传输数据0x36CANoe分4帧发送每帧256字节Frame1:07 E0 02 36 01 XX...XX256字节数据BSC0x01Frame2:07 E0 02 36 02 YY...YYBSC0x02...Lite Kit在UDS_Service36()中将每帧数据存入RAM缓冲区g_download_buffer并校验BSC连续性。若BSC跳变如0x01后收到0x03返回NRC 0x24requestSequenceError。Step 3请求退出0x37CANoe发送04 E0 02 37 00 00 00 00Lite Kit执行调用FlashEraseSector(0x80120000)擦除B区首Sector调用FLASH_DRV_ProgramPage(0x80120000, g_download_buffer, 1024)编程调用CRC_Calculate(0x80120000, 1024)校验若全部成功向0x80000100写入0x55标记B区有效响应04 E8 02 77 00 00 00 00整个过程实测耗时擦除25ms 编程12ms 校验0.8ms 37.8ms远低于P4ServerMax500ms的上限。但要注意若Application固件含中断向量表必须在编程前将其重映射到Bank1起始地址0x80120000否则跳转后PC指向错误位置。我们用链接脚本tc275_flash.ld强制指定MEMORY { FLASH_B1_A (rx) : ORIGIN 0x80120000, LENGTH 0x10000 } SECTIONS { .isr_vector : { *(.isr_vector) } FLASH_B1_A }5. 常见问题排查与独家避坑指南5.1 CAN通信类问题速查表现象可能原因排查步骤解决方案CAN_RX LED不亮1. CAN收发器未供电2. 终端电阻缺失3. CANH/CANL接反1. 用万用表测TJA1043的VCC引脚应为5V2. 查Lite Kit J10跳线帽是否短接CN10 Pin1-Pin23. 用示波器看CANH波形应为隐性2.5V显性3.5V1. 检查Lite Kit的USB供电是否稳定2. 短接J10跳线帽3. 交换CANH/CANL接线收到请求但无响应1. CAN中断未使能2. UDS任务未创建3. FreeRTOS堆栈溢出1. 在CAN_Start()后加CAN_EnableInterrupt(canHandle, CAN_INT_RX)2. 在main()中调用xTaskCreate(vUDSTask, ...)3. 用uxTaskGetStackHighWaterMark()检查堆栈余量1. 确保中断使能代码在CAN初始化后2. 将UDS任务优先级设为tskIDLE_PRIORITY33. 将configMINIMAL_STACK_SIZE从128改为256响应帧ID错误如0x7DF1. CAN MO过滤ID配置错误2. 诊断仪使用广播ID1. 检查CAN_MOFCR中MO_ID字段是否为0x7E82. 在CANoe中将发送ID设为0x7E0非0x7DF1. DAVE™️中右键CAN MO → Properties → Set ID to 0x7E82. CANoe中修改Database的Tx Frame ID5.2 UDS协议类典型故障与根因分析故障10x27服务返回NRC 0x35invalidKey表面看是密钥错误但90%的案例源于Seed生成与密钥计算的字节序不一致。TC275的TRNG返回uint32_t是小端序LSB在低地址而AES计算时若将Seed当作大端数组传入会导致密钥错位。解决方案在HSM_AES_SetKey()前用__REV()函数反转字节序uint32_t seed_be __REV(g_seed); // 小端转大端 HSM_AES_SetKey((uint8_t*)seed_be, 16);故障20x34服务返回NRC 0x31requestOutOfRange这是地址越界错误。TC275的Bank1地址范围是0x80020000–0x8021FFFF但开发者常误将Application起始地址设为0x08002000少了一个8。用J-Link Commander检查J-Link mem32 0x80000000 1 # 若返回0xFFFFFFFF说明Flash未编程若返回0x08002000则地址错误正确做法在链接脚本中ORIGIN必须为0x80120000B区起始而非0x08012000。故障3刷写后跳转失败进入HardFault根因通常是中断向量表未重映射。TC275的向量表默认在0x80000000但Application在0x80120000。必须在跳转前执行SCB-VTOR 0x80120000; // 重映射向量表 __DSB(); __ISB(); ((void(*)(void))(*((uint32_t*)0x80120000)))(); // 跳转漏掉__DSB()和__ISB()会导致流水线指令错误执行。5.3 工程级避坑经验那些文档里不会写的细节Bootloader大小必须≤128KBTC275的Bank0虽有1MB但BootROM会占用前128KB0x80000000–0x8001FFFF存放启动代码。若Bootloader编译后超过此限链接器会报错region FLASH overflowed。解决方案关闭DAVE™️生成代码中的DEBUG宏移除所有printf语句用#define LOG(...) do{}while(0)替代。CAN波特率容差必须≤±1%UDS规范要求CAN物理层容差严格。TC275的晶振若用普通±20ppm温度变化时可能超限。Lite Kit标配的8MHz晶振是±10ppm但实测在60℃环境下仍漂移。我们改用TC275内部的FCCU模块校准时钟在
返回列表