CH573F 使用LSI時(shí)如何關(guān)閉外部晶振

目前的需求:

系統(tǒng)啟動時(shí)采用60MHz主頻,此時(shí)使用外部晶振,然后切換為LSI,大體流程如下

SetSysClock(CLK_SOURCE_PLL_60MHz);
//?做一些快速處理

SetSysClock(CLK_SOURCE_LSI);?//?這里不起作用
//PWR_UnitModCfg(DISABLE,?UNIT_SYS_HSE?|?UNIT_SYS_PLL);
while(1)
{
????//監(jiān)控事務(wù)
}

現(xiàn)在發(fā)現(xiàn)使用?SetSysClock(CLK_SOURCE_LSI) 切換時(shí)鐘不起作用。


另外如果上電后直接設(shè)置時(shí)鐘為CLK_SOURCE_LSI,可以起作用,但是外部晶振依然在振蕩,如果使用PWR_UnitModCfg
單獨(dú)關(guān)閉UNIT_SYS_HSE,程序就不會運(yùn)行了,如何處理?謝謝

您好我們測試直接設(shè)置是不啟用的,需要進(jìn)行切換。切換方式可以參考https://www.cnblogs.com/gscw/p/16646454.html


該實(shí)例測試是OK的,但是使能LSI后,示波器可以測試到外部晶振是起振的,因?yàn)閼?yīng)用電路對噪聲比較敏感,如何關(guān)閉它?


1、main函數(shù)需要加上HIGHCODE,確保在操作完切換主頻后又跳回main里面是在RAM中工作的,而不是FLASH中,請務(wù)必注意,原始博客沒有添加。添加成功后的情況是進(jìn)行燈的翻轉(zhuǎn)是均勻亮滅的;

2、檢測到外部32M起振是因?yàn)?2M的寄存器的復(fù)位值是工作的,需要手動操作寄存器進(jìn)行關(guān)閉:

????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1;
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2;
????SAFEOPERATE;
????R8_HFCK_PWR_CTRL?&=?~(RB_CLK_PLL_PON?|?RB_CLK_XT32M_PON);???????//關(guān)閉外部32M,需要在安全模式處理

3、使用內(nèi)部32K工作需要確保外部32K不工作比較簡單,直接對32K的GPIO進(jìn)行翻轉(zhuǎn),如果在主頻為內(nèi)部32K時(shí),則PA10/PA11的翻轉(zhuǎn)應(yīng)該是正常,我們這里驗(yàn)證也是沒有問題的。


附:

/*Readme
????????切換32K后,確保代碼是運(yùn)行在RAM中的,F(xiàn)LASH已經(jīng)被修改了
????????需要高頻晶振不工作則需要調(diào)整32M的晶振
????????注意操作晶振相關(guān)寄存器在安全模式處理
????????可以直接跑32K(不跑60M),需要注意所以的操作均在RAM中運(yùn)行(FLASH被修改),同時(shí)注意GPIO的初始化也需要在RAM中處理,默認(rèn)例程封裝好函數(shù)是在FLASH中處理的。
*/
#include?"CH58x_common.h"
/*********************************************************************
?*?@fn??????DebugInit
?*
?*?@brief???調(diào)試初始化
?*
?*?@return??none
?*/
void?DebugInit(void)
{
????GPIOA_SetBits(GPIO_Pin_9);
????GPIOA_ModeCfg(GPIO_Pin_8,?GPIO_ModeIN_PU);
????GPIOA_ModeCfg(GPIO_Pin_9,?GPIO_ModeOut_PP_5mA);
????UART1_DefInit();
}
__HIGH_CODE
void?test1(void){
#if?0???????????????????????????????????????????//外部32K,需要屏蔽PA10/PA11的IO翻轉(zhuǎn)(32K晶振引腳)
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1;
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2;
????SAFEOPERATE;
????R8_CK32K_CONFIG?|=?RB_CLK_OSC32K_XT?|?RB_CLK_INT32K_PON?|?RB_CLK_XT32K_PON;
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1;
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2;
????SAFEOPERATE;
????R16_CLK_SYS_CFG?|=?RB_CLK_SYS_MOD;
????R8_SAFE_ACCESS_SIG?=?0;
#else???????????????????????????????????????????//內(nèi)部32K
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1;
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2;
????SAFEOPERATE;
????R8_CK32K_CONFIG?&=?~(RB_CLK_OSC32K_XT?|?RB_CLK_XT32K_PON);
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1;
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2;
????SAFEOPERATE;
????R8_CK32K_CONFIG?|=?RB_CLK_INT32K_PON;
????R16_CLK_SYS_CFG?|=?RB_CLK_SYS_MOD;
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG1;
????R8_SAFE_ACCESS_SIG?=?SAFE_ACCESS_SIG2;
????SAFEOPERATE;
????R8_HFCK_PWR_CTRL?&=?~(RB_CLK_PLL_PON?|?RB_CLK_XT32M_PON);???????//關(guān)閉外部32M,需要在安全模式處理
????R8_SAFE_ACCESS_SIG?=?0;
#endif
#if?0
????while(1){
????????mDelaymS(1);
????????GPIOB_InverseBits(GPIO_Pin_4);
????}
#endif
}
__HIGH_CODE
void?test2(void){
????while(1){
????????mDelayuS(1000);
????????GPIOB_InverseBits(GPIO_Pin_4);
????????GPIOA_InverseBits(GPIO_Pin_10?|?GPIO_Pin_11);
????}
}
__HIGH_CODE
int?main()
{
????uint8_t??????i;
????SetSysClock(CLK_SOURCE_PLL_60MHz);
????GPIOB_ModeCfg(GPIO_Pin_4,??GPIO_ModeOut_PP_5mA);???//設(shè)置模式?輸出
????GPIOB_SetBits(GPIO_Pin_4);
????GPIOA_ModeCfg(GPIO_Pin_10?|?GPIO_Pin_11,??GPIO_ModeOut_PP_5mA);?//設(shè)置模式?輸出,驗(yàn)證內(nèi)部32k作為主頻時(shí),外部32k是不工作的。
????GPIOA_ResetBits(GPIO_Pin_10);
????GPIOA_SetBits(GPIO_Pin_11);
????mDelaymS(3000);?????//等待60M穩(wěn)定
????test1();
????test2();
????while(1);
}



感謝Lpc您的回復(fù),還有以下幾點(diǎn)疑惑:

  1. 代碼中的SAFEOPERATE宏是什么?在官方示例中未搜索到

  2. 需要注意所以的操作均在RAM中運(yùn)行(FLASH被修改),這里不理解為何LSI時(shí)必須跑在RAM中,F(xiàn)LASH為何被修改了?

  3. 有些函數(shù),例如?void LowPower_Halt(void)有對PLL和HSE相關(guān)寄存器直接修改,例如:

????//R8_XT32M_TUNE?=?x32Mpw;
????//sys_safe_access_enable();
????//R8_PLL_CONFIG?|=?(1?<<?5);
????//sys_safe_access_disable();

那么在關(guān)閉HSE時(shí),這些代碼直接注釋掉是不是就可以了?目前測試是這樣的。


1、SAFEOPERATE宏在573沒有,直接不添加該行代碼即可

2、在RAM中工作是為了運(yùn)行的速度快一些,否則主頻32K的運(yùn)行速度比較慢,需要考慮代碼的運(yùn)行最優(yōu),所以不建議在FLASH中工作;

3、其他代碼請按照上面提供的測試進(jìn)行測試,博客也提供了573的代碼,可以使用參考。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频