TMS370微控制器编程工具详解:从硬件搭建到软件配置与烧录流程
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”位置。 带电操作极易因引脚间电位差产生瞬间大电流,导致芯片或编程板接口电路永久性损坏。这是一个需要养成肌肉记忆的安全习惯。
电源与通信连接详解 :
-
串行通信电缆 : 编程板通过一根“直通”型RS-232电缆与PC的串行通信端口(COM口)连接。这里的“直通”意味着电缆两端的引脚定义是一一对应的,而非交叉连接。根据手册提供的引脚分配表,我们需要关注几个关键信号:
- TXD (发送) 与 RXD (接收) : 负责数据的双向传输。
- DTR、DSR、RTS、CTS : 这些是硬件流控制信号,用于协调PC和编程板之间的数据发送节奏,防止数据丢失。虽然部分引脚标注“未使用”,但按照标准接法连接能保证最高的通信可靠性。
- GND (信号地) : 确保通信双方有共同的参考电位,至关重要。
在实际操作中,如果你手头的串口线是用于连接老式调制解调器的那种,大概率就是直通线。如果不确定,可以用万用表的导通档测量一下,两端相同序号的引脚(如2对2,3对3)应该是直接连通的。
-
电源输入 : 编程板需要一个外部的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系统。
安装流程精讲 :
-
创建目录
: 在硬盘根目录(如C盘)下创建
370PRG文件夹。使用MD C:\370PRG命令。建议路径不要有中文或空格,避免潜在的软件识别问题。 -
复制文件
: 将产品软盘的所有文件复制到新目录。使用
XCOPY /V /S A:\*.* C:\370PRG命令。/V参数用于验证复制,/S参数复制所有子目录。这一步确保了sk370dv.prg(设备定义文件)、init.cmd(初始化批处理文件)等关键文件就位。 -
创建程序组与图标(可选但推荐)
: 在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 用户界面构成与交互逻辑
编程工具的界面设计继承了早期调试器的风格,功能分区明确。三个核心窗口各司其职:
- COMMAND窗口 : 这是最主要的交互区域。底部的“>>>”是命令提示符,所有键盘命令都在这里输入。上方的显示区域会回显你的命令、输出结果(如编程进度百分比)、错误信息以及命令执行后的反馈。 所有编程、验证、上传的核心命令都在这里完成 。
-
DISASSEMBLY窗口
: 实时显示从指定地址开始的内存内容对应的汇编指令。这对于验证加载的程序代码是否正确、或者查看芯片中已存程序的内容至关重要。它不是静态的,会随着你在COMMAND窗口使用
dasm或addr命令而更新。 - 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”
: 这是最典型的连接错误。请按以下顺序检查:
- RS-232电缆是否已牢固连接至PC和编程板?
- 编程板上的电源开关(S1)是否已拨到“ON”?
- 芯片是否已正确插入插座(方向是否正确?引脚有无弯曲?)?
-
在软件中设置的串口号(通过
-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 维护与实操心得
- 静电防护 : 处理TMS370这类CMOS芯片时,务必佩戴防静电手环,或在接触芯片前触摸接地的金属物体释放静电。静电是芯片的隐形杀手。
- 插座保养 : PLCC插座,尤其是易拔插插座的触点在多次使用后可能会氧化或变松。定期用电子接点清洁剂喷洒并插入拔出几次 dummy chip(假芯片)或旧芯片,可以保持接触良好。
- 文件管理 : 为每个项目建立独立的目录,存放对应的.out文件、链接器命令文件、自定义的初始化.cmd文件以及每次编程产生的日志文件。良好的文件管理能在出现问题时快速回溯。
-
理解“映射”与“访问”
: 记住,MEMORY窗口中白色(可编辑)的区域不代表芯片里一定有这个存储器,只代表软件“认为”它可以访问。红色区域则是软件明确被告知不能访问的。编程操作(
prog,ver,upload)只能对映射为EPROM或EEPROM的白色区域进行。 -
关于双Bank芯片
: 对于C758/C768/C777,规划你的程序链接地址,避免代码段横跨两个EPROM Bank的边界。如果不可避免,需要在链接器命令文件中精确安排段的位置,并在编程时分成两次独立的
prog操作。
掌握这套TMS370编程工具,更像是掌握了一种与硬件直接对话的语言。它没有现代图形化烧录器的便捷,但每一步操作都清晰可见,让你对“程序如何住进芯片”这个过程有了完全的控制力和深刻的理解。这种从底层掌控的感觉,正是嵌入式开发的乐趣所在。
更多推荐

所有评论(0)