1. 项目概述

如果你手头有一批德州仪器(TI)的TMS370系列8位微控制器,无论是用于产品原型开发、小批量试产,还是维修替换,都绕不开一个核心环节:把写好的程序代码“烧”进芯片里。这个“烧录”的过程,就是通过专门的编程工具,对芯片内部的EPROM或EEPROM存储器进行数据写入。TMS370系列编程工具,就是为这个目的而生的官方解决方案。它不是一个简单的“烧录器”,而是一套包含硬件编程板、PC端软件以及完整命令体系的集成环境,专门服务于TMS370家族从C702到C777等一系列型号。

这套工具诞生的年代,Windows 3.1还是主流操作系统,开发环境远没有今天集成开发环境(IDE)这么便捷。但正是这种“古老”的工具,蕴含着嵌入式开发最本质的流程:编译、连接、映射、编程、验证。理解它,不仅能让你搞定这些老芯片,更能深刻理解微控制器程序存储和部署的底层逻辑。无论是处理库存的老项目,还是维护仍在服役的经典设备,掌握这套工具的使用都是一项宝贵的实践技能。接下来,我将结合多年的硬件调试经验,带你从零开始,彻底吃透这套TMS370编程工具,让你不仅能照着步骤做,更能明白每一步背后的“为什么”。

2. 硬件系统搭建与核心原理剖析

2.1 编程工具硬件组成与接口解析

TMS370编程工具的核心硬件是一块专用的编程板。这块板子的设计思路非常直接:为不同封装的TMS370芯片提供物理适配和编程所需的精确电压与时序控制。

编程板布局与插座选择 : 编程板上设计了五组可剥离式焊盘孔位,分别对应不同引脚数的芯片封装:

  • IC1 : 用于40引脚双列直插封装(40-pin DIP)。这是早期微控制器常见的封装形式,体积较大,但手工焊接和插拔方便。
  • IC2 : 用于28引脚双列直插封装(28-pin DIP)。应用更为广泛,成本较低。
  • IC3 : 用于68引脚塑料有引线芯片载体(68-pin PLCC)。这种封装四面都有引脚,集成度更高,常用于功能更复杂的型号。
  • IC4 : 用于28引脚PLCC封装。
  • IC5 : 用于44引脚PLCC封装。

重要提示 : 编程板上有一个电源滑动开关(S1)。 务必确保在插拔芯片(IC)时,开关处于“OFF”位置。 带电操作极易因引脚间电位差产生瞬间大电流,导致芯片或编程板接口电路永久性损坏。这是一个需要养成肌肉记忆的安全习惯。

电源与通信连接详解

  1. 串行通信电缆 : 编程板通过一根“直通”型RS-232电缆与PC的串行通信端口(COM口)连接。这里的“直通”意味着电缆两端的引脚定义是一一对应的,而非交叉连接。根据手册提供的引脚分配表,我们需要关注几个关键信号:

    • TXD (发送) 与 RXD (接收) : 负责数据的双向传输。
    • DTR、DSR、RTS、CTS : 这些是硬件流控制信号,用于协调PC和编程板之间的数据发送节奏,防止数据丢失。虽然部分引脚标注“未使用”,但按照标准接法连接能保证最高的通信可靠性。
    • GND (信号地) : 确保通信双方有共同的参考电位,至关重要。

    在实际操作中,如果你手头的串口线是用于连接老式调制解调器的那种,大概率就是直通线。如果不确定,可以用万用表的导通档测量一下,两端相同序号的引脚(如2对2,3对3)应该是直接连通的。

  2. 电源输入 : 编程板需要一个外部的5V/500mA直流电源。板上有两种接入方式:桶形插孔(P1)和螺丝端子(P2)。 必须严格注意极性 ,板子上清晰地标注了“+”和“-”。使用一个稳定的线性电源适配器远比开关电源更合适,能减少噪声干扰,提高编程成功率。

2.2 目标芯片特性与编程前准备

TMS370系列芯片内部的程序存储器主要分两种: EPROM EEPROM 。理解它们的区别是正确使用编程工具的前提。

  • EPROM (Erasable Programmable Read-Only Memory) : 即可擦除可编程只读存储器。通常指需要紫外线照射十几到二十分钟才能擦除的窗口式芯片。对于TMS370这类掩膜或OTP(一次性可编程)版本,其内部的EPROM在编程后是无法擦除的。因此,在向EPROM区域编程前, 必须使用 BLANK 命令验证该区域是全空的(通常为0xFF) 。如果试图向已有数据的EPROM区域编程,会导致失败。
  • EEPROM (Electrically Erasable Programmable ROM) : 即电可擦除可编程存储器。它可以在电路板上通过施加特定的电信号进行擦除和改写,无需紫外线。对于EEPROM区域,编程前可以不进行空白检查,因为编程工具会先执行擦除操作。

关于PLCC插座的专业建议 : 手册中特别推荐了Yamhichi(实际应为Yamaichi,可能是手册笔误)品牌的易拔插插座。这不是广告,而是血泪教训换来的经验。PLCC封装芯片的引脚在芯片底部四周,普通插座拔插非常费力,容易弄弯甚至折断引脚。Yamaichi的“易提取”插座带有一个杠杆或顶出机构,可以毫不费力地安全安装和取下芯片,极大提高了工作效率并保护了昂贵的芯片。对应的型号如IC120-0284-308(28脚)、IC120-0444-306(44脚)、IC120-0684-304(68脚)是当时的行业标准。

双Bank EPROM设备的特殊处理 : 对于TMS370C758、C768、C777等型号,其EPROM被分为两个独立的存储块(Bank)。例如,C758的Bank 1地址为0x2000-0x5FFF,Bank 2地址为0x6000-0x9FFF。 编程工具不允许一次操作跨越这两个Bank的地址范围 。这意味着,如果你的程序恰好从0x5000开始,长度为0x2000,覆盖了0x5FFF到0x6000的区域,你必须将其拆分为两次编程操作:先编程0x5000-0x5FFF(Bank 1),再编程0x6000-0x6FFF(Bank 2)。在规划程序链接地址时,就需要提前考虑这个硬件限制。

3. 软件环境安装与配置实战

3.1 系统要求与软件安装步骤

编程工具软件 prg370w 是一个基于Windows 3.1环境的16位应用程序。虽然在现代64位Windows上运行会遇到兼容性问题,但在Windows XP或Windows 7的32位兼容模式下,通常可以正常运行。如果要在现代系统上使用,更稳妥的方案是在虚拟机(如VMware、VirtualBox)中安装一个Windows 98或Windows XP系统。

安装流程精讲

  1. 创建目录 : 在硬盘根目录(如C盘)下创建 370PRG 文件夹。使用 MD C:\370PRG 命令。建议路径不要有中文或空格,避免潜在的软件识别问题。
  2. 复制文件 : 将产品软盘的所有文件复制到新目录。使用 XCOPY /V /S A:\*.* C:\370PRG 命令。 /V 参数用于验证复制, /S 参数复制所有子目录。这一步确保了 sk370dv.prg (设备定义文件)、 init.cmd (初始化批处理文件)等关键文件就位。
  3. 创建程序组与图标(可选但推荐) : 在Windows程序管理器中创建一个新的程序组(例如命名为“TI TMS370 Tools”),然后将 prg370w.exe 文件从文件管理器拖拽到这个组里。之后,右键点击图标选择“属性”,在“命令行”中可以直接添加启动参数,例如 C:\370PRG\PRG370W.EXE -p2 ,这样每次双击图标就会自动使用COM2端口启动。

3.2 环境变量与批处理文件配置

这是确保编程软件能找到所需资源的关键一步,很多初次使用者遇到的问题都源于此配置不正确。

核心环境变量解析 : 你需要通过批处理文件(如 AUTOEXEC.BAT 或自定义的 .BAT 文件)设置两个环境变量:

  • D_DIR : 这个变量告诉编程软件,那些辅助文件(最重要的是 sk370dv.prg )存放在哪里。必须设置为 C:\370PRG (或你的实际安装路径)。
  • D_OPTIONS : 这个变量用于设置软件每次启动时的默认选项。例如, SET D_OPTIONS=-P2 表示默认使用串口2(COM2)进行通信。你也可以在这里指定默认加载的 .out 文件。

PATH语句的巧妙设置 : 在自定义的批处理文件中,建议使用 PATH=%PATH%;C:\370PRG 这样的语句。 %PATH% 代表了系统当前的路径设置,这样修改是在原有路径基础上追加,而不会覆盖掉系统或其他软件需要的路径。修改完 AUTOEXEC.BAT 后需要重启系统生效,而执行自定义的批处理文件(如 SETUP.BAT )则立即生效。

一个可靠的批处理文件示例

@echo off
REM 设置TI TMS370编程工具环境
SET D_DIR=C:\370PRG
SET D_OPTIONS=-p1
PATH=%PATH%;%D_DIR%
echo TMS370 Programmer Environment is ready.

将这个文件保存为 C:\370PRG\SETENV.BAT 。每次打开DOS窗口准备使用编程工具前,先运行一下这个批处理即可。

3.3 安装验证与首次运行

配置完成后,就可以进行验证了。如果创建了图标,直接双击运行。如果没有,则在Windows的“运行”对话框中输入 C:\370PRG\PRG370W.EXE SAMPLE (假设安装目录下有 sample.out 示例文件)。

成功的标志是看到软件界面分为三个窗口:顶部的 COMMAND (命令输入与信息输出)、左侧的 DISASSEMBLY (反汇编窗口)、右侧的 MEMORY (内存数据显示窗口)。在COMMAND窗口输入 load sample 后,如果能看到反汇编窗口出现汇编指令(如 MOVW #05dFFh, R021 ),并且MEMORY窗口显示内存数据(通常是大量的00),说明软件安装成功,并且能够正确加载和解析目标文件。

操作心得 : 第一次运行时,如果软件窗口显示不全或被裁剪,可以尝试调整窗口大小。但注意,这个老式软件界面是固定大小的,拉得过大周围会是黑边,拉得过小则会裁剪内容且无法滚动。最佳体验是在标准VGA模式(640x480)或更高分辨率的全屏DOS窗口下运行。

4. 编程工具界面与内存映射深度解析

4.1 用户界面构成与交互逻辑

编程工具的界面设计继承了早期调试器的风格,功能分区明确。三个核心窗口各司其职:

  1. COMMAND窗口 : 这是最主要的交互区域。底部的“>>>”是命令提示符,所有键盘命令都在这里输入。上方的显示区域会回显你的命令、输出结果(如编程进度百分比)、错误信息以及命令执行后的反馈。 所有编程、验证、上传的核心命令都在这里完成
  2. DISASSEMBLY窗口 : 实时显示从指定地址开始的内存内容对应的汇编指令。这对于验证加载的程序代码是否正确、或者查看芯片中已存程序的内容至关重要。它不是静态的,会随着你在COMMAND窗口使用 dasm addr 命令而更新。
  3. MEMORY窗口 : 以十六进制和ASCII形式显示一段连续内存地址的数据。白色显示的数据表示该地址区域已被“映射”(即软件认为可以合法访问),你可以直接点击某个数据字节进行编辑。红色显示的数据则表示“未映射”,不可编辑。 这个“映射”概念,就是下一节要讲的内存地图(Memory Map)

菜单栏(Menu Bar)提供了命令的图形化入口。例如,“Prog”下拉菜单就集成了 pgdevice blank prog ver upload 等所有设备编程相关命令。对于不熟悉命令的用户,使用菜单更加直观。

4.2 内存映射(Memory Map)的定义与重要性

内存映射是连接你的软件(链接器输出文件)和硬件(芯片实际存储空间)的桥梁。它明确告知编程软件:“芯片的哪一段地址范围是存在的、可访问的,并且是什么类型的存储器(RAM, EPROM, EEPROM)。”

为什么必须定义内存映射? 想象一下,你要往一个仓库(芯片)的某个货架(地址)上放货(程序)。内存地图就是仓库的平面图。如果没有地图,编程软件根本不知道0x2000这个地址对应的是芯片内部的EPROM,还是根本不存在的空间。试图向不存在的地址编程会导致错误。

如何建立内存映射? 软件自带了一个默认的初始化文件 init.cmd ,里面通常包含了一个通用(例如针对TMS370C756)的内存映射定义。你可以直接使用它,但对于其他型号芯片,最好加载对应的映射文件。在 maps 目录下,TI提供了针对不同型号的 .cmd 文件,如 c758.cmd c712.cmd 等。

在COMMAND窗口中,使用 take 命令加载特定映射:

>>> take maps\c758.cmd

这条命令会执行 c758.cmd 文件中的所有命令,其中就包含用 MA (Memory Add)命令为TMS370C758芯片添加EPROM和EEPROM地址范围的定义。

手动管理内存映射命令

  • MA : 添加一个内存范围。语法为 ma <起始地址>, <长度>, <类型> 。对于编程,类型必须是 EPROM EEPROM 。例如: ma 0x2000, 0x4000, EPROM
  • ML : 列出当前已定义的所有内存范围。
  • MD : 删除一个指定的内存范围。
  • MR : 重置(删除所有)内存映射。

避坑指南 : 最常见的错误之一就是内存映射与链接器命令文件(.cmd)中的 MEMORY 定义不匹配。例如,你的程序链接到了0x2100开始的位置,但内存映射只定义了0x2000-0x3FFF的EPROM范围,那么0x2100是在范围内的,没问题。但如果你不小心把程序链接到了0x4000,而这个地址未被映射为EPROM,编程时就会失败。务必确保编程工具中的内存映射与你的项目链接配置完全一致。

5. 完整的芯片编程工作流程

5.1 流程概览与设备选择

对一颗芯片进行编程,遵循一个严谨的流程: 选择设备 -> 空白检查(仅EPROM)-> 编程 -> 验证 -> (可选)上传回读 。这个流程最大限度地保证了数据写入的准确性。

第一步:设置设备名称 ( pgdevice ) 在编程任何芯片之前,必须用 pgdevice 命令告诉软件你正在操作的是哪个具体型号。这是因为不同型号的TMS370芯片,其内部存储器的组织方式、编程算法和时序可能略有不同。软件会根据设备名称,从 sk370dv.prg 文件中加载对应的配置参数。

命令格式很简单: pgdevice c758 (针对TMS370C758)。设备缩写名可以在手册的表格中查到,通常是型号的后几位,如c702、c712、c756等。一个特例是 c758_ (注意下划线),它用于区分旧版的TMS370C758与新版的C758A/B。如果选错设备,可能会遇到“Device selection failed”错误,或者更糟糕,编程时序不对导致芯片损坏或数据错误。

5.2 空白检查与数据编程

第二步:EPROM空白检查 ( blank ) 对于OTP或需要紫外线擦除的EPROM,在写入新数据前,必须确保目标区域是全FF(空白)状态。使用命令 blank <起始地址>, <长度> 。例如: blank 0x2000, 0x4000 。软件会读取芯片中该区域每一个字节,检查是否为0xFF。如果全部是0xFF,则通过;如果发现任何非0xFF的数据,则报错,提示该区域非空,不能编程。

第三步:执行编程 ( prog ) 这是核心步骤,将PC内存中的数据写入芯片的存储器。命令格式为 prog <起始地址>, <长度>[, <错误日志文件名>]

  • 地址与长度 : 这两个参数定义了你要编程的内存范围。它们必须完全落在之前用 MA 命令定义的、类型为 EPROM EEPROM 的地址范围内。地址可以是绝对的十六进制数(如0x2000),也可以是C表达式或函数名(如果你加载了带符号表的.out文件)。
  • 错误日志文件 : 这是一个可选但极其重要的参数。如果编程过程中发生任何错误(如校验失败、通信中断),软件会将错误详情写入你指定的文件。如果不指定,默认生成一个名为 $$err$$ 的文件。 强烈建议每次编程都指定一个独特的文件名 ,例如 prog_error.log ,便于后续排查。

编程过程通常需要几秒到几十秒,软件会在COMMAND窗口显示进度。期间 绝对不要断电或断开串口线

常见错误排查

  • “Error while accessing device” : 这是最典型的连接错误。请按以下顺序检查:
    1. RS-232电缆是否已牢固连接至PC和编程板?
    2. 编程板上的电源开关(S1)是否已拨到“ON”?
    3. 芯片是否已正确插入插座(方向是否正确?引脚有无弯曲?)?
    4. 在软件中设置的串口号(通过 -p 选项或 D_OPTIONS )是否与PC实际连接的COM口一致?
  • “Array is not successfully programmed” : 编程失败。检查错误日志文件,里面会记录第一个出错的地址。可能的原因有:电源电压不稳定、芯片已损坏、编程算法参数(由设备选择决定)不匹配、或者目标存储区域物理损坏。

5.3 验证与数据上传

第四步:验证编程结果 ( ver ) 编程完成后,必须进行验证以确保数据被正确写入。 ver 命令的语法与 prog 类似: ver <起始地址>, <长度>[, <差异日志文件名>] 。它会逐字节比较编程软件内存中的数据与芯片中对应地址的数据。

如果验证通过,不会有额外提示。如果失败,它会将每一个不匹配的字节地址、芯片中的值、软件内存中的值记录到差异日志文件中。这个文件是判断编程问题根源的关键。例如,如果发现大量地址的数据都是0x00,而预期是0xFF,可能是空白检查没做或芯片本身有问题;如果是随机错误,可能是通信干扰或电源噪声。

第五步:上传数据 ( upload ) 这个功能用于“读取”芯片中已编程的内容到PC内存中。命令为 upload <起始地址>, <长度> 。这在以下场景非常有用:

  • 备份 : 从一颗已编程的芯片中读取固件进行备份。
  • 调试 : 怀疑芯片内容被意外修改或损坏,读取出来与原始文件对比。
  • 复制 : 在没有源代码或目标文件的情况下,复制一颗芯片的程序到另一颗芯片(需注意法律和授权问题)。

上传的数据会覆盖编程软件内存中对应地址的当前内容。你可以随后使用 ms (Memory Save)命令将这些内存数据保存到一个二进制文件中。

6. 高级技巧与故障排除实录

6.1 批处理自动化与脚本编写

对于需要反复对同一型号芯片进行相同操作(如烧录量产固件)的情况,手动输入一系列命令效率低下且容易出错。此时,可以编写批处理脚本(.cmd文件),然后用 take 命令一次性执行。

一个典型的量产编程脚本示例 ( program.cmd )

rem 设置目标设备为TMS370C712
pgdevice c712
rem 加载内存映射文件(假设已针对c712配置好)
take maps\c712.cmd
rem 加载要烧录的程序文件
load my_firmware.out
rem 对EPROM区域进行空白检查(假设程序在EPROM中)
blank 0x2000, 0x2000
rem 编程EPROM区域,并指定错误日志
prog 0x2000, 0x2000, prog_errors.log
rem 验证编程结果,指定差异日志
ver 0x2000, 0x2000, verify_diffs.log
rem 如果验证通过,打印成功信息
echo Programming and verification completed successfully.
rem 如果任何一步出错,脚本会停止,并可在COMMAND窗口查看错误

将上述命令保存为 program.cmd ,然后在编程软件中只需输入 take program.cmd ,即可自动完成整个流程。你可以在脚本中加入更复杂的逻辑,比如检查 blank ver 命令的返回值(通过环境变量或输出信息判断),实现自动化的通过/失败检测。

6.2 常见问题深度排查表

下表汇总了使用TMS370编程工具时可能遇到的典型问题、可能原因及解决思路:

问题现象 可能原因 排查步骤与解决方案
软件启动失败,提示找不到文件 1. D_DIR 环境变量未设置或设置错误。
2. sk370dv.prg 等关键文件丢失。
1. 检查批处理文件,确认 SET D_DIR= 路径正确。
2. 检查 370PRG 目录下文件是否完整。
连接设备时提示“Error while accessing device” 1. 串口线松动或损坏。
2. 编程板未通电。
3. 芯片未插好或损坏。
4. PC串口被其他程序占用。
5. 软件串口号设置错误。
1. 重新插拔串口线,或更换一根确认可用的直通线。
2. 确认编程板电源指示灯亮,开关在ON。
3. 重新安装芯片,检查引脚。
4. 关闭可能占用COM口的软件(如超级终端)。
5. 检查启动参数 -p1 -p2 是否正确对应实际物理端口。
blank 检查失败,报告非空 1. 目标EPROM区域之前已被编程过(OTP芯片)。
2. 芯片是EEPROM,无需空白检查,此操作无意义。
3. 内存映射错误,读取了错误地址。
1. 确认芯片是否为全新的或已擦除的EPROM。OTP芯片只能写一次。
2. 确认编程区域类型,EEPROM跳过此步。
3. 用 ml 命令检查内存映射范围是否正确。
prog 命令中途失败,错误日志显示特定地址错误 1. 电源电压在编程高压脉冲期间跌落。
2. 芯片该存储单元物理损坏。
3. 通信受到干扰,数据传输出错。
1. 使用示波器检查编程板5V电源的稳定性,尤其在编程瞬间。建议使用线性电源。
2. 更换一颗芯片尝试。
3. 确保串口线远离电源线等噪声源,尝试降低通信波特率(如果软件支持设置)。
ver 验证发现大量不匹配 1. 编程过程实际上未成功,但软件未报错。
2. 芯片内容在编程后因电源问题丢失。
3. 用于验证的源数据(内存中的数据)在编程后被意外修改。
1. 仔细查看编程时的进度和最终提示,有时错误可能被忽略。重新执行整个流程。
2. 编程后立即验证,并确保验证期间供电稳定。
3. 编程后不要执行任何可能修改目标内存区的命令,直接进行验证。
可以编程但芯片在目标板不工作 1. 编程的地址范围错误,程序未烧录到正确的复位向量处。
2. 芯片配置位(如看门狗、时钟源)未正确设置。
3. 目标板硬件有问题。
1. 检查链接器命令文件,确认代码段(.text)的起始地址与编程地址一致,且包含复位向量(通常位于存储空间末尾)。
2. TMS370芯片的配置信息通常也存放在特定的EPROM/EEPROM地址。确保你的程序数据包含了正确的配置字节。参考具体型号的数据手册。
3. 将芯片插回编程板,用 upload 命令读取内容,与原始.out文件进行二进制比较,确认数据完全一致。

6.3 维护与实操心得

  1. 静电防护 : 处理TMS370这类CMOS芯片时,务必佩戴防静电手环,或在接触芯片前触摸接地的金属物体释放静电。静电是芯片的隐形杀手。
  2. 插座保养 : PLCC插座,尤其是易拔插插座的触点在多次使用后可能会氧化或变松。定期用电子接点清洁剂喷洒并插入拔出几次 dummy chip(假芯片)或旧芯片,可以保持接触良好。
  3. 文件管理 : 为每个项目建立独立的目录,存放对应的.out文件、链接器命令文件、自定义的初始化.cmd文件以及每次编程产生的日志文件。良好的文件管理能在出现问题时快速回溯。
  4. 理解“映射”与“访问” : 记住,MEMORY窗口中白色(可编辑)的区域不代表芯片里一定有这个存储器,只代表软件“认为”它可以访问。红色区域则是软件明确被告知不能访问的。编程操作( prog , ver , upload )只能对映射为 EPROM EEPROM 的白色区域进行。
  5. 关于双Bank芯片 : 对于C758/C768/C777,规划你的程序链接地址,避免代码段横跨两个EPROM Bank的边界。如果不可避免,需要在链接器命令文件中精确安排段的位置,并在编程时分成两次独立的 prog 操作。

掌握这套TMS370编程工具,更像是掌握了一种与硬件直接对话的语言。它没有现代图形化烧录器的便捷,但每一步操作都清晰可见,让你对“程序如何住进芯片”这个过程有了完全的控制力和深刻的理解。这种从底层掌控的感觉,正是嵌入式开发的乐趣所在。

更多推荐