A91x9M0進入PM2 (Power Management)後,使用Sleep Timer 0.1s定時喚醒打TX

SamYang2024-03-25M0核160

代碼:

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

image.png


說明如何使用Sleep Timer定時喚醒 PM Mode

  1.     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

image.png


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


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。