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 );
}