第二章:TC3xx平台介绍——从架构到外设,再到开发环境

好,咱们进入第二章。这一章我会带你看看TC3xx系列MCU到底长什么样。说白了,就是先搞清楚我们手里的“武器”是什么,有哪些关键部件,以及怎么把它用起来。

我个人习惯是,在动手写Bootloader之前,先把硬件平台摸透。你想想看,如果连Flash怎么操作、DMA怎么触发都不清楚,后面写代码肯定要踩坑。我在项目中就见过不少同事,上来就写逻辑,结果外设配置搞反了,调试好几天才发现是硬件初始化的问题。

2.1 TC3xx系列MCU架构概览

TC3xx是英飞凌的AURIX系列,主打汽车电子。它最牛的地方是——多核架构。嗯,这里要注意,不是简单的双核,而是TriCore内核,一个核里集成了RISC处理器、DSP和微控制器三种能力。

我刚开始接触时也觉得复杂,但用久了你会发现,这种设计特别适合Bootloader场景。为什么?因为你可以让一个核跑Bootloader,另一个核跑应用,互不干扰。

架构上,TC3xx有几个关键点:

  • 多核CPU:通常有3个TriCore核,每个核有自己的本地内存(LMU、DSPR、PSPR)。
  • 共享资源:Flash、SRAM、外设总线都是共享的,但通过SRI(系统资源互联)总线仲裁。
  • 安全机制:有SMU(安全管理单元)和Lockstep模式,适合功能安全要求高的项目。

我记得第一次做TC3xx项目时,最让我头疼的是内存映射。每个核的地址空间不一样,稍不注意就访问到别人的地盘去了。后来我总结了一个经验:先看LMU(本地内存单元)的地址,再看全局地址,这样不容易乱。

2.2 关键外设简介

Bootloader开发中,有几个外设是绕不开的。我挑四个最重要的讲:Flash、DMA、CAN、GPT12。

2.2.1 Flash——Bootloader的“仓库”

Flash是Bootloader的核心。你要把固件写进去、读出来、擦除、校验,全得靠它。

TC3xx的Flash分两种:

  • PFlash(程序Flash):存放代码,读取速度快,但擦写次数有限(通常10万次)。
  • DFlash(数据Flash):存放配置参数、校准数据,擦写次数更多(100万次以上)。

操作Flash时,有个坑我必须要说:擦除前一定要确保没有正在执行的代码在Flash里。我曾经有一次在擦除PFlash时,忘了把中断向量表搬到RAM里,结果擦到一半,CPU去取中断向量,直接卡死。嗯,从那以后,我每次擦Flash前都会先检查代码位置。

下面是一个简单的Flash擦除示例(伪代码):

// 擦除一个PFlash扇区
void Erase_PFlash_Sector(uint32 sectorAddr) {
    // 1. 检查是否在RAM中运行
    if (IsCodeInFlash()) {
        // 搬移到RAM
        CopyToRAM();
    }
    // 2. 解锁Flash
    Flash_Unlock();
    // 3. 发送擦除命令
    Flash_SendCmd(ERASE_CMD, sectorAddr);
    // 4. 等待完成
    while (Flash_IsBusy());
    // 5. 校验
    if (Flash_Verify(sectorAddr) != OK) {
        // 错误处理
    }
}

2.2.2 DMA——数据搬运工

DMA(直接内存访问)在Bootloader里主要用来搬数据。比如从CAN接收缓冲区搬到Flash,或者从Flash搬到RAM做校验。

TC3xx的DMA模块有多个通道,每个通道可以独立配置。我个人习惯把通道0留给CAN接收,通道1留给Flash写入,这样逻辑清晰。

配置DMA时要注意:源地址和目的地址的对齐。TC3xx的DMA支持8位、16位、32位传输,但如果你源地址是8位对齐,目的地址是32位对齐,性能会下降。我建议统一用32位传输,效率最高。

小技巧:在Bootloader里,DMA传输完成后一定要检查错误标志。我曾经遇到过DMA传输中途被中断打断,导致数据错位,后来加了错误检查才解决。

2.2.3 CAN——通信主力

CAN总线是汽车电子最常用的通信方式。TC3xx集成了多个CAN节点(MCMCAN),支持CAN 2.0和CAN FD。

Bootloader里,CAN的主要任务是:

  • 接收上位机发来的固件数据包
  • 发送应答帧(ACK/NACK)
  • 处理诊断请求(比如UDS协议)

配置CAN时,我建议把波特率设为500kbps或1Mbps。为什么?因为这是汽车行业最常用的速率,兼容性好。我曾经试过用250kbps,结果上位机不支持,调试了半天才发现是波特率不匹配。

下面是一个CAN初始化示例:

// CAN模块初始化
void CAN_Init(void) {
    // 1. 使能时钟
    CAN_EnableClock();
    // 2. 配置波特率(500kbps)
    CAN_SetBitrate(500000);
    // 3. 配置消息对象
    CAN_ConfigMsgObj(MSG_OBJ_RX, 0x7E0, CAN_MSG_SIZE_8);
    CAN_ConfigMsgObj(MSG_OBJ_TX, 0x7E8, CAN_MSG_SIZE_8);
    // 4. 启动CAN
    CAN_Start();
}

2.2.4 GPT12——定时器与看门狗

GPT12是通用定时器模块,在Bootloader里主要用来:

  • 超时检测:比如等待CAN数据包时,超过一定时间没收到就报错。
  • 看门狗:防止Bootloader卡死。
  • 延时:比如擦除Flash后需要等待几毫秒。

TC3xx的GPT12有5个定时器单元,每个都可以独立配置。我一般用Timer 0做看门狗,Timer 1做超时检测。

注意:看门狗定时器一定要在Bootloader启动时尽快喂狗。我曾经见过一个项目,Bootloader初始化太慢,看门狗先超时复位了,结果永远进不了主循环。嗯,这个坑我踩过。

2.3 开发环境搭建

好了,硬件看完了,咱们得把开发环境搭起来。TC3xx主要有两个开发环境:AURIX Development Studio(免费)和HighTec(商业版)。

2.3.1 AURIX Development Studio

这是英飞凌官方的免费IDE,基于Eclipse。优点是:

  • 免费,不用破解
  • 自带编译器(TASKING)
  • 有例程和文档

安装步骤很简单:

  1. 去英飞凌官网下载安装包(约1.5GB)
  2. 双击安装,一路Next
  3. 安装完成后,导入一个例程试试编译

我个人习惯用AURIX Development Studio做原型验证,因为上手快。但如果你做量产项目,我建议用HighTec,它的优化更好。

2.3.2 HighTec

HighTec是商业编译器,支持TriCore架构。它的优势是:

  • 代码优化更激进,生成的二进制更小
  • 支持更复杂的调试功能
  • 有技术支持

搭建HighTec环境时,要注意:

  • 先安装HighTec IDE(基于Eclipse)
  • 再安装编译器(需要License)
  • 配置工程时,选择正确的芯片型号(比如TC397、TC364)

我记得第一次用HighTec时,编译一直报错,后来发现是编译器版本和芯片头文件不匹配。嗯,这里建议用HighTec v4.9.3.0以上版本,兼容性最好。

2.3.3 环境对比

特性 AURIX Development Studio HighTec
价格 免费 商业收费
编译器 TASKING HighTec GCC
优化等级 中等
适合场景 学习、原型验证 量产项目
我的建议:如果你是初学者,先用AURIX Development Studio跑通例程,熟悉了再切换到HighTec做优化。别一上来就用HighTec,万一配置错了,调试起来很痛苦。

小结

这一章我们看了TC3xx的架构、四个关键外设(Flash、DMA、CAN、GPT12),以及两个开发环境。说白了,就是让你对平台有个整体认识。

下一章,我们会深入Bootloader的启动流程,看看芯片上电后到底发生了什么。嗯,那部分更有意思。