找回密码
 立即注册
查看: 125|回复: 17

关于STC8A8K64D4省电模式不能唤醒求教

[复制链接]
  • TA的每日心情
    擦汗
    2024-3-21 12:06
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    8

    回帖

    41

    积分

    新手上路

    积分
    41
    发表于 2024-3-21 11:59:02 | 显示全部楼层 |阅读模式
    #include "stc8a8k64d4.h"

    #define     MAIN_Fosc       45000000   //定义主时钟

    #define Timer0_Reload   (MAIN_Fosc / 1000)      //Timer 0 中断频率, 1000次/秒

    #define  BacklightDelayDefaultValue 10

    #define LCD_LED P50


    int time1s = 0;
    int BacklightDelay;


    //========================================================================
    // 函数: void delay_ms(u8 ms)
    // 描述: 延时函数。
    // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2021-3-9
    // 备注:
    //========================================================================
    void delay1ms(u16 ms)
    {
        u16 i;
        do
        {
            i = MAIN_Fosc / 10000;
            while(--i);   //10T per loop
        }
        while(--ms);
    }

    void GPIO_Init()
    {
        LCD_LED = 0;
        P0M0 = 0x80;
        P0M1 = 0x66; //P01、P02、P05、P06模拟输入 P07推挽输出
        P1M0 = 0x01;
        P1M1 = 0x08; //P13模拟输入 P10推挽输出
        P2M1 = 0x00;
        P2M0 = 0x00;   //设置为准双向口
        P3M1 = 0x00;
        P3M0 = 0x00;   //设置为准双向口
        P4M0 = 0x00;
        P4M1 = 0x00; //P43推挽输出
        P5M0 = 0x01;
        P5M1 = 0x00; //P50推挽输出,设置为准双向口
        P6M1 = 0x00;
        P6M0 = 0x00;   //设置为准双向口
        P7M1 = 0x00;
        P7M0 = 0x00;   //设置为准双向口
    }

    //========================================================================
    // 函数: void   Timer0_init(void)
    // 描述: timer0初始化函数.
    // 参数: none.
    // 返回: none.
    // 版本: V1.0, 2015-1-12
    //========================================================================
    void    Timer0_init(void)
    {
        TR0 = 0;    //停止计数

    #if (Timer0_Reload < 64)    // 如果用户设置值不合适, 则不启动定时器
    #error "Timer0设置的中断过快!"

    #elif ((Timer0_Reload/12) < 65536UL)    // 如果用户设置值不合适, 则不启动定时器
        ET0 = 1;    //允许中断
        //  PT0 = 1;    //高优先级中断
        TMOD &= ~0x03;
        TMOD |= 0;  //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
        //  TMOD |=  0x04;  //对外计数或分频
        TMOD &= ~0x04;  //定时
        //  INT_CLKO |=  0x01;  //输出时钟
        INTCLKO &= ~0x01;  //不输出时钟

    #if (Timer0_Reload < 65536UL)
        AUXR |=  0x80;  //1T mode
        TH0 = (u8)((65536UL - Timer0_Reload) / 256);
        TL0 = (u8)((65536UL - Timer0_Reload) % 256);
    #else
        AUXR &= ~0x80;  //12T mode
        TH0 = (u8)((65536UL - Timer0_Reload / 12) / 256);
        TL0 = (u8)((65536UL - Timer0_Reload / 12) % 256);
    #endif

        TR0 = 1;    //开始运行
                    EA =1;
    #else
    #error "Timer0设置的中断过慢!"
    #endif
    }



    //========================================================================
    // 函数: void   SetWakeUpTime(u16 SetTime)
    // 描述: 唤醒定时器设置时间值函数。
    // 参数: SetTime: 要设置的时间值(睡眠的时间), 单位为ms.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2014-7-15
    // 备注:
    //========================================================================
    void    SetWakeUpTime(u16 SetTime)
    {
            if(SetTime >= 16000)        SetTime = 15999;        //限制最大值
            SetTime = (u16)(((u32)SetTime * 32768) / 16000);        //重装值 = Fwkt/16 * SetTime/1000 = Fwkt * SetTime / 16000
            if(SetTime > 0)        SetTime--;
            WKTCL = (u8)SetTime;
            WKTCH = (u8)(SetTime >> 8) | 0x80;
    }

    /******************** 主函数 **************************/
    void main(void)
    {
        GPIO_Init();


        BacklightDelay = BacklightDelayDefaultValue;

        Timer0_init();

        LCD_LED = 1;;//点亮背光

        while(1)
        {


            if(BacklightDelay)
            {
                    if(!LCD_LED)
                    {
                            LCD_LED = 1;
                    }
            }
            else
            {
                    if(LCD_LED)
                    {
                            LCD_LED = 0;
                    }

                    SetWakeUpTime(10000);        //时间值 ms, 小于16000
                    while(!P32);        //等待外中断为高电平
                    delay1ms(10);        //delay 10ms
                    IE0  = 0;                //外中断0标志位
                    IT0 = 1;                //INT0 下降沿中断               
                    EX0 = 1;                //INT0 Enable
                    EA  = 1;                //Enable all interrupt
                                           
                    PCON |= 0x02;        //Sleep
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    EX0 = 0;                //INT0 Disable
                    BacklightDelay = BacklightDelayDefaultValue;
            }

        }
    }

    /********************* INT0中断函数 *************************/
    void INT0_int (void) interrupt 0                //进中断时已经清除标志
    {

    }
    //========================================================================
    // 函数: void timer0_int (void) interrupt TIMER0_VECTOR
    // 描述:  timer0中断函数.
    // 参数: none.
    // 返回: none.
    // 版本: V1.0, 2015-1-12
    //========================================================================
    void timer0_int(void) interrupt 1
    {
         time1s++;
         if (time1s>=1000)
         {
            time1s=0;
            if(BacklightDelay)
               BacklightDelay--;

         }
    }

    回复 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-3-21 12:06
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    8

    回帖

    41

    积分

    新手上路

    积分
    41
     楼主| 发表于 2024-3-21 12:05:41 | 显示全部楼层
    要实现的功能就是10s钟后关闭背光,10秒钟后掉电唤醒背光,唤醒10秒,或者外部按键唤醒10秒,然后再次进入休眠状态。烧录板子调试的时候发现10秒钟后能进入睡眠状态,但是10秒钟后掉电唤醒不能正常唤醒,电流下降的1ma以下;如果这个时候用外部触发唤醒,电流上升到6ma,但是10秒钟后不会再次进入睡眠状态(电流还是6ma)。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-3-21 12:06
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    8

    回帖

    41

    积分

    新手上路

    积分
    41
     楼主| 发表于 2024-3-21 12:23:42 | 显示全部楼层
    如果屏蔽掉外部中断唤醒,程序能正常10秒钟亮屏然后进入睡眠,10秒后唤醒,正常循环工作
    截图202403211222045486.jpg
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9299

    回帖

    1万

    积分

    管理员

    积分
    14049
    发表于 2024-3-21 12:25:22 | 显示全部楼层
    10秒,唤醒,用带RTC功能的 STC8H8K64U

    截图202403211224423492.jpg


    截图202403211225193995.jpg

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9299

    回帖

    1万

    积分

    管理员

    积分
    14049
    发表于 2024-3-21 12:30:47 | 显示全部楼层

    另外刚看到,你跑的是 40MHz

    截图202403211229187739.jpg

    截图202403211230122098.jpg


    截图202403211230422982.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-3-21 12:06
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    8

    回帖

    41

    积分

    新手上路

    积分
    41
     楼主| 发表于 2024-3-21 12:30:59 | 显示全部楼层
    神农鼎 发表于 2024-3-21 12:25
    10秒,唤醒,用带RTC功能的 STC8H8K64U

    我需要的不是准确的10秒唤醒,1到10秒都可以;现在遇到的问题是掉电唤醒定时器和外部中断唤醒一起用到时候,程序就跑飞了
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9299

    回帖

    1万

    积分

    管理员

    积分
    14049
    发表于 2024-3-21 12:32:14 | 显示全部楼层
    #define     MAIN_Fosc       45000000   //定义主时钟

    截图202403211231332089.jpg

    1, 将上面的等待时间设到最长时间
    2, 将下面的 NOP 等待时间设到最长时间

                    PCON |= 0x02;        //Sleep
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();

                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();

                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();


                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-3-21 12:06
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    8

    回帖

    41

    积分

    新手上路

    积分
    41
     楼主| 发表于 2024-3-21 14:21:39 | 显示全部楼层
    神农鼎 发表于 2024-3-21 12:32
    #define     MAIN_Fosc       45000000   //定义主时钟

    PCON |= 0x02;        //Sleep
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
                                    
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
                                           
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
                                           
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
                                           
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
                                           
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
                                    
    EX0 = 0;                //INT0 Disable
    BacklightDelay = 3;//BacklightDelayDefaultValue; 新修改的地方


    加了几个空操作后,确实是掉电唤醒定时器和外部中断都能唤醒,但是出现了新的问题:通过掉电唤醒定时器唤醒系统时,再次进入睡眠的时间是3秒;通过外部中断唤醒系统时,再次进入睡眠的时间是10秒,也就是说系统没进行到BacklightDelay = 3;这一步,直接是重新运行了。不知道我表达是否清楚了,这是怎么回事呢?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-3-21 12:06
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    8

    回帖

    41

    积分

    新手上路

    积分
    41
     楼主| 发表于 2024-3-21 14:45:40 | 显示全部楼层
    329008861 发表于 2024-3-21 14:21
    PCON |= 0x02;        //Sleep
    _nop_();
    _nop_();

    /********************* INT0中断函数 *************************/
    void INT0_int (void) interrupt 0                //进中断时已经清除标志
    {
    _nop_();
    _nop_();
    _nop_();
    ............
    }
    在外部中断里加了一堆空操作后程序正常运行了,感谢大神的解答

    点评

    看是在主循环加 NOP 有效,还是在 中断服务程序加 NOP 有效,帮测试后,给个结论  详情 回复 发表于 2024-3-21 17:19
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    11 小时前
  • 签到天数: 58 天

    [LV.5]常住居民I

    0

    主题

    182

    回帖

    358

    积分

    中级会员

    积分
    358
    发表于 2024-3-21 15:35:06 | 显示全部楼层
    看来中断唤醒后要给点时间让设备回复正常
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-3 11:56 , Processed in 0.075055 second(s), 71 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表