找回密码
 立即注册
查看: 108|回复: 6

STC32G12K128省电模式唤醒

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-03 09:03:14
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2025-12-2 15:30:55 | 显示全部楼层 |阅读模式
这段代码在main的主循环中一直进入省电模式,只有当P2.1上触发中断之后,中断会串口打印数据,随后退出省电模式,执行PD=1后面的代码,但是实际情况是中断触发之后,中断函数中的打印能有,但是while循环中的打印有时候有,有时候没有,请问这个是什么问题

1.PNG
2.PNG
3.PNG
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21314
发表于 2025-12-2 15:56:56 | 显示全部楼层
截图202512021556527194.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-03 09:03:14
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2025-12-2 16:05:06 | 显示全部楼层

我看到了,STC32G12K128的普通IO口最好不要上升沿、下降沿中断,
但是有2个原因:
1.硬件已经设计好了,现在要唤醒的中断就在这个引脚上面;
2.从PD模式下面普通IO唤醒只能使用上升、下降沿中断,不能使用高低电平的中断吧
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-03 09:03:14
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2025-12-2 16:06:22 | 显示全部楼层

这个IO中断优先级会对唤醒有影响吗?需要额外配置下吗?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21314
发表于 2025-12-2 16:31:40 | 显示全部楼层
可以改用:

STC32G8K64-LQFP48/32/TSSOP20
STC8H8K64U-LQFP64/48/32/TSSOP20




截图202512021633128992.jpg

截图202512021634104042.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:647
  • 最近打卡:2025-12-18 07:29:35
已绑定手机

93

主题

6940

回帖

1万

积分

超级版主

积分
13026
发表于 2025-12-2 18:13:52 | 显示全部楼层
我遇到过相同问题,因为串口还没发完就进入省电模式了,解决办法是等串口发送完毕再进入省电模式
因为printf只是装载数据到缓冲区,然后串口中断和硬件在“后台”发送
以下例程供参考,基于本人编写的“串口收发框架,带不断电下载功能”:
https://www.stcaimcu.com/thread-16321-1-1.html
关键代码:
截图202512021818374446.jpg
逻辑:
整个数据包发送完毕后,发送长度变量会在串口中断内清零,printf后要等待该变量为0再进入省电模式
例程:
  1. #include <AI8H.H>
  2. #include <intrins.h>
  3. #include <absacc.h>
  4. #include <string.h>
  5. #include <stdarg.h>
  6. #include <stdio.h>
  7. #include <math.h>
  8. #define                RXD                        P30
  9. #define                TXD                        P31
  10. #define                FOSC                24000000UL
  11. #define                BAUD                9600UL                                                //波特率
  12. #define                TMRF                200UL                                                //定时器频率
  13. #define                BRT                        (0x10000-(FOSC/BAUD+2)/4)        //波特率发生器值
  14. #define                TMR                        (0x10000-FOSC/TMRF/12)                //定时器值
  15. #define                R_Buf_Len        64                                                        //Uart1接收缓存长度
  16. #define                T_Buf_Len        64                                                        //Uart1发送缓存长度
  17. #define                R                        0                                                        //485接收
  18. #define                T                        1                                                        //485发送
  19. unsigned char                RP;                                        //Uart1接收指针
  20. unsigned char                TP;                                        //Uart1发送指针
  21. unsigned char                Uart_R_Len;                        //Uart1接收长度
  22. unsigned char                Uart_T_Len;                        //Uart1发送长度
  23. unsigned char xdata        R_Buf[R_Buf_Len];        //Uart1接收缓存
  24. unsigned char xdata        T_Buf[T_Buf_Len];        //Uart1发送缓存
  25. char USER_STCISPCMD[]="@STCISP#";        //下载命令(用户自定义,可修改,必须和ISP软件中设置的一致)
  26. void Delay_ms(unsigned char ms)
  27. {
  28.         unsigned int i;
  29.         do
  30.         {
  31.                 i=FOSC/10000;
  32.                 while(--i);        //10T per loop
  33.         }
  34.         while(--ms);
  35. }
  36. void UART_Send(unsigned int x)
  37. {
  38.         TP=0;
  39.         Uart_T_Len=x;
  40.         TI=1;
  41. }
  42. void Uart_Printf(unsigned char *v,...)
  43. {
  44.         va_list ap;
  45.         va_start(ap,v);
  46.         while(Uart_T_Len);
  47.         UART_Send(vsprintf(T_Buf,v,ap));
  48.         va_end(ap);
  49. }
  50. void UART_Return(unsigned char temp)
  51. {
  52.         memcpy(T_Buf,R_Buf,temp);
  53.         UART_Send(temp);
  54. }
  55. void Init(void)
  56. {
  57.         P_SW2|=EAXFR;
  58.         
  59.         P0M1=0x00;        P0M0=0x00;        //设置IO模式
  60.         P1M1=0x00;        P1M0=0x00;        //设置IO模式
  61.         P2M1=0x00;        P2M0=0x00;        //设置IO模式
  62.         P3M1=0x00;        P3M0=0x00;        //设置IO模式
  63.         P4M1=0x00;        P4M0=0x00;        //设置IO模式
  64.         P5M1=0x00;        P5M0=0x00;        //设置IO模式
  65.         P6M1=0x00;        P6M0=0x00;        //设置IO模式
  66.         P7M1=0x00;        P7M0=0x00;        //设置IO模式
  67.         
  68.         AUXR=0x40;                //设置定时器0时钟为12T模式,设置定时器1为1T模式,设置定时器1为波特率发生器
  69.         TMOD=0x01;                //设置定时器0为16位不自动重装载模式,设置定时器1为16位自动重装载模式
  70.         TH0=TMR>>8;                //设置定时器0初始值
  71.         TL0=TMR;                //设置定时器0初始值
  72.         TF0=0;                        //清除TF0中断标志位
  73.         ET0=1;                        //启用定时器0中断
  74.         
  75.         SCON=0x50;                //设置UART1模式为8位数据可变波特率
  76.         TH1=BRT>>8;                //设置UART1波特率
  77.         TL1=BRT;                //设置UART1波特率
  78.         TR1=1;                        //打开定时器1
  79.         ES=1;                        //启用UART1中断
  80.         
  81.         EA=1;                        //启用总中断
  82. }
  83. void main(void)
  84. {
  85.         Init();
  86.         
  87.         Uart_Printf("Start\r\n");
  88.         
  89.         RSTCFG&=~0x40;
  90.         RSTFLAG=0x14;
  91. //        ELVD=1;
  92.         
  93.         Uart_Printf("RSTCFG  = 0x%02bX\r\n",RSTCFG);
  94.         Uart_Printf("RSTFLAG = 0x%02bX\r\n",RSTFLAG);
  95.         Uart_Printf("IE      = 0x%02bX\r\n",IE);
  96.         
  97.         P32=!P32;
  98.         Delay_ms(250);
  99.         Delay_ms(250);
  100.         P32=!P32;
  101.         Delay_ms(250);
  102.         Delay_ms(250);
  103.         P32=!P32;
  104.         Delay_ms(250);
  105.         Delay_ms(250);
  106.         P32=!P32;
  107.         Delay_ms(250);
  108.         Delay_ms(250);
  109.         P32=!P32;
  110.         Delay_ms(250);
  111.         Delay_ms(250);
  112.         P32=!P32;
  113.         Delay_ms(250);
  114.         Delay_ms(250);
  115.         P32=!P32;
  116.         Delay_ms(250);
  117.         Delay_ms(250);
  118.         P32=!P32;
  119.         Delay_ms(250);
  120.         Delay_ms(250);
  121.         P32=!P32;
  122.         Delay_ms(250);
  123.         Delay_ms(250);
  124.         P32=!P32;
  125.         Delay_ms(250);
  126.         Delay_ms(250);
  127.         
  128.         Uart_Printf("PD\r\n");
  129.         while(Uart_T_Len);
  130.         
  131.         _nop_();
  132.         _nop_();
  133.         _nop_();
  134.         _nop_();
  135.         PCON|=0x02;
  136.         _nop_();
  137.         _nop_();
  138.         _nop_();
  139.         _nop_();
  140.         
  141.         while(1)
  142.         {
  143.                 Uart_Printf("Running\r\n");
  144.                 Delay_ms(250);
  145.                 Delay_ms(250);
  146.                 Delay_ms(250);
  147.                 Delay_ms(250);
  148.         }
  149. }
  150. void Uart_Start(void)
  151. {
  152.         TL0=0x00;
  153.         TH0=0xEE;
  154.         TR0=1;
  155. }
  156. void Uart_Stop(void)
  157. {
  158.         TR0=0;
  159.         TL0=0x00;
  160.         TH0=0xEE;
  161.         RP=0;
  162.         memset(R_Buf,0x00,sizeof R_Buf);
  163. }
  164. void TMR0_Isr(void) interrupt TMR0_VECTOR
  165. {
  166.         UART_Return(RP);        //超时原样返回
  167.         Uart_Stop();
  168. }
  169. void UART1_Isr(void) interrupt UART1_VECTOR
  170. {
  171.         if(RI)
  172.         {
  173.                 RI=0;
  174.                 Uart_Start();
  175.                 R_Buf[RP]=SBUF;
  176.                 if((RP==sizeof USER_STCISPCMD-2)&&(memcmp(R_Buf,USER_STCISPCMD,sizeof USER_STCISPCMD-1)==0))        //收到用户命令后复位到ISP区
  177.                 {
  178.                         IAP_CONTR=0x60;
  179.                 }
  180.                 if(RP==R_Buf_Len-1)
  181.                 {
  182.                         Uart_Stop();
  183.                 }
  184.                 else if(TR0)
  185.                 {
  186.                         RP++;
  187.                 }
  188.         }
  189.         if(TI)
  190.         {
  191.                 TI=0;
  192.                 if(TP==Uart_T_Len)
  193.                 {
  194. //                        TR=R;        //485软件收发控制
  195.                         TP=0;
  196.                         Uart_T_Len=0;
  197.                 }
  198.                 if(Uart_T_Len!=0)
  199.                 {
  200. //                        TR=T;        //485软件收发控制
  201.                         SBUF=(T_Buf[TP]);
  202.                         TP++;
  203.                 }
  204.         }
  205. }
  206. void LVD_Isr(void) interrupt LVD_VECTOR
  207. {
  208.         RSTFLAG=0x10;
  209. }
复制代码

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-03 09:03:14
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2025-12-3 09:03:14 | 显示全部楼层
Debu*** 发表于 2025-12-2 18:13
我遇到过相同问题,因为串口还没发完就进入省电模式了,解决办法是等串口发送完毕再进入省电模式
因为print ...

好的,我试一下,不过今天早上发现这套代码省电模式唤醒之后的串口打印又有了,昨天下午还是不行的,中断触发之后只有中断函数中的打印会触发,只是放了一个晚上,程序完全没动过
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-18 16:20 , Processed in 0.111798 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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