根据你描述的情况(程序下载后可正常运行,但重新上电后不运行,Debug正常,晶振工作),这通常与程序启动流程、存储器配置或复位逻辑相关。以下是系统的排查步骤和解决方案: ### 一、排查程序启动与复位相关问题 1. **检查复位向量配置** - 确保`DSP28035Peripheral.cmd`文件中正确配置了复位向量指向`_c_int00`(C程序入口) - 检查是否在代码中禁用了 watchdog定时器,未禁用会导致程序复位循环 2. **验证程序加载地址** - 确认程序被下载到Flash而非RAM(通过CMD文件的SECTIONS配置) - 检查Flash烧写后是否正确执行了解锁和校验操作 3. **添加启动状态指示** 在`main()`函数最开始处添加LED闪烁或GPIO电平翻转代码,判断程序是否根本没进入主函数: ```c // 示例:初始化后立即翻转LED引脚 void main(void) { InitSysCtrl(); // 系统控制初始化 EALLOW; GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // 配置为GPIO GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // 输出方向 GpioDataRegs.GPASET.bit.GPIO0 = 1; // 置高电平 EDIS; // 此处添加短暂延时函数 delay_us(100000); GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // 拉低电平 // 后续初始化代码... } ``` ### 二、Flash配置与烧写问题排查 1. **检查Flash编程配置** - 确保包含Flash初始化函数(如`InitFlash()`) - 确认Flash等待状态设置正确(与系统时钟匹配) 2. **验证CMD文件配置** 检查CMD文件中是否正确分配了程序到Flash: ```c // 正确的Flash分配示例 .text : > FLASHH, PAGE = 0 .cinit : > FLASHH, PAGE = 0 .switch : > FLASHH, PAGE = 0 .const : > FLASHH, PAGE = 0 .econst : > FLASHH, PAGE = 0 .pinit : > FLASHH, PAGE = 0 ``` 3. **执行Flash完整性校验** - 使用CCS的"Verify"功能确认程序已正确烧写到Flash - 检查是否有Flash保护机制导致程序无法运行 ### 三、硬件相关排查 1. **复位电路检查** - 测量复位引脚(XRS)上电后的电平变化,确认复位信号是否稳定 - 检查复位电路的电容、电阻是否符合 datasheet 要求 2. **电源稳定性测试** - 测量核心电压(1.8V)和I/O电压(3.3V)是否稳定 - 检查上电时序是否满足芯片要求 3. **外部中断检查** - 确认没有未处理的外部中断导致程序进入异常状态 - 检查GPIO引脚初始状态是否导致意外中断 ### 四、Debug调试技巧 1. **使用硬件断点** - 在`_c_int00`入口处设置断点,确认复位后是否执行到此处 - 逐步单步执行,观察程序在何处停止响应 2. **查看寄存器状态** - 检查状态寄存器(ST1、ST0)确认是否有错误标志 - 查看PC(程序计数器)值,确认程序执行位置 3. **内存数据检查** - 比较Flash中的程序数据与RAM中的数据是否一致 - 检查关键变量的初始化状态 ### 五、常见解决方案 1. **添加必要的初始化代码** 确保在`main()`函数开始处包含完整的初始化: ```c void main(void) { // 必须的初始化步骤 InitSysCtrl(); // 系统控制初始化 DINT; // 禁止中断 InitPieCtrl(); // PIE中断控制器初始化 IER = 0x0000; // 清除中断使能 IFR = 0x0000; // 清除中断标志 InitPieVectTable(); // 初始化PIE向量表 InitFlash(); // Flash初始化(关键步骤) // 禁用看门狗 EALLOW; SysCtrlRegs.WDCR = 0x0068; EDIS; // 你的应用代码 // ... } ``` 2. **使用正确的CMD文件** - 确保使用与你的芯片型号完全匹配的CMD文件 - 检查是否有自定义段未正确分配到Flash 3. **更新CCS和XDS110固件** - 确保CCS版本支持你的DSP型号 - 更新XDS110仿真器固件到最新版本 如果经过以上步骤仍未解决问题,建议尝试简化程序(仅保留最小化的启动代码),逐步添加功能以定位问题所在。这种方法通常能快速隔离是基础配置问题还是应用代码中的特定逻辑导致的启动失败。 |