打印
[STM8]

关于STM8S停机模式及唤醒的问题

[复制链接]
6699|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qgmfly|  楼主 | 2015-9-11 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因为用到一个低功耗的场合,所以需要在长时间不操作仪器的情况下进行停机模式。唤醒使用的是PA2口的下降沿触发中断唤醒。

现在的问题是,偶尔有时候中断唤醒不了。我在中断里面加了点亮一个LED,LED没亮,这应该就是根本没有进入中断。

这个唤醒不了的问题又不是时常能够出现,偶发的状态。

是不是PA2口作为外接晶振的时间口,不适合做唤醒?还是本身单片机就会有这个问题?
沙发
qgmfly|  楼主 | 2015-9-11 09:46 | 只看该作者
void main()

        Wwdg_Init();//初始化窗口看门狗
        Clksrc_Init();//初始化时钟
        Init_IO();//端口初始化
        CLR_WWDG();//喂狗               
        EEPROM_Init();//
        InitVal();//变量初始化
        CLR_WWDG();
        Tmr4_Init();
        Tmr2_Init();
        Pwm_Init();
        Led_Work_Off();
        _asm("rim");
      while(1)
       {
                        if(CountTime1>1000)
                        {
                                CountTime1=0;                       
                                GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);//设置PA2 端口为中断上拉输入       
                     //           EXTI_CR1 |=0B00000010;  //设置A口下降沿触发
                                T2_IF = 0;
                                T2_IE = 0;
                                B1=0;
                                B2=0;
                                CLK_PCKENR1 &=0x00; //关闭定时器时钟
                                CLK_PCKENR2 &=0x00; //关闭ADC时钟
                       
//                                CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);
//                                CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV128);
                               

//                                #if CuringType==1
                                        CLR_WWDG();//执行halt前先喂狗,以免执行halt行产生不必要的看门狗复位
                                        _asm("HALT");
//                                #endif

                        }
         }


@far @interrupt void PA2HaltWakeup (void)
{
        GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_NO_IT);//设置PA2 端口为上拉输入,关闭输入中断
       
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);
        CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);

        B1=1;
        LED_A=1;
        CLK_PCKENR1 |=0B10110000; //开启定时器1,2,4时钟
        CLK_PCKENR2 |=0xff; //开启定时器1,2,4时钟
        T2_IE = 1;                                //开定时器2中断
        T2_IF = 0;
        SleepFlag=1;       
        LedShowMode=0;
       
        TwinkleFlag=0;
        BatteryFlag=0;
        CountTime1=0;
        Keycount=0;
        Keynum=1200;
}       

部分变量的操作可无视

使用特权

评论回复
板凳
qgmfly|  楼主 | 2015-9-17 15:54 | 只看该作者
无高手出来指教么

使用特权

评论回复
地板
qgmfly|  楼主 | 2015-11-7 14:50 | 只看该作者
经过长时间的测试,发现程序是自动唤醒了。然后一唤醒进入中断程序就跑飞不知道哪去了,然后就死在那了,必须重启。

后发现原因,主要是由于要配置端口中断方式,必须先关掉总中断。意思就是 必须在开总中断时必须先写 EXTI_CRx寄存器,希望对你们有用。

使用特权

评论回复
5
foxglove| | 2015-11-7 18:17 | 只看该作者
要配置端口中断方式,必须先关掉总中断

使用特权

评论回复
6
会飞的狼_2058| | 2016-7-28 17:13 | 只看该作者
EXTI_CRx是外部中断控制寄存器,是设置中断的方式而已。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

49

帖子

1

粉丝