|
根據你描述的情況(程序下載后可正常運行,但重新上電后不運行,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仿真器固件到最新版本 如果經過以上步驟仍未解決問題,建議嘗試簡化程序(僅保留最小化的啟動代碼),逐步添加功能以定位問題所在。這種方法通常能快速隔離是基礎配置問題還是應用代碼中的特定邏輯導致的啟動失敗。 |