做了一个简单的项目,电路板使用电池供电,需要系统在待机时低功耗。而对外接口只有4个按键,也就是唤醒必须要通过这四个按键。
系统功能就不介绍了,只给出进入低功耗的代码和退出低功耗的代码。
使用芯片为stm8s103
1 /***************************************************************** 2 //进入到停机模式 3 *****************************************************************/ 4 void EnterHalt() 5 { 6 int j=255; 7 8 /* 防止定时器中断唤醒了CPU */ 9 TIM1_CR1 &= 0xFE; /* 用户操作计数器关掉 */ 10 11 asm("sim"); 12 13 /* PC3 PC4 PC5 PC6 使能外部中断 */ 14 PC_DDR_DDR3 = 0; 15 PC_CR1_C13 = 1; 16 PC_CR2_C23 = 1; 17 18 PC_DDR_DDR4 = 0; 19 PC_CR1_C14 = 1; 20 PC_CR2_C24 = 1; 21 22 PC_DDR_DDR5 = 0; 23 PC_CR1_C15 = 1; 24 PC_CR2_C25 = 1; 25 26 PC_DDR_DDR6 = 0; 27 PC_CR1_C16 = 1; 28 PC_CR2_C26 = 1; 29 30 EXTI_CR1 = 0x00; //PC端口 低电平和下降沿都中断 31 32 for(j=255;j>0;j--); //延时一会 33 34 asm("rim"); 35 asm("HALT"); /* 进入停机模式 */ 36 }
先关闭中断,配置IO口为外部中断,开中断,进入低功耗。
在外部中断中,配置IO口为普通IO。
1 #pragma vector = 7 2 __interrupt void EXTI_PORTC_IRQHandler(void) 3 { 4 ExitHalt(); //开定时器 配置Lock键为普通IO 5 } 6 7 /**************************************************************** 8 //退出停机模式 9 *****************************************************************/ 10 void ExitHalt() 11 { 12 TIM1_CR1 |= 0x01; /* 开用户操作定时器 */ 13 14 //PC3 PC4 PC5 PC6配置为普通IO口 输入 用于按键检测 15 PC_DDR_DDR3 = 0; 16 PC_CR1_C13 = 1; 17 PC_CR2_C23 = 0; 18 19 PC_DDR_DDR4 = 0; 20 PC_CR1_C14 = 1; 21 PC_CR2_C24 = 0; 22 23 PC_DDR_DDR5 = 0; 24 PC_CR1_C15 = 1; 25 PC_CR2_C25 = 0; 26 27 PC_DDR_DDR6 = 0; 28 PC_CR1_C16 = 1; 29 PC_CR2_C26 = 0; 30 31 EXTI_CR1 = 0x00; 32 }
流程如上,实际会出现一个小问题,就是配置IO口为外部中断,开了中断以后,就立即进入了中断程序(中断条件为低电平和下降沿)。进入了中断程序后,IO口配置又将IO口配置为普通引脚,接着进入低功耗。再按按键怎么也不能唤醒了。如果你也遇到这样的问题,请参照上面的进入低功耗的代码,在配置IO口为中断引脚后,延时一会,再开中断。
使用stm8的停机模式后,在3.0V供电的情况下,电路板整体功耗为5.6uA。使用电池供电,待机也能使用1年以上。