找回密码
 立即注册
查看: 66|回复: 3

求助STC8G1K08的掉电模式和唤醒问题

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-10-11 08:44:12
已绑定手机

22

主题

28

回帖

190

积分

注册会员

积分
190
发表于 3 天前 | 显示全部楼层 |阅读模式
您好,我的单片机是STC8G1K08的51单片机。
我想要实现的功能是单片机接收到8字节数据后,先存储起来,在掉电模式来临后,低功耗状态下数据保持一段时间,然后经过INT2外部中断唤醒后,通过串口输出这8字节数据。

目前在未加掉电模式的情况下,单片机可以实现正确的接收数据和发送数据,但是一加上掉电模式和唤醒就不能实现功能了。

目前是这样的,我在注释了外部中断INT2唤醒的代码后,单片机可以正常的接收到数据并通过串口再将数据发送,如下图所示:

并且可以通过串口接收到正确的8字节数据,如下图:



但是如果加上了我自己写的掉电模式和唤醒配置后,如下图:

单片机能够被唤醒,但串口处一直发送如下图所示的语句:

应该是卡在了如下图所示的地方:


请您帮帮我,我不知道是我哪里配置错了,官方的外部中断可以正常唤醒运行。
并且在不加外部中断唤醒情况下,代码是可以实现正确接收和正确发送的,但是只要一加了掉电模式和唤醒,就不能实现了。

结尾附上了我写的代码,请大佬帮帮我,万分感谢!!! 10.10哑铃板代码.zip (460.58 KB, 下载次数: 1)
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:206
  • 最近打卡:2025-10-13 01:10:06

787

主题

1万

回帖

1万

积分

管理员

积分
19694
发表于 3 天前 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-10-11 08:44:12
已绑定手机

22

主题

28

回帖

190

积分

注册会员

积分
190
发表于 3 天前 | 显示全部楼层
神*** 发表于 2025-10-10 15:38
【新提醒】EEPROM的使用 请 配合比较器做掉电检测 | 唯一正解,电力系统标准应用 - EEPROM/DataFlash 国 ...

您好,我是用的STC8G的51单片机,他在进入掉电模式后,XRAM和SRAM中的数据不会丢失,好像没用到EEPROM
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:582
  • 最近打卡:2025-10-13 07:04:38
已绑定手机

86

主题

6239

回帖

1万

积分

超级版主

积分
11660
发表于 前天 19:15 | 显示全部楼层
重新写了一份供参考
功能:
单片机接收到8字节数据后,先存储起来,在掉电模式来临后,低功耗状态下数据保持一段时间,然后经过INT2外部中断唤醒后,通过串口输出这8字节数据
截图202510111906494979.jpg
参考:
https://www.stcaimcu.com/thread-16321-1-1.html
程序:
  1. #include <AI8G.H>
  2. #include "define.h"
  3. #include <intrins.h>
  4. #include <absacc.h>
  5. #include <string.h>
  6. #include <stdarg.h>
  7. #include <stdio.h>
  8. #include <math.h>
  9. #define                RXD                        P30
  10. #define                TXD                        P31
  11. #define                FOSC                11059200UL
  12. #define                BAUD                9600UL                                                //波特率
  13. #define                TMRF                200UL                                                //定时器频率
  14. #define                BRT                        (0x10000-(FOSC/BAUD+2)/4)        //波特率发生器值
  15. #define                TMR                        (0x10000-FOSC/TMRF/12)                //定时器值
  16. #define                R_Buf_Len        64                                                        //Uart1接收缓存长度
  17. #define                T_Buf_Len        64                                                        //Uart1发送缓存长度
  18. #define                R                        0                                                        //485接收
  19. #define                T                        1                                                        //485发送
  20. unsigned char                RP;                                        //Uart1接收指针
  21. unsigned char                TP;                                        //Uart1发送指针
  22. unsigned char                Uart_R_Len;                        //Uart1接收长度
  23. unsigned char                Uart_T_Len;                        //Uart1发送长度
  24. unsigned char xdata        R_Buf[R_Buf_Len];        //Uart1接收缓存
  25. unsigned char xdata        T_Buf[T_Buf_Len];        //Uart1发送缓存
  26. char USER_STCISPCMD[]="@STCISP#";                //下载命令(用户自定义,可修改,必须和ISP软件中设置的一致)
  27. bit Power_Down;                                                        //省电模式标志
  28. unsigned char xdata        Temp[8];                        //数据缓存
  29. ///*----------------------------延时10us@STC-Y6@11.0592MHz----------------------------*/
  30. //void Delay_10us(void)
  31. //{
  32. //        unsigned char i;
  33. //        i=35;
  34. //        while(--i);
  35. //}
  36. ///*----------------------------延时x10us----------------------------*/
  37. //void Delay_x10us(unsigned char x)
  38. //{
  39. //        while(x--)
  40. //                Delay_10us();
  41. //}
  42. /*----------------------------延时10ms@STC-Y6@11.0592MHz----------------------------*/
  43. void Delay_10ms(void)
  44. {
  45.         unsigned char i,j;
  46.         _nop_();
  47.         _nop_();
  48.         i=144;
  49.         j=157;
  50.         do
  51.         {
  52.                 while(--j);
  53.         }while(--i);
  54. }
  55. /*----------------------------延时x10ms----------------------------*/
  56. void Delay_x10ms(unsigned char x)
  57. {
  58.         while(x--)
  59.                 Delay_10ms();
  60. }
  61. void UART_Send(unsigned int x)
  62. {
  63.         TP=0;
  64.         Uart_T_Len=x;
  65.         TI=1;
  66. }
  67. void Uart_Printf(unsigned char *v,...)
  68. {
  69.         va_list ap;
  70.         va_start(ap,v);
  71.         while(Uart_T_Len);
  72.         UART_Send(vsprintf(T_Buf,v,ap));
  73.         va_end(ap);
  74. }
  75. void UART_Return(unsigned char temp)
  76. {
  77.         memcpy(T_Buf,R_Buf,temp);
  78.         UART_Send(temp);
  79. }
  80. void Init(void)
  81. {
  82.         P_SW2|=EAXFR;
  83.         IAP_TPS=11;
  84.         
  85.         P0M1=0x00;        P0M0=0x00;        //设置IO模式
  86.         P1M1=0x00;        P1M0=0x00;        //设置IO模式
  87.         P2M1=0x00;        P2M0=0x00;        //设置IO模式
  88.         P3M1=0x00;        P3M0=0x00;        //设置IO模式
  89.         P4M1=0x00;        P4M0=0x00;        //设置IO模式
  90.         P5M1=0x00;        P5M0=0x00;        //设置IO模式
  91.         P6M1=0x00;        P6M0=0x00;        //设置IO模式
  92.         P7M1=0x00;        P7M0=0x00;        //设置IO模式
  93.         
  94.         AUXR=0x40;                //设置定时器0时钟为12T模式,设置定时器1为1T模式,设置定时器1为波特率发生器
  95.         TMOD=0x01;                //设置定时器0为16位不自动重装载模式,设置定时器1为16位自动重装载模式
  96.         TH0=TMR>>8;                //设置定时器0初始值
  97.         TL0=TMR;                //设置定时器0初始值
  98.         TF0=0;                        //清除TF0中断标志位
  99.         ET0=1;                        //启用定时器0中断
  100.         
  101.         SCON=0x50;                //设置UART1模式为8位数据可变波特率
  102.         TH1=BRT>>8;                //设置UART1波特率
  103.         TL1=BRT;                //设置UART1波特率
  104.         TR1=1;                        //打开定时器1
  105.         ES=1;                        //启用UART1中断
  106.         
  107.         IT0=1;                        //设置INT0下降沿中断
  108.         EX0=1;                        //启用INT0中断
  109.         
  110.         EA=1;                        //启用总中断
  111.         
  112.         Power_Down=0;        //清零省电模式标志
  113. }
  114. void main(void)
  115. {
  116.         Init();
  117.         Uart_Printf("AI8G1K08A UART test.\r\n");
  118.         while(1)
  119.         {
  120.                 P33=!P33;                                        //P33 LED闪烁表示工作中
  121.                 if(!P33)
  122.                         Uart_Printf("AI8G1K08A running.\r\n");
  123.                
  124.                 if(Power_Down)                                //如允许进入省电模式
  125.                 {
  126.                         Power_Down=0;                        //清零省电模式标志
  127.                         
  128.                         while(Uart_T_Len);                //等待数据发送完毕
  129.                         
  130.                         _nop_();
  131.                         _nop_();
  132.                         _nop_();
  133.                         _nop_();
  134.                         
  135.                         PCON|=0x02;                                //进入省电模式
  136.                         
  137.                         _nop_();
  138.                         _nop_();
  139.                         _nop_();
  140.                         _nop_();
  141.                         
  142.                         memcpy(T_Buf,Temp,8);        //从数据缓存复制8字节数据到UART发送缓存
  143.                         UART_Send(8);                        //启动串口发送
  144.                 }
  145.                
  146.                 Delay_x10ms(50);
  147.         }
  148. }
  149. void Uart_Start(void)
  150. {
  151.         TL0=0x00;
  152.         TH0=0xEE;
  153.         TR0=1;
  154. }
  155. void Uart_Stop(void)
  156. {
  157.         TR0=0;
  158.         TL0=0x00;
  159.         TH0=0xEE;
  160.         RP=0;
  161.         memset(R_Buf,0x00,sizeof R_Buf);
  162. }
  163. void Int0_Isr(void) interrupt 0
  164. {
  165.         
  166. }
  167. void Timer0_Isr(void) interrupt 1
  168. {
  169. //        UART_Return(RP);        //超时原样返回
  170.         Uart_Stop();
  171. }
  172. void Uart_Isr(void) interrupt 4
  173. {
  174.         if(RI)
  175.         {
  176.                 RI=0;
  177.                 Uart_Start();
  178.                 R_Buf[RP]=SBUF;
  179.                 if((RP==sizeof USER_STCISPCMD-2)&&(memcmp(R_Buf,USER_STCISPCMD,sizeof USER_STCISPCMD-1)==0))        //收到用户命令后复位到ISP区
  180.                 {
  181.                         IAP_CONTR=0x60;
  182.                 }
  183.                 else if(RP==7)                                //接收指针为7时收到8个字节
  184.                 {
  185.                         memcpy(Temp,R_Buf,8);        //从UART接收缓存复制8字节数据到数据缓存
  186.                         Uart_Stop();                        //UART接收完毕
  187.                         Power_Down=1;                        //允许进入省电模式
  188.                 }
  189.                 if(RP==R_Buf_Len-1)
  190.                 {
  191.                         Uart_Stop();
  192.                 }
  193.                 else if(TR0)
  194.                 {
  195.                         RP++;
  196.                 }
  197.         }
  198.         if(TI)
  199.         {
  200.                 TI=0;
  201.                 if(TP==Uart_T_Len)
  202.                 {
  203. //                        TR=R;        //485软件收发控制
  204.                         TP=0;
  205.                         Uart_T_Len=0;
  206.                 }
  207.                 if(Uart_T_Len!=0)
  208.                 {
  209. //                        TR=T;        //485软件收发控制
  210.                         SBUF=(T_Buf[TP]);
  211.                         TP++;
  212.                 }
  213.         }
  214. }
复制代码
AI8G1K08A串口收到8字进入省电模式唤醒原样返回.zip (12.83 KB, 下载次数: 2)
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-13 10:14 , Processed in 0.113856 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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