天天看點

大意!6行代碼,“報廢”5片單片機!

今天又雙叒叕是個心痛的日子。

大意!6行代碼,“報廢”5片單片機!

近日,打樣一款新産品PCB,微控制器選用:國産MCU,HC32L130系列,程式移植于之前的項目。

PCB樣闆焊接好後,第一次可以正常燒錄程式,再進行燒錄,IAR顯示無法連接配接MCU。

大意!6行代碼,“報廢”5片單片機!

奇怪了!試了幾次不行,換一塊闆子, 也是這種情況......

此時内心很恐慌,是不是MCU電路設計有問題?但是也不應該啊,該MCU已經應用好幾款産品了......

排錯離不開試錯法,找來最基礎的點亮LED程式測試,燒寫過程、次數均正常可行。

說明程式有問題!

通過一系列嘗試和推測,将問題定位在時鐘配置上:之前使用HC32L130均是基于24MHz内部高速時鐘(HSI),而本款産品基于24MHz外部高速時鐘(HSE)。

配置24MHz内部高速時鐘(HSI)程式如下所示:

//将時鐘從RCH4MHz切換至RCH24MHz,
void App_Rch4MHzTo24MHz(void)
{    
///<============== 将時鐘從RCH4MHz切換至RCH24MHz ==============================    
    ///< RCH時鐘不同頻率的切換,需要先将時鐘切換到RCL,設定好頻率後再切回RCH
    Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
    Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
    Sysctrl_SysClkSwitch(SysctrlClkRCL);
   
    ///< 加載目标頻率的RCH的TRIM值
    Sysctrl_SetRCHTrim(SysctrlRchFreq24MHz);
    ///< 時鐘切換到RCH
    Sysctrl_SysClkSwitch(SysctrlClkRCH);
    ///< 關閉RCL時鐘
    Sysctrl_ClkSourceEnable(SysctrlClkRCL, FALSE);
}      

在修改為外部高速時鐘程式時,沒再查閱晶片手冊,直接修改的參數,程式如下所示:

//将時鐘從RCH4MHz切換至XTH24MHz,
void App_Rch4MHzTo24MHz(void)
{    
///<============== 将時鐘從RCH4MHz切換至XTH24MHz ==============================    
    Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
    Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
    Sysctrl_SysClkSwitch(SysctrlClkRCL);
   
    ///< 加載目标頻率的XTH值
    Sysctrl_SetXTHFreq(SysctrlRchFreq24MHz);
    ///< 時鐘切換到XTH
    Sysctrl_SysClkSwitch(SysctrlClkXTH);
    ///< 關閉RCL時鐘
    Sysctrl_ClkSourceEnable(SysctrlClkRCL, FALSE);
}      

通過查閱手冊,配置過程果然存在問題。

大意!6行代碼,“報廢”5片單片機!

最後修改代碼如下:

//将時鐘從RCH4MHz切換至XTH24MHz
void App_Rch4MHzToXth24MHz (void)
{    
///<======================== 将時鐘從RCH4MHz切換至XTH24MHz ==============================    
   
    ///< 切換時鐘前(根據外部高速晶振)設定XTH頻率範圍,配置晶振參數,使能目标時鐘,此處為24MHz
    Sysctrl_SetXTHFreq(SysctrlXthFreq20_32MHz);
    Sysctrl_XTHDriverCfg(SysctrlXtalDriver3);
    Sysctrl_SetXTHStableTime(SysctrlXthStableCycle16384);
    Sysctrl_ClkSourceEnable(SysctrlClkXTH, TRUE);
    ///< 時鐘切換
    Sysctrl_SysClkSwitch(SysctrlClkXTH);
    ///< 根據需要選擇是否關閉原時鐘(此處關閉)
    Sysctrl_ClkSourceEnable(SysctrlClkRCH, FALSE);
}      

最後運作調測,果然順利~

繼續閱讀