timer0 唤醒STOP模式,注意这模式 唤醒只能用 timer0 A通道,而且还要运行在异步计数时钟
代码如下
/* TMR0 unit and channel definition */
#define TMR0_UNIT (CM_TMR0_1)
#define TMR0_CLK (FCG2_PERIPH_TMR0_1)
#define TMR0_CH (TMR0_CH_A)
#define TMR0_TRIG_CH (AOS_TMR0)
#define TMR0_CH_INT (TMR0_INT_CMP_A)
#define TMR0_CH_FLAG (TMR0_FLAG_CMP_A)
#define TMR0_INT_SRC (INT_SRC_TMR0_1_CMP_A)
#define TMR0_IRQn (INT030_IRQn)
#define TMR0_CMP_VALUE ( 100U )//1024
void TMR0_Config(void)
{
stc_tmr0_init_t stcTmr0Init;
stc_irq_signin_config_t stcIrqSignConfig;
/* Enable timer0 and AOS clock */
FCG_Fcg2PeriphClockCmd(TMR0_CLK, ENABLE);
FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);
/* TIMER0 configuration */
(void)TMR0_StructInit(&stcTmr0Init);
stcTmr0Init.u32ClockSrc = TMR0_CLK_SRC_LRC;
stcTmr0Init.u32ClockDiv = TMR0_CLK_DIV16;
stcTmr0Init.u32Func = TMR0_FUNC_CMP;
stcTmr0Init.u16CompareValue = (uint16_t)TMR0_CMP_VALUE;
(void)TMR0_Init(TMR0_UNIT, TMR0_CH, &stcTmr0Init);
DDL_DelayMS(1U);
TMR0_HWStopCondCmd(TMR0_UNIT, TMR0_CH, ENABLE);
DDL_DelayMS(1U);
TMR0_IntCmd(TMR0_UNIT, TMR0_CH_INT, ENABLE);
DDL_DelayMS(1U);
// AOS_SetTriggerEventSrc(TMR0_TRIG_CH, BSP_KEY_KEY10_EVT);
/* Interrupt configuration */
stcIrqSignConfig.enIntSrc = TMR0_INT_SRC;
stcIrqSignConfig.enIRQn = TMR0_IRQn;
stcIrqSignConfig.pfnCallback = &TMR0_CompareIrqCallback;
(void)INTC_IrqSignIn(&stcIrqSignConfig);
NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);
}
/**
* @brief Main function of PWC Stop wakeup project
* @param None
* @retval int32_t return value, if needed
*/
int32_t main(void)
{
uint8_t u8Count;
/* Register write enable for some required peripherals. */
LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_FCG | LL_PERIPH_EFM | LL_PERIPH_SRAM);
/* System Clock init */
BSP_CLK_Init();
/* LED init */
BSP_LED_Init();
/* Key init */
// BSP_KEY_Init();
TMR0_Config();
STOP_Config();
BSP_LED_On(LED_RED);
/* KEY10 */
// while (PIN_RESET != GPIO_ReadInputPins(BSP_KEY_KEY10_PORT, BSP_KEY_KEY10_PIN)) {
// ;
// }
DDL_DelayMS(DLY_MS);
BSP_LED_Off(LED_RED);
/* Register write protected for some required peripherals. */
LL_PERIPH_WP(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_EFM | LL_PERIPH_SRAM);
for (;;) {
u8Count = 10U;
do {
BSP_LED_Toggle(LED_BLUE);
DDL_DelayMS(DLY_MS);
} while ((--u8Count) != 0U);
if (LL_OK == STOP_IsReady()) {
BSP_LED_On(LED_RED);
TMR0_Start(TMR0_UNIT, TMR0_CH);
PWC_STOP_Enter();
}
}
}