zoukankan      html  css  js  c++  java
  • 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年以上。

      

  • 相关阅读:
    Oracle_高级功能(9) 性能优化
    Oracle_高级功能(8) 事务和锁
    Oracle_高级功能(7) 数据字典视图和动态性能视图
    Oracle_高级功能(6) 分区
    Oracle_高级功能(5) 用户、角色、权限
    Oracle_高级功能(4) 数据库存储结构
    Oracle_高级功能(3) synonym和database link
    Oracle_高级功能(2) 索引
    hdu 1561 The more, The Better 树形dp
    C. Glass Carving 正着做或者倒着做都可以
  • 原文地址:https://www.cnblogs.com/kanite/p/9143167.html
Copyright © 2011-2022 走看看