1. 问题现象与背景解析
最近在使用MCB167-NET评估板调试应用时遇到了一个棘手问题:无论怎么修改START167.A66文件中的配置参数,SYSCON和RSTCON寄存器始终保持着默认值,完全无视我的修改。这种情况在使用外部设备时尤为致命,因为我需要精确配置SYSCON、BUSCONx和ADDRSELx寄存器来匹配硬件设计,甚至已经通过板载DIP开关调整了RP0H值,但启动配置就是"不听话"。
经过反复验证,发现问题出在Monitor-166调试监控程序的工作机制上。当使用Monitor-166下载测试程序时,C16x器件会复用Monitor自身的启动代码。关键在于那个EINIT指令——这个一次性配置指令一旦执行,SYSCON和RSTCON的配置就会永久锁定。由于Monitor在加载用户程序前就已经执行了EINIT,导致用户启动代码中的配置修改完全失效。
重要提示:在C166架构中,EINIT指令就像给配置寄存器"上锁",执行后任何试图修改SYSCON/RSTCON的操作都会被硬件忽略。这个设计本意是防止运行时意外修改关键配置,但在调试时却成了"拦路虎"。
2. 根本原因深度剖析
2.1 Monitor-166的工作流程
Monitor-166作为调试监控程序,其执行流程分为三个阶段:
- 监控程序初始化:执行硬件自检、配置寄存器设置(含EINIT)
- 用户程序加载:将编译好的目标代码载入内存
- 控制权移交:跳转到用户程序入口点
问题就出在第一阶段——当Monitor完成EINIT后,用户程序阶段对相同寄存器的修改尝试都会被视为无效操作。这就像装修房子时,前业主已经给承重墙刷了永久性涂料,你再想改变墙面结构已经不可能了。
2.2 寄存器配置的硬件特性
C166系列的SYSCON(系统配置)和RSTCON(复位配置)寄存器具有以下关键特性:
- 写保护机制:EINIT执行后立即生效
- 一次性配置:上电复位后只能修改一次
- 全局影响:涉及时钟分频、总线时序等基础参数
在MCB167-NET板卡上,这些寄存器默认配置为:
SYSCON = 0x0000 ; 默认时钟分频 RSTCON = 0x0000 ; 标准复位配置 BUSCON0= 0x0080 ; 默认总线时序3. 解决方案与实施步骤
3.1 修改Monitor启动配置
正确做法是直接修改Monitor自身的配置文件:
定位到Keil安装目录下的监控程序工程:
\KEIL\C166\MONITOR\KEIL MCB167 NET\CONFIG.INC将你的START167.A66中的配置参数同步到CONFIG.INC,例如:
SYSCON EQU 0x0010 ; 自定义时钟分频 RSTCON EQU 0x0001 ; 看门狗复位使能在μVision中重新编译Monitor:
- 菜单选择 Project → Rebuild all Target Files
- 等待生成新的MON166.hex文件
3.2 配置同步的注意事项
当同步配置参数时,需要特别注意这些关键项:
- 总线控制寄存器组(BUSCON0-3)
- 地址选择寄存器(ADDRSELx)
- 端口初始化配置(特别是P0H用于外部总线时)
- 看门狗和复位相关设置
建议采用对照表方式迁移配置:
| START167.A66 参数 | CONFIG.INC 对应项 | 典型值示例 |
|---|---|---|
| SYSCON | SYSCON | 0x0010 |
| BUSCON0 | BUSCON0 | 0x0081 |
| ADDRSEL0 | ADDRSEL0 | 0x1000 |
4. 验证与调试技巧
4.1 确认配置生效的方法
- 硬件复位后立即暂停程序
- 在调试器内存窗口查看寄存器地址:
- SYSCON @ 0xFFF0
- RSTCON @ 0xFFF2
- 对比实际值与CONFIG.INC的设置
4.2 常见问题排查
▶ 修改后配置仍不生效
- 检查是否使用了正确的MON166.hex文件
- 确认板卡已完全断电重启(不仅仅是软件复位)
▶ 总线设备无法访问
- 确认ADDRSELx与硬件地址译码匹配
- 用示波器检查总线时序是否符合设备要求
▶ 程序运行不稳定
- 检查时钟分频是否超出CPU额定频率
- 验证看门狗配置与喂狗策略
5. 进阶应用建议
对于需要频繁修改配置的开发阶段,建议:
建立多个Monitor配置版本:
MON166_Fast.hex ; 72MHz主频 MON166_Safe.hex ; 60MHz带看门狗开发后期迁移到独立启动代码:
- 使用BOOT167替代START167
- 通过硬件复位而非Monitor加载
关键配置的版本控制:
- SYSCON EQU 0x0000 ; Default + SYSCON EQU 0x0010 ; PLL 2x mode
我在实际项目中总结出一个经验法则:每当更换调试电脑或升级开发环境时,第一件事就是检查Monitor配置是否同步更新。曾经因为疏忽这点,导致整个团队浪费两天时间排查"灵异"总线错误。现在我们的标准操作流程中,CONFIG.inc的版本号必须与项目文档的修订记录严格对应。