stm8 停机模式与外部中断唤醒中一个小问题

  做了一个简单的项目,电路板使用电池供电,需要系统在待机时低功耗。而对外接口只有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 }
View Code

  先关闭中断,配置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 }
View Code

  流程如上,实际会出现一个小问题,就是配置IO口为外部中断,开了中断以后,就立即进入了中断程序(中断条件为低电平和下降沿)。进入了中断程序后,IO口配置又将IO口配置为普通引脚,接着进入低功耗。再按按键怎么也不能唤醒了。如果你也遇到这样的问题,请参照上面的进入低功耗的代码,在配置IO口为中断引脚后,延时一会,再开中断。

  使用stm8的停机模式后,在3.0V供电的情况下,电路板整体功耗为5.6uA。使用电池供电,待机也能使用1年以上。

  

猜你喜欢

转载自www.cnblogs.com/kanite/p/9143167.html