如题:
awu休眠,然后定时唤醒,两种写法
1、寄存器 注意时钟128KHz低速内部RC(LSI)
主函数:
AWU->APR = 0x3E; //64分频
AWU->TBR = 0x0F; //30秒唤醒
CLK->PCKENR2 |= (0x04); /* AWU与主时钟连接 */
AWU->CSR |= 0x10; //使能自动唤醒
CLK->ICKR |= 0x08; // 打开内部低速时钟源
while(0x10 != CLK->ICKR & 0x10); // 等待时钟源信号稳定
CLK->ICKR |= 0x08; // 打开内部低速时钟源
while(0x10 != CLK->ICKR & 0x10); // 等待时钟源信号稳定
中断清除标记
#pragma vector = 0X03
__interrupt void AWU_IRQHandler(void)
{
//WWDG->CR = 0x80;//复位stm8 这样写也可以,下面这写法也可以
AWU_GetFlagStatus();//清除标志
AWU_Status_Flag = 1; //自定义的全局变量 标记
}
主程序循环
halt();
while(1)
{
if(AWU_Status_Flag == 1) //全局变量
{
AWU_Status_Flag = 0;
BUZZER_On();
Delay(50000);
BUZZER_Off();
Delay(50000);
halt();
}
2 库函数方法
初始化
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, ENABLE);//初始化AWU的时钟
AWU_DeInit();
AWU_Init(AWU_TIMEBASE_2S); //AWU_TIMEBASE_32MS AWU_TIMEBASE_2S
CLK_LSICmd(ENABLE); //这个必须使能
AWU_Cmd(ENABLE);
主循环
halt();
while(1)
{
if(AWU_Status_Flag == 1)
{
AWU_Status_Flag = 0;
BUZZER_On();
Delay(50000);
BUZZER_Off();
Delay(50000);
halt();
}
}
中断函数
/**
* @brief Auto Wake Up Interrupt routine.
* @param None
* @retval None
*/
INTERRUPT_HANDLER(AWU_IRQHandler, 1)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
AWU_GetFlagStatus();//清除标志
AWU_Status_Flag = 1;
}
这样就可以看到 对应的
BUZZER_On 和BUZZER_Off 变换,也可以吧延时函数去掉,Delay(50000);
直接使用示波器看唤醒时间
if(AWU_Status_Flag == 1)
{
AWU_Status_Flag = 0;
BUZZER_On();
//Delay(50000);
BUZZER_Off();
//Delay(50000);
halt();
}
调整 AWU->TBR = 0x0F; //32秒唤醒 或者 AWU_Init(AWU_TIMEBASE_2S);
可以看到唤醒时间都不一样