A91x9M0進入PM2 (Power Management)後,使用Sleep Timer 0.1s定時喚醒打TX
代碼:
A9139M0_A50_Xtal=24M_DR=2M_Sleep Timer WakeUp PM2toTX -20240325.zip
Amiccom SoC的PM Mode啟動後,MCU Xtal Clcok會STOP 終止,此時若要喚醒Wakeup MCU,只能透過HW reset,外部i/o(WUN),Sleep Timer, RTC
說明如何使用Sleep Timer定時喚醒 PM Mode
EnableHS();開啟MCU High Speed 48Mhz
void EnableHS ( void ) { RADIO->CLOCKCTRL = 0x0011581F; POWER->XRC_CTRL = 0x0200C0C1; if( (FLASH->WAIT_STATE_Item.IS_PLL_Mode) == 0 ) { //ws_cfg(for "new ws_cfg") //EN_PLL + ws_cfg //IS_PLL_Mode + EN_PLL + ws_cfg FLASH->WAIT_STATE = 0x00000003; FLASH->WAIT_STATE = 0x00000007; FLASH->WAIT_STATE = 0x0000002F;//b0~1:ws_cfg=3, b2:EN_PLL=1, b3:IS_PLL_Mode=1, b5:MCUSWS=1 } }
2. 開啟M0核Cache ,目的是把重複使用的資料存放到記憶體中,這樣可以避免每一次都去 Database 讀取
void EnableCache ( void ) { // Enable the cache in auto power and auto invalidate mode (CCR[0].EN = 1), enable the statistics logic CCR[6].STATISTIC_EN = 1, enable prefetch (CCR[5].SET_PREFETCH = 1) CACHE->CCRItem.EN = ENABLE; CACHE->CCRItem.STATISTIC_EN = ENABLE; CACHE->CCRItem.SET_PREFETCH = ENABLE; // Poll till the cache is enabled (SR[1:0].CS=1) while ( CACHE->SRItem.CS == CACHE_ENABLED ); }
3. 設定 SLPTIMER0_enable
void SLPTIMER0_enable ( void ) { Uint16 tmrinv0; tmrinv0 = 3276; RCOSC_Cal(); //internal RC OSC CAL //TMR Period = (1 / TMRCKS ) * (TMRINV + 1) //ex : TMRCKS[1:0]=00, TMRINV=3276 // TMR Period = (1 / 0.032768 ) * (3276+1) = 0.1s SLPTIMER0->INTERVAL = ( tmrinv0 & 0xFFFF ); //TMRINV=3276 //b0:TMR_CE=1, b1~b2:TMRCKS, b5:CLR_TMR=1, b6:TMRIE=1, b7:TMRON=1 SLPTIMER0->CONTROL = 0x000000E1; //TMRCKS[1:0]=00 ~ 32.768kHz //SLPTIMER0->CONTROL = 0x000000E3; //TMRCKS[1:0]=01 ~ 6.5536kHz //SLPTIMER0->CONTROL = 0x000000E5; //TMRCKS[1:0]=10 ~ 3.2768kHz //SLPTIMER0->CONTROL = 0x000000E7; //TMRCKS[1:0]=11 ~ 1.6384kHz NVIC_EnableIRQ(SLPTIMER0_IRQn); PM2();//進入PM2 mode }
4. 由於Xtal 改為24Mhz,且開超頻High Speed 48Mhz,需要將RCOSC_Cal (RC Oscillator Cal) 做以下修改
void RCOSC_Cal ( void ) { Uint16 volatile tgnum, tmp; switch (ConfigType) { case 0://48MHz CPU Speed tgnum = 2930; break; } // tgnum = 1465; // tgnum = 1818; tgnum &= 0xFFFF; RCCTRL2_Reg = ( ( RCCTRL2_Reg & ~0x001F0000 ) | 0x0001B000 ); //b16~18:RCOT=3, b19~b20:MVS=1/16 POWER->RCCTRL2 = RCCTRL2_Reg; POWER->RCTGM = tgnum; while ( 1 ) { do { RCCTRL1_Reg = ( ( RCCTRL1_Reg & ~0x10000003 ) | BIT0 | BIT1 | BIT28 ); //b1:TMRE=1, b2:RCTS=1, b28:SWM=1 POWER->RCCTRL1 = RCCTRL1_Reg; } while ( ( POWER->RCCTRL1 & BIT0 ) == 0x00 ); //b0:ENCAL, Encal Auto Clear to 0 tmp = POWER->RCTGM; if ( tmp > ( tgnum - 10 ) && tmp < ( tgnum + 10 )) break; } }
5. 如果開cache需要在PM2新增3個流程,先將Cache給關閉,設定完Power Control 3寄存器後,再開啟Cache
6. 關閉 M0核DisableCache Function
void DisableCache ( void ) { // Disable the cache in auto power and auto invalidate mode (CCR[0].EN = 0), disable the statistics logic CCR[6].STATISTIC_EN = 0, disable prefetch (CCR[5].SET_PREFETCH = 0) CACHE->CCRItem.EN = DISABLE; CACHE->CCRItem.STATISTIC_EN = DISABLE; CACHE->CCRItem.SET_PREFETCH = DISABLE; // Poll till the cache is disabled (SR[1:0].CS=0) while ( CACHE->SRItem.CS == CACHE_DISABLED ); }