1. MC68331 BCC开发板一个被低估的嵌入式开发利器如果你在嵌入式领域摸爬滚打有些年头大概率听说过摩托罗拉后来是飞思卡尔现在是NXP的68K/ColdFire系列。MC68331作为这个家族中承上启下的32位微控制器在90年代到21世纪初的工业控制、汽车电子和通信设备中应用广泛。而它的官方评估板——BCCBoard for Chip Control则是一个功能相当扎实的开发与调试平台。今天我们不谈枯燥的历史而是从一个老工程师的视角来拆解这块板子的核心价值并手把手带你走通最经典的S-record程序下载流程。你会发现即便在今天理解这些“老古董”的运作方式对于深入理解嵌入式系统底层尤其是总线、调试接口和固件加载机制依然大有裨益。BCC开发板的核心价值在于它完整地暴露了MC68331 MCU的所有能力并提供了极其方便的评估和调试接口。它不仅仅是一块能让芯片跑起来的板子更是一个集成了监控程序CPU32BUG、用户内存、完整I/O扩展以及背景调试模式BDM接口的综合性平台。对于学习者而言它是理解经典微控制器系统架构的绝佳标本对于开发者而言它是快速验证硬件设计和软件算法的可靠工具。我们接下来的内容将围绕其功能解析和最重要的实操——如何把你的程序灌进去即S-record文件下载来展开。2. BCC开发板核心功能模块深度解析要玩转一块开发板首先得吃透它的“五脏六腑”。BCC开发板的设计清晰地体现了模块化思想我们可以将其分为几个核心部分来理解。2.1 心脏MC68331微控制器单元详解板载的MC68331是绝对的核心。它是一款高度集成的32位微控制器其设计理念在当年相当先进很多思想延续至今。2.1.1 32位CPU32核心这是MC68331的大脑与经典的MC68000/68010处理器对象码兼容。这意味着为早期16位68K处理器编写的大量软件可以相对平滑地迁移过来。它内部采用32位数据通路和算术单元但外部数据总线是16位的地址总线是24位可寻址16MB空间。这种设计在当时的工艺和成本限制下在性能和性价比之间取得了很好的平衡。它拥有8个32位通用数据寄存器和7个32位地址寄存器支持丰富的寻址模式并且区分用户和监管两种处理器状态与地址空间为运行简单的操作系统或监控程序奠定了基础。2.1.2 通用定时器模块GPT模块是一个11通道的定时器系统功能灵活。它包含两个相对独立的子模块比较/捕捉单元和脉宽调制单元。比较/捕捉单元包含3个输入捕捉通道、4个输出比较通道和1个可配置为输入捕捉或输出比较的通道。它们共享一个16位自由运行计数器。输入捕捉功能可以在外部引脚发生特定事件如边沿跳变时瞬间锁存计数器的当前值常用于精确测量脉冲宽度或频率。输出比较功能则可以在计数器达到预设值时自动改变输出引脚的状态用于产生精确的定时信号或PWM波。此外还有一个8位的脉冲累加器通道可以用于事件计数或门控时间累加。PWM单元拥有两个独立的PWM输出通道可以产生周期和占空比均可编程的方波。这对于驱动电机、控制LED亮度或生成简单的模拟电压通过滤波非常有用。如果不需要定时功能这些引脚大部分都可以作为通用的数字输入/输出口使用提供了额外的I/O灵活性。2.1.3 队列串行模块QSM模块集成了两个串行通信接口是MC68331与外界通信的重要桥梁。队列串行外设接口这是一个功能强大的同步串行接口支持全双工通信通过MOSI、MISO和SCK三根线工作。其最大亮点是内置了一个包含16个传输控制器的RAM队列允许CPU预先设置好最多16个串行传输任务每个8或16位然后QSPI模块可以自动、连续地执行这些任务无需CPU频繁干预。这极大地提高了与串行ADC、DAC、存储器等外设通信的效率。四个可编程的外设片选信号PCS0~/PCS3~可以方便地管理多个从设备。串行通信接口这是一个标准的异步串行接口也就是我们常说的UART。它支持NRZ格式波特率可通过16.78MHz系统时钟分频得到范围很宽。具备奇偶校验、帧错误检测等功能并支持通过空闲线或地址字节唤醒CPU适用于与PC、终端或其他微控制器进行通信。BCC板正是通过这个SCI经过电平转换芯片U5转换成RS-232C电平提供了与主机通信的串口。2.1.4 外部总线与片选逻辑MC68331提供了完整的外部总线接口24位地址线A0-A23和16位数据线D0-D15。数据总线支持动态总线宽度调整可以自动处理8位或16位外设的访问。12个独立可编程的片选信号是其一大特色每个片选可以独立配置其使能的地址范围从2KB到1MB、数据端口宽度8/16位和插入的等待状态数最多13个。这极大地简化了外部存储器如RAM、ROM和外围设备如FPGA、CPLD、其他接口芯片的接口设计无需额外的“胶合逻辑”。2.1.5 系统时钟与低功耗管理芯片内部集成了一个锁相环允许使用一个低频率的32.768kHz手表晶振来产生最高16.78MHz的系统时钟。这不仅降低了外部晶振的成本和设计难度还允许通过软件动态调整系统频率在需要高性能时全速运行在空闲时降低频率以节省功耗。此外CPU支持完全静态设计意味着可以通过执行低功耗停止指令彻底停止系统时钟而内部寄存器和RAM的数据不会丢失这是实现超低功耗待机的关键。2.1.6 测试模块这个模块集成了芯片的测试逻辑主要用于生产测试和系统诊断。对于用户而言最重要的是它支持通过背景调试模式进行非侵入式的调试这是我们后面会重点讨论的功能。2.2 板载资源内存与监控程序BCC板自身集成了必要的存储资源EPROM板载两片64K x 8位的EPROMU1, U2组成64K x 16位的空间用于存放M68CPU32BUG监控程序。这个监控程序是开发板的“灵魂”它提供了上电初始化、基本的命令行交互、内存查看/修改、寄存器操作、断点设置以及最重要的——通过串口下载程序S-record的功能。RAM板载两片32K x 8位的RAMU3, U4组成32K x 16位的空间。这部分内存一部分被监控程序用作栈和变量区剩余部分开放给用户程序使用。此外板上还有一个原型适配区域允许用户自行焊接额外的RAM或EPROM芯片进一步扩展存储空间。图4-2的内存映射图清晰地展示了这些资源的地址分布例如用户RAM通常从0x000000开始而监控程序ROM则位于高位地址如0xFFE800附近。理解这个内存映射对于链接器脚本的编写和程序的正确定位至关重要。2.3 关键外部接口连接世界的桥梁BCC板通过几个关键的连接器与外部世界交互理解它们的定义是进行硬件连接和调试的前提。2.3.1 P1/P2扩展连接器这是两个64针的双排连接器将MC68331的绝大多数信号引脚引了出来用于连接用户的目标系统或自定义的外围板卡。P1主要包含地址总线低位A0-A18、GPT的所有I/O引脚IC1-IC4, OC1-OC5, PAI, PCLK, PWMA/B、QSPI和SCI的通信引脚MOSI, MISO, SCK, PCS0~-PCS3~, TXD, RXD、景调试信号BKPT~/DSCLK, FREEZE/QUOT, IPIPE~/DSO, IFETCH~/DSI以及复位、电源和地。P2主要包含数据总线D0-D15、地址总线高位和功能码/片选复用信号A19/CS6~ - A23/CS10~, FC0/CS3~ - FC2/CS5~, CS0~ - CS2~、总线控制信号AS~, DS~, R/W~, BG~, BGACK~, BR~, BERR~等、中断请求线IRQ1~ - IRQ7~以及时钟信号。注意在连接P1/P2到自定义电路时务必参考手册中的引脚定义表表5-15-2。许多信号是复用的例如一个引脚既是地址线又是片选其具体功能取决于MC68331内部的模块配置。初期调试时建议先确保电源、地、复位和基本总线信号连接正确。2.3.2 J9 RS-232C串行通信接口这是一个4针的连接器是BCC与PC或终端进行命令行交互和程序下载的主要通道。其引脚非常简单Pin 1: XMIT (发送数据TXD)Pin 2: GND (信号地)Pin 3: RCV (接收数据RXD)Pin 4: 10V (可选的用于驱动流控信号线的电源)我们只需要连接Pin 2 (GND), Pin 1 (XMIT) 和 Pin 3 (RCV) 到PC串口的对应引脚通常是GND, RXD, TXD即可进行通信。需要注意的是BCC板输出的已经是RS-232C电平±10V因此可以直接与老式PC的串口相连。对于现代电脑你需要一个USB转RS-232串口线并且要注意交叉连接BCC的XMIT应接PC串口的RXDBCC的RCV应接PC串口的TXD。2.3.3 J8背景调试模式接口这是一个10针的连接器用于连接更高级的调试工具如摩托罗拉/飞思卡尔的专用背景调试器。通过这个接口调试器可以在CPU运行时背景模式访问其内部所有寄存器、内存并设置硬件断点实现源码级调试而无需占用任何用户资源如串口。对于复杂项目的调试BDM接口比串口监控程序强大得多。其信号包括开发系统时钟DSCLK、串行数据输入/输出DSI, DSO以及状态信号FREEZE等。3. S-record文件格式程序代码的“文本护照”在嵌入式开发的早期如何将编译好的二进制程序机器码从开发主机如PC传输到目标板如BCC是一个实际问题。网络、USB、SD卡这些便捷的方式在当时并不普及。S-record也称为SREC或Motorola S-record格式就是为了解决这个问题而诞生的。它将二进制代码转换成纯文本格式ASCII可以通过任何能够传输文本的媒介进行传送比如串口、纸带甚至电报。对于BCC开发板通过串口发送S-record文件是下载程序的标准方式。3.1 S-record格式精讲一个S-record文件由多行文本记录组成每行代表一条S-record。每条记录的结构都是标准化的如下所示S1137F00AABBCCDDEEFF00112233445566778899C1我们可以把它拆解成以下几个字段记录类型第1-2个字符。S0,S1,S2,S3,S5,S7,S8,S9等。它定义了这条记录的作用。记录长度第3-4个字符。用两个十六进制数字表示指示了本行中后续所有字符对即字节的数量。注意它包含了地址、数据/代码和校验和字段的字节数但不包括类型和长度字段本身。地址第5-8、5-10或5-12个字符。用4、6或8个十六进制数字表示代表这条记录中的数据应该被加载到内存中的起始地址。长度取决于记录类型S1是2字节地址S2是3字节S3是4字节。代码/数据从地址字段之后开始到校验和之前结束。包含实际的程序代码或数据每个字节用两个十六进制字符表示。校验和最后两个字符。它是记录长度、地址和数据字段所有字节值之和的补码的最低字节。用于验证该行记录在传输过程中没有出错。校验和计算示例以上面的S1137F00AABBCCDD...99C1为例假设数据部分为AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99。记录长度字段0x13(19字节)地址字段0x7F00(2字节:0x7F,0x00)数据字段16个字节 (0xAA,0xBB, ...0x99)求和0x13 0x7F 0x00 0xAA 0xBB ... 0x99。假设和为SUM。计算补码0xFF - (SUM 0xFF) 1。或者更简单校验和 0xFF - (SUM的低字节) 1如果结果超过一个字节只取低字节。最终计算出的校验和应该等于记录最后的0xC1。3.2 各类型S-record的作用不是所有类型的记录都会在一个文件中出现常见的几种有S0 (头记录)通常是文件的第一行地址字段一般为0。代码/数据字段可以包含模块名称、版本号等描述性信息但不是必需的。BCC的监控程序会忽略这部分内容。S1/S2/S3 (数据记录)这是文件的主体承载着实际的程序代码和数据。S1用于2字节地址最大64KBS2用于3字节地址最大16MBS3用于4字节地址。由于MC68331是24位地址总线最大寻址16MB所以最常见的是S2记录但S1和S3也可能出现具体取决于链接器设置。S5 (记录计数)可选记录包含本文件中S1/S2/S3记录的总数。用于快速验证文件是否传输完整。地址字段就是这个计数值。S7/S8/S9 (终止记录)标志着数据块的结束。S9对应S1S8对应S2S7对应S3。地址字段可以包含程序执行的起始地址入口点。当BCC监控程序完成S-record下载后如果终止记录中有地址它会将程序计数器指向该地址从而可以执行用户程序。如果没有指定地址则需要用户手动通过监控命令跳转。3.3 从源代码到S-record工具链的角色我们写的C或汇编源代码需要经过编译、链接才能生成可执行文件。这个可执行文件通常是二进制的比如ELF、COFF格式。为了生成S-record文件我们需要使用链接器或一个单独的工具如objcopy进行格式转换。 以经典的GNU工具链m68k-elf-gcc,m68k-elf-ld为例流程如下编译m68k-elf-gcc -mcpu68332 -O2 -c main.c -o main.o链接m68k-elf-ld -T linkerscript.ld main.o ... -o firmware.elf这里的链接脚本linkerscript.ld至关重要它定义了程序各段如.text,.data,.bss在MC68331内存空间中的具体位置必须与BCC板的内存映射匹配。例如用户程序通常从0x000000或0x001000开始避开监控程序使用的区域。生成S-recordm68k-elf-objcopy -O srec firmware.elf firmware.srec这条命令将ELF格式的firmware.elf转换为S-record格式的firmware.srec。objcopy会自动根据代码和数据的地址生成相应的S1/S2/S3记录并添加S0头和S8/S9尾。实操心得在链接脚本中务必正确定义内存区域。一个常见的错误是将代码链接到了被监控程序ROM占用的地址导致下载后程序无法运行或与监控程序冲突。建议将用户RAM起始地址设为0x000000或0x001000以预留空间并将所有可读写数据段.data,.bss放在RAM区而将只读代码段.text和常量.rodata放在RAM或扩展的EPROM区。下载时S-record中的数据会被写入指定地址因此要确保目标地址是可写的RAM或已擦除的FLASH/EPROM。4. 使用PROCOMM通过串口下载S-record文件全流程这是整个过程中最具实操性的部分。我们将严格按照手册步骤并补充大量实际操作中可能遇到的细节和坑。4.1 准备工作硬件与软件环境搭建硬件连接电源为BCC开发板提供稳定的5V直流电源。注意检查极性防止接反烧毁板子。串口线准备一条串口线或USB转RS-232适配器串口线。连接BCC的J9接口到PC的串口BCC J9-2 (GND) - PC串口 GND (通常为Pin 5)BCC J9-1 (XMIT) - PC串口 RXD (通常为Pin 2)BCC J9-3 (RCV) - PC串口 TXD (通常为Pin 3)10V引脚通常不需要连接终端如果你有串口终端设备如老式VT100终端可以连接上。但更常见的是使用PC上的终端模拟软件。软件准备终端软件手册中指定了PROCOMM这是一款经典的DOS/Win3.1时代的通信软件。在现代化Windows系统上我们有更多更好的选择例如Tera Term免费、开源、轻量支持多种协议是首选推荐。PuTTY同样免费轻量但功能相对Tera Term稍少。SecureCRT功能强大但收费。超级终端Windows XP自带Win7及以后版本需要单独下载不推荐。S-record文件确保你已经通过交叉编译工具链生成了正确的firmware.srec或类似文件。4.2 终端软件配置详解以Tera Term为例虽然手册以PROCOMM为例但其配置原理是通用的。我们以更现代的Tera Term进行说明其他软件可参照设置。打开串口连接启动Tera Term会弹出“新建连接”对话框。选择“Serial”并从下拉列表中选择你的BCC板连接的COM端口如COM3。点击“确定”。配置串口参数连接后进入“设置” - “串口端口”。波特率设置为9600。这是CPU32BUG监控程序的默认速率。数据位8奇偶校验无停止位1流控制无 (XON/XOFF 和 RTS/CTS 都选择“无”)。这是关键BCC的监控程序通常不使用硬件流控错误的流控设置会导致通信失败。其他参数保持默认点击“确定”。配置终端仿真与本地回显进入“设置” - “终端”。“终端仿真”选择“VT100”或“ANSI”这影响一些控制字符的解析但对基本通信影响不大。最重要的设置在“终端”设置或“设置”-“串口端口”的高级设置中找到“本地回显”或“Echo”选项。必须将其设置为“关闭”或“否”。因为监控程序本身会回显你输入的字符如果本地再回显一次你会看到每个字符出现两次。同样确保“换行”自动接收/发送的配置符合你的习惯通常接收的LF和发送的CR需要适当配置以防显示错行。4.3 与CPU32BUG监控程序交互硬件和软件配置好后就可以给BCC板上电了。上电与提示符给BCC板上电。在Tera Term窗口中你可能会看到一些乱码或没有显示。此时按一下PC键盘的回车键。如果一切连接和配置正确你应该会看到监控程序的提示符CPU32Bug这个提示符表明BCC板上的CPU32BUG监控程序已经启动并等待你的命令。常用监控命令在下载前可以熟悉几个基本命令MD 地址显示内存内容。例如MD 0显示从地址0开始的内存。MM 地址修改内存内容。会提示你输入新值。RM显示CPU内部寄存器的值。HELP或?显示帮助信息。LO这是我们下载S-record文件要用的命令意为“Load”加载。4.4 执行S-record文件下载这是核心步骤。假设你的S-record文件名为myprogram.srec。进入下载模式在CPU32Bug提示符下输入加载命令并回车CPU32BugLO输入LO后回车。监控程序会进入一种特殊的接收模式等待来自串口的数据流。此时提示符可能会消失或者显示一些等待字符这取决于监控程序的版本。从终端软件发送文件不要关闭Tera Term的串口连接窗口。在Tera Term的菜单栏选择“文件” - “发送文件...”。在弹出的对话框中浏览并选择你的myprogram.srec文件。关键协议选择。在“发送文件”对话框中有一个“协议”下拉菜单。必须选择“ASCII”或“文本”协议。绝对不能选择“XMODEM”、“YMODEM”、“ZMODEM”或“Kermit”等二进制协议。因为S-record文件是纯文本格式监控程序的LO命令期望接收的就是原始的ASCII字符流。点击“打开”开始发送。观察传输过程文件开始传输。在Tera Term的窗口中你应该能看到文件内容一行行的S记录在快速滚动显示。这是正常现象表明数据正在被发送到BCC板。传输完成与确认当文件发送完毕后传输滚动会停止。根据手册描述此时BCC板上的蜂鸣器可能会响一声如果板载蜂鸣器并且光标会闪烁。最重要的是你需要按两次回车键来退出下载模式返回到监控程序命令提示符。CR CR CPU32Bug如果操作正确你将再次看到CPU32Bug提示符。验证与运行验证下载可以使用MD命令查看程序应该加载的起始地址区域确认数据是否已正确写入。例如如果你的程序链接到地址0x1000可以输入MD 1000查看。执行程序如果S-record的终止记录S8/S9中包含了入口地址监控程序有时会自动跳转。但更常见的做法是你需要手动使用GO命令来启动程序。首先你需要知道程序的入口地址这通常在链接时指定或者可以从S-record文件的最后一条S8/S9记录中看到地址字段。假设入口地址是0x1000则输入CPU32BugGO 1000程序运行执行后你的程序就开始在MC68331上运行了。你可以通过连接在P1/P2上的LED、串口输出或其他外设来观察程序行为。4.5 使用其他终端软件的注意事项如果你使用PuTTY、SecureCRT或其他软件核心配置原则不变正确设置COM端口、波特率(9600)、数据位(8)、奇偶校验(无)、停止位(1)、流控(无)。关闭本地回显。连接后按回车唤出CPU32Bug提示符。输入LO进入下载模式。使用软件的“发送文件”功能并务必选择“ASCII”或“文本”或“Raw Data”模式发送你的.srec文件。发送完成后按两次回车返回命令模式。5. 实战问题排查与高级技巧即使按照步骤操作也难免会遇到问题。下面是我在多年使用中总结的一些常见坑点和解决思路。5.1 常见问题速查表问题现象可能原因排查步骤与解决方案上电后终端无任何显示按回车也无反应。1. 电源未接通或电压不正常。2. 串口线连接错误TX/RX接反。3. PC串口或USB转串口适配器故障。4. 波特率设置错误非9600。5. BCC板硬件故障或监控程序损坏。1. 用万用表测量BCC板电源输入点电压是否为稳定的5V。2.重点检查交换BCC的TX和RX与PC的连接线。这是最常见错误。3. 尝试更换串口线或USB转串口适配器。在设备管理器中确认COM端口识别正常。4. 尝试其他常见波特率如19200, 38400, 115200但CPU32BUG默认通常是9600。5. 检查BCC板上MCU、ROM、RAM芯片是否插紧有无过热现象。能看到乱码但看不到CPU32Bug提示符。1. 波特率不匹配最常见。2. 数据位、停止位或奇偶校验设置错误。3. 终端软件字符编码设置问题。1. 逐一尝试不同的波特率1200, 2400, 4800, 9600, 19200...直到显示可读字符。2. 确认数据位为8停止位为1奇偶校验为None。3. 在终端软件中尝试切换字符编码如UTF-8, ANSI。输入LO后发送文件无反应或提示符不消失。1. 未正确进入下载模式可能LO命令输入有误。2. 终端软件的“发送文件”协议选错如选了XMODEM。3. 流控制未关闭。1. 确保在CPU32Bug后输入LO并回车。注意是字母LO不是数字10。2.绝对确保发送文件时选择的是ASCII或文本协议。3. 再次确认串口设置中所有流控制RTS/CTS, XON/XOFF都已禁用。文件发送过程中终端显示大量重复字符或卡住。1.本地回显未关闭导致每个发送的字符都被回显两次与监控程序回显叠加。2. 串口缓冲区溢出或PC性能问题。1.立即检查并关闭终端软件的本地回显功能。2. 尝试降低发送速度如果软件有“行延迟”或“字符延迟”设置可适当增加。对于大文件这是必要的。文件发送完成后按两次回车无法返回提示符。1. S-record文件格式错误导致监控程序在解析时“卡住”。2. 文件传输不完整或中途出错。3. 校验和错误。1. 使用文本编辑器打开.srec文件检查其格式是否正确每行以S开头字符数为偶数。2. 尝试发送一个非常小的、已知正确的S-record文件比如只包含一条S9030000FC记录测试。3. 可以尝试使用工具如srec_cat或自己写小程序验证S-record文件的校验和。程序下载后使用GO命令运行系统无反应或复位。1. 程序入口地址错误。2. 程序破坏了监控程序使用的内存或中断向量。3. 链接脚本错误代码/数据地址与BCC板内存布局冲突。4. 程序本身有Bug导致崩溃。1. 确认GO命令后的地址是程序真正的入口点通常是.text段的起始地址。2. 避免使用监控程序占用的内存区域参考图4-2内存映射。用户程序应从0x000000或稍后的地址开始。3. 仔细检查链接脚本确保.text,.data,.bss,.stack等段被正确放置到RAM地址空间。4. 编写一个最简单的LED闪烁或串口输出“Hello World”程序进行测试排除复杂程序逻辑的影响。5.2 高级技巧与替代方案自动化脚本如果你需要频繁下载测试手动操作终端软件很低效。可以使用支持脚本的终端软件如Tera Term编写一个TTL宏脚本自动完成连接、发送LO命令、选择文件发送、等待发送完成、发送两次回车这一系列操作。使用更现代的工具除了手动使用终端软件也可以使用一些命令行工具通过脚本完成下载。例如在Linux下你可以使用minicom配合脚本或者使用python的pyserial库自己编写一个简单的S-record发送工具。这便于集成到自动化构建流程中。背景调试模式对于复杂的调试串口监控程序功能有限。如果条件允许可以寻找一个MC68331的BDM调试器如PE Multilink或一些开源方案。通过J8接口连接你可以实现源码级调试、硬件断点、实时内存/寄存器查看等强大功能极大提升开发效率。S-record文件处理有时链接器生成的S-record文件可能包含你不想要的数据段如调试信息或者你想合并多个文件。可以使用srec_cat一个强大的开源S-record处理工具来进行过滤、拆分、合并、填充等操作。例如只提取加载到特定地址范围的数据srec_cat input.srec -exclude -within 0xFF0000 0xFFFFFF -o output.srec电源与复位在进行任何下载或调试操作前确保电源稳定。不稳定的电源可能导致MCU在加载或运行程序时发生不可预知的行为。如果程序跑飞或系统无响应最简单粗暴的恢复方法是断电重启然后重新进行串口连接和下载。