尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AURIX TC234L原生Bootloader实战:从硬件配置到CAN/UART程序更新全解析

AURIX TC234L原生Bootloader实战:从硬件配置到CAN/UART程序更新全解析 1. 从零开始理解AURIX TC234L原生Bootloader的起点最近在折腾英飞凌的AURIX TC234L这颗车规级MCU发现很多朋友在问怎么用它自带的Bootloader。这确实是个挺关键的问题尤其是在汽车电子或者工业控制这类对启动安全、程序更新有严格要求的地方。我自己在项目里也踩过不少坑从最开始对着手册发懵到后来能稳定地用CAN或者串口给板子刷程序中间经历了不少“为什么连不上”、“为什么校验失败”的夜晚。今天我就把自己折腾TC234L原生Bootloader的完整过程、核心原理和那些手册里不会写的实操细节系统地梳理一遍。简单来说AURIX TC234L芯片内部固化了一段出厂时就写好的程序这就是我们说的“原生Bootloader”或者“BSL”。它的核心任务不是运行你的应用程序而是为应用程序的更新、验证和启动提供一个可靠、安全的底层通道。你可以把它想象成电脑主板上的BIOS它负责最基础的硬件初始化和引导流程。对于TC234L这个Bootloader支持通过多种接口最常见的就是CAN和串口来接收新的应用程序数据并将其烧录到芯片的Flash存储器中之后再将控制权交给这个新程序。这对于实现产品的现场升级、产线编程或者故障恢复至关重要。2. TC234L Bootloader的硬件与启动机制探秘要玩转Bootloader第一步必须是理解硬件是怎么配合的。TC234L的启动过程不是随意的它由一系列硬件引脚的状态和内部固件逻辑共同决定。2.1 启动模式的选择硬件引脚是关键TC234L上电或复位后首先会采样几个特定的引脚状态来决定它要进入哪种启动模式。这个步骤发生在你的应用程序代码运行之前完全由硬件逻辑控制。对于我们使用原生Bootloader来说最关键的是让芯片进入“ASC Bootloader”模式。这里涉及两个主要引脚MS0和MS1(Mode Select)这两个引脚的电平组合直接决定了芯片的启动源。例如从内部Flash启动、从外部存储器启动还是进入Bootloader模式。具体对应关系需要查阅TC234L的用户手册通常在“System Control Unit (SCU)”或“Startup and Boot”章节。一个常见的配置是将MS0和MS1都设置为低电平引导至主Flash但要从串口或CAN启动Bootloader通常需要特定的组合比如MS01, MS10可能对应ASC BSL模式。务必务必根据你手头具体型号的数据手册确认不同封装的引脚定义可能有细微差别。ASC接口引脚原生Bootloader通过异步串行控制器接口通信这包括了ASC0通常用作LIN/UART和CAN节点。你需要根据你选择的物理通信方式UART或CAN将对应的TX、RX或者CANH、CANL引脚正确连接到你的上位机或调试器。注意很多开发板为了方便会用跳线帽或者拨码开关来设置这些模式引脚。上电或复位前务必确保这些跳线设置正确。我遇到过无数次“连不上”的问题最后发现都是模式引脚没设对。2.2 Bootloader的“藏身之处”与运行流程TC234L的原生Bootloader代码是固化在芯片内部ROM里的用户无法修改。它的地址空间是固定的通常映射在内存地址0x8FFF 0000附近具体请查数据手册。当芯片根据模式引脚判断需要进入Bootloader时硬件会自动将程序计数器指向这个ROM区域的起始地址开始执行Bootloader固件。它的工作流程可以简化为以下几个阶段硬件初始化Bootloader首先初始化最小化的系统时钟、电源管理和必要的内存控制器。外设初始化根据预定义配置初始化一个或多个通信接口如ASC0UART或CAN节点。Bootloader会以固定的波特率例如115200 for UART或CAN波特率例如500kbps等待主机连接。协议监听Bootloader进入一个循环持续监听配置好的通信接口等待上位机发送符合其协议的指令帧。指令处理一旦接收到有效的指令如连接、擦除、编程、校验等Bootloader就会执行相应的操作访问用户Flash区域。启动/跳转完成编程或收到启动指令后Bootloader会进行必要的校验如检查应用程序起始地址的栈指针和程序计数器是否有效然后跳转到用户应用程序的入口地址通常是用户Flash的起始地址如0x8000 0000将控制权完全移交。理解这个流程非常重要因为它解释了为什么我们有时候需要“复位”或“重新上电”才能进入Bootloader以及为什么应用程序的链接文件.lsl文件必须将起始地址正确设置到用户Flash区域。3. 通信协议与上位机工具链搭建Bootloader准备好了接下来就需要一个能和它“对话”的上位机。TC234L的原生Bootloader使用英飞凌定义的一套二进制协议而不是简单的XMODEM或YMODEM。你需要一个实现了该协议的上位机软件。3.1 协议解析命令与响应协议基于请求-响应模型。上位机发送一个命令帧Bootloader执行后回复一个响应帧。帧结构通常包含起始码固定的字节如0xA5。长度字段指示后续数据段的长度。命令码指明要执行的操作例如0x10- 连接/启动会话0x11- 断开连接0x20- 擦除Flash扇区0x21- 编程Flash数据0x22- 校验数据0x30- 跳转到应用程序数据段命令相关的参数如目标地址、数据长度、实际数据内容等。校验和用于验证帧在传输过程中是否出错通常是帧中所有字节的累加和或CRC。例如一个简单的连接命令帧可能看起来像[A5] [04] [10] [00 00 00 00] [14]其中04是长度10是命令码四个00是数据14是校验和。Bootloader成功连接后会回复一个确认帧。3.2 工具选择与配置串口与CAN路径你有两个主流的上位机选择路径一使用英飞凌官方工具 DAvE Boot Camp这是一个图形化工具对新手比较友好。安装从英飞凌官网下载并安装DAvE Boot Camp。创建项目新建一个“Bootloader”项目选择你的具体芯片型号TC23xL。配置通信在项目设置中选择通信接口UART或CAN并设置正确的端口号、波特率等参数。对于UART你还需要安装对应的USB转串口驱动如CH340、CP2102等确保设备管理器中能识别到COM口。连接硬件将TC234L开发板的UART0P14.0作为TXP14.1作为RX通过USB转串口线连接到电脑。确保Boot模式引脚设置正确。操作在DAvE Boot Camp中你可以执行连接、擦除、编程、校验、启动等一系列操作。你需要将你的应用程序文件通常是.hex或.bin文件加载到工具中。路径二使用命令行工具lauterbach或开源脚本这对于自动化集成如CI/CD流水线更强大。lauterbach这是一个功能强大的调试器套件其TRACE32软件脚本可以驱动Bootloader流程。你需要编写或获取一个专用的BSL脚本通过SYStem.Mode Up或SYStem.Mode BSL命令让芯片进入Bootloader模式然后使用BSL命令族进行编程。这种方式通常与昂贵的Lauterbach硬件调试器绑定。开源Python脚本社区有一些基于pyserial或python-can库开发的开源脚本。你需要自己根据协议文档实现命令的组装、发送和响应解析。这需要较强的动手能力但最灵活。一个典型的脚本流程是import serial import time # 配置串口 ser serial.Serial(COM3, baudrate115200, timeout1) def send_bsl_command(cmd_data): # 构建帧起始码长度数据校验和 frame b\xA5 bytes([len(cmd_data)]) cmd_data checksum sum(frame) 0xFF # 简单累加和校验 frame bytes([checksum]) ser.write(frame) response ser.read(64) # 读取响应 # 解析响应判断是否成功 return response # 1. 发送连接命令 connect_cmd b\x10\x00\x00\x00\x00 resp send_bsl_command(connect_cmd) if resp[2] 0x00: # 假设响应帧第三个字节是状态0x00表示成功 print(Connected to BSL) # 2. 发送擦除命令... # 3. 分块发送编程数据... # 4. 发送校验命令... # 5. 发送跳转命令...对于CAN通信原理类似只是物理层和驱动库不同。你需要一个USB-CAN适配器如PCAN, ZLG的CANalyst等安装对应的驱动和API库。在上位机程序中使用CAN库函数来发送和接收带有特定CAN ID的帧。Bootloader的CAN ID通常是固定的例如标准帧ID0x6F1用于发送命令0x6F0用于接收响应。你需要将二进制协议帧封装在CAN数据场最多8字节中对于长数据帧还需要实现分段传输机制。4. 应用程序工程的适配与链接配置要让你的应用程序能被Bootloader正确加载和启动必须在编译链接阶段就做好适配。这是很多初学者容易忽略导致跳转后程序跑飞的关键。4.1 修改链接文件.lsl文件AURIX开发环境如Tasking, HighTec使用.lsl文件定义内存布局。默认的.lsl文件假设应用程序从Flash起始地址0x8000 0000开始。但Bootloader通常占据了这个起始区域的一部分虽然TC234L的原生BSL在ROM不占用户Flash但概念相通或者我们需要为Bootloader参数如CRC校验值预留空间。更常见的情况是你需要确保应用程序的中断向量表被重定位。Bootloader跳转后硬件中断会指向应用程序的中断向量表。因此你必须修改.lsl文件明确指定代码、数据、特别是中断向量表在Flash中的绝对起始地址。例如如果你决定从0x8000 4000开始存放应用程序为未来的Bootloader升级或参数区预留前面16KB空间你需要在.lsl文件中找到类似下面的部分并进行修改// 默认可能类似 group (ordered, contiguous, align8, run_addrmem:pspr0) { select .text.inttab; } // 修改为指定地址 group (ordered, contiguous, align8, run_addr0x80004000) { select .text.inttab; }同时确保代码段.text、常量数据段.rodata、已初始化数据段.data的加载地址load_addr和运行地址run_addr都正确配置在这个偏移之后。最稳妥的方法是基于一个已知可用的Bootloader示例工程的.lsl文件进行修改。4.2 设置启动代码与向量表偏移在main()函数之前启动代码Cstart会执行硬件初始化并初始化中断向量表。你需要确保编译器/链接器知道这个向量表的偏移量。在Tasking编译器中这通常在项目属性的“Compiler”-“Preprocessor”选项中通过定义宏来实现例如-D__VECT_BASE0x80004000这个宏会告诉启动代码中断向量表的基地址不再是默认的0x80000000而是你指定的地址。4.3 生成正确的可烧录文件Bootloader通常编程的是纯二进制数据。你需要从编译生成的.elf文件生成.hex或.bin文件。.hex文件包含地址信息对于UART BootloaderDAvE Boot Camp等工具可以直接使用。.bin文件纯粹的二进制映像不包含地址。如果你用自己写的脚本通过CAN烧录可能需要将.bin文件与目标起始地址如0x80004000一起处理。使用编译器自带的工具如cctcTasking或objcopyGCC可以从.elf生成这些文件。例如在Tasking IDE中可以在“Post-Build”步骤中添加命令。5. 实战流程一次完整的CAN Bootloader更新假设我们选择CAN作为通信接口下面是一次完整的操作流程包含了所有容易出错的细节。5.1 硬件连接与模式设置硬件TC234L开发板、USB-CAN适配器、12V电源、CAN终端电阻120欧姆通常开发板已集成。连接将USB-CAN适配器的CANH和CANL分别连接到开发板的CAN0H和CAN0L引脚。确保USB-CAN适配器已安装驱动并在上位机软件中能被识别。给开发板供电。模式设置关键步骤根据数据手册找到MS0和MS1引脚对应的跳线或测试点。将其设置为进入“ASC BSL via CAN”模式所需的电平。例如对于某些TC23x型号可能是MS01高电平MS10低电平。请以你的芯片数据手册为准设置好后对开发板进行复位或重新上电。这是必须的模式引脚只在复位时被采样。5.2 上位机软件配置与连接打开你的CAN上位机软件如ZLG的CANTest或你自研的Python脚本配合python-can库。配置CAN通道参数波特率必须与Bootloader内部设置的CAN波特率一致。TC234L原生BSL的CAN波特率通常是500 kbps。如果不确定可以尝试常见速率125k, 250k, 500k, 1M。工作模式正常模式。配置报文参数发送帧ID用于向上位机发送命令的CAN ID。例如0x6F1标准帧。接收帧ID用于接收Bootloader响应的CAN ID。例如0x6F0标准帧。需要设置接收过滤器只接收这个ID的帧。帧格式标准帧11位ID。数据长度8字节CAN 2.0A。发送连接命令。按照第3章描述的协议组装连接命令帧例如A5 04 10 00 00 00 00 14将其拆分填充到多个8字节CAN数据帧中发送。如果连接成功你应该能在接收窗口看到Bootloader回复的确认帧。5.3 擦除、编程与校验擦除Flash发送擦除命令。你需要指定要擦除的Flash扇区范围。TC234L的Flash被划分为多个扇区擦除必须以扇区为单位。通常你需要擦除整个应用程序将要占用的区域。命令中会包含起始地址和扇区数量。编程数据这是最耗时的步骤。将你的应用程序.bin文件按顺序分块读取。每块数据的大小需要适配CAN帧的数据场例如每7个字节的有效载荷打包进一个8字节的CAN帧其中1个字节用于序列号或分段控制。对于每个数据块组装编程命令帧命令码0x21包含目标地址、数据长度和实际数据然后通过多个CAN帧发送出去。Bootloader会将这些数据写入指定的Flash地址。注意Flash编程有对齐要求例如必须是256位的倍数。你的数据分包逻辑需要满足这个要求。编程命令之间最好加入少量延时如10ms避免总线负载过高或Bootloader处理不过来。校验数据编程完成后发送校验命令命令码0x22。Bootloader会读取刚刚写入的Flash数据计算校验和通常是CRC32并返回。上位机需要对自己发送的原始数据计算同样的校验和并与Bootloader返回的值进行比较。如果一致说明编程成功。5.4 启动应用程序与后续调试发送跳转命令发送跳转至应用程序命令命令码0x30并在命令中指定应用程序的入口地址即你修改后的.lsl文件中定义的起始地址如0x80004000。观察现象如果一切顺利Bootloader会执行跳转你的应用程序开始运行。你可以通过观察LED闪烁、串口打印如果应用程序初始化了串口或测量特定GPIO的电平来验证。调试技巧如果程序没有按预期运行检查链接地址再次确认应用程序的.lsl文件、启动代码中的向量表基地址宏定义是否与跳转命令中的地址完全一致。检查初始化代码确保应用程序的启动代码没有依赖Bootloader已经初始化过的硬件状态如时钟最好在应用程序的main()开头重新初始化关键外设。使用调试器在发送跳转命令前连接好JTAG调试器如Lauterbach或iSystem。在调试器中设置一个硬件断点在应用程序的入口地址0x80004000。发送跳转命令后看程序计数器能否停在那个断点。如果能说明跳转成功问题在应用程序本身如果不能说明跳转失败或地址错误。CAN通信干扰确保在应用程序启动后CAN控制器被正确初始化为应用程序所需的模式或者被禁用。否则应用程序的CAN通信可能会干扰仍在监听的上位机反之亦然。一个常见的做法是在应用程序初始化时完全重置并重新配置CAN模块。6. 避坑指南那些我踩过的“雷”折腾Bootloader的过程就是不断填坑的过程。下面分享几个典型的坑和解决方案。6.1 连接失败模式、波特率与物理层现象上位机发送连接命令后无任何响应。排查模式引脚这是头号嫌疑犯。用万用表测量MS0/MS1引脚的实际电平确保与数据手册要求的BSL模式电平一致。复位或重新上电了吗模式只在复位时采样。波特率不匹配确认上位机设置的CAN/UART波特率与Bootloader固件使用的波特率一致。对于CAN尝试500k和1M这两个最常见的。对于UART尝试115200。物理连接CAN线是否接反H对HL对L终端电阻是否启用总线两端各需120欧姆UART的TX和RX是否交叉连接MCU的TX接USB转串口的RX电源与复位MCU供电是否稳定复位引脚是否有毛刺尝试手动按下复位键再发送连接命令。6.2 编程过程中断或校验失败现象编程到一半失去响应或最后校验和不匹配。排查数据分包与延时检查你的数据分包逻辑。每个CAN帧是否都包含了正确的序列信息帧与帧之间是否留有足够的时间间隔例如10-50msBootloader处理每一帧数据、写入Flash都需要时间连续轰炸可能导致其缓冲区溢出或看门狗复位。Flash操作冲突确保没有其他中断服务程序在编程期间试图访问Flash。在编程关键阶段可以考虑全局关中断。校验算法确认你上位机计算校验和的算法如CRC32与Bootloader内部使用的算法完全一致。用一个已知的小数据块比如全0xAA测试一下。地址对齐Flash编程命令要求数据长度和地址满足特定对齐如256位。确保你发送的每个数据块都符合要求。6.3 跳转后程序“死机”或行为异常现象Bootloader报告跳转成功但应用程序没跑起来或者跑飞了。排查向量表地址这是最大可能。用调试器读取应用程序入口地址例如0x80004000开始的内存内容。前几个字应该分别是初始栈指针SP和程序计数器PC的值。SP的值应该指向有效的RAM区域PC的值应该指向你的__start或main函数附近的代码。如果这些值看起来是乱的全0xFF或全0x00说明.hex/.bin文件没有正确生成或烧录到了错误地址。启动代码初始化应用程序的启动代码是否依赖于Bootloader已经设置好的硬件状态更安全的做法是在应用程序的启动代码中重新初始化系统时钟、PLL、Flash等待周期等核心系统配置。不要假设Bootloader留下的状态是你要的。外设冲突Bootloader可能初始化了某个外设如CAN、UART而你的应用程序也试图初始化它导致冲突。在应用程序main()函数最开始先执行一个全面的外设复位通过SCU模块的PR寄存器然后再按需初始化。看门狗Bootloader可能开启了看门狗。如果应用程序没有及时喂狗会导致复位。检查Bootloader是否在看门狗并在应用程序启动后立即处理它。6.4 如何调试Bootloader本身如果你怀疑是Bootloader没有正常运行可以尝试以下方法测量引脚用示波器测量UART的TX引脚或CAN的TX引脚。在Bootloader启动后它可能会主动发送一些引导字符或特定波形。如果能看到有规律的波形说明Bootloader至少运行起来了。使用调试器如果芯片支持可以在复位后立即通过JTAG连接并暂停CPU。然后单步执行看看PC是否指向Bootloader的ROM区域0x8FFF xxxx。这需要你的调试器支持在Bootloader模式下连接有时需要特殊的“连接时序”如Connect Under Reset。最后最宝贵的建议是仔细阅读官方文档。英飞凌的《AURIX TC23x User Manual》中关于“Boot Mode Selection”和“BootROM”的章节以及《Bootloader Software Specification》应用笔记包含了所有协议细节和模式配置表。很多问题都能在里面找到答案。
返回列表