找回密码
 立即注册
楼主: 梁工

触摸按键唤醒,1uA/1个键/1秒唤醒,STC触摸MCU, 唤醒【主时钟停振/省电模式】

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-06-13 08:35:04

1

主题

25

回帖

145

积分

等待验证会员

积分
145
发表于 6 天前 | 显示全部楼层
请教梁工。使用自己的板子,烧录了“03-16键简单应用-触摸按键唤醒-外中断唤醒”,串口(每秒发出1次"W”)和指示灯都正常。经打印相关信息,按下和未按下,触摸值到的值,有明显变化。 按下的阈值也低于设置的TSTH,但是无法执行到下面的代码里,不知道怎么回事?

                if(B_KeyPress)
                {
                        B_KeyPress = 0;
                        if(WakeUpkey == 0)        P_K0_LED = ~P_K0_LED;        //键触摸操作
                        if(WakeUpkey == 1)        P_K1_LED = ~P_K1_LED;
                        if(WakeUpkey == 2)        P_K2_LED = ~P_K2_LED;
                        if(WakeUpkey == 3)        P_K3_LED = ~P_K3_LED;
                        if(WakeUpkey == 4)        P_K4_LED = ~P_K4_LED;
                        if(WakeUpkey == 5)        P_K5_LED = ~P_K5_LED;
                        if(WakeUpkey == 6)        P_K6_LED = ~P_K6_LED;
                        if(WakeUpkey == 7)        P_K7_LED = ~P_K7_LED;
                        if(WakeUpkey == 8)        P_K8_LED  = ~P_K8_LED;
                        if(WakeUpkey == 9)        P_K9_LED  = ~P_K9_LED;
                        if(WakeUpkey == 10)        P_K10_LED = ~P_K10_LED;
                        if(WakeUpkey == 11)        P_K11_LED = ~P_K11_LED;
                        if(WakeUpkey == 12)        P_K12_LED = ~P_K12_LED;
                        if(WakeUpkey == 13)        P_K13_LED = ~P_K13_LED;
                        if(WakeUpkey == 14)        P_K14_LED = ~P_K14_LED;
                        if(WakeUpkey == 15)        P_K15_LED = ~P_K15_LED;
                }

点评

判断按键部分有问题吧?不按键读数多少?按键后读数多少?  详情 回复 发表于 6 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:93
  • 最近打卡:2025-06-14 13:12:15

74

主题

6088

回帖

1万

积分

超级版主

积分
12715
发表于 6 天前 | 显示全部楼层
明月*** 发表于 2025-6-10 16:11
请教梁工。使用自己的板子,烧录了“03-16键简单应用-触摸按键唤醒-外中断唤醒”,串口(每秒发出1次"W”) ...

判断按键部分有问题吧?不按键读数多少?按键后读数多少?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-06-13 08:35:04

1

主题

25

回帖

145

积分

等待验证会员

积分
145
发表于 5 天前 | 显示全部楼层
梁*** 发表于 2025-6-10 18:12
判断按键部分有问题吧?不按键读数多少?按键后读数多少?

谢谢回复。之前理解的不对,由于自己的板子 不是16键触摸。个别通道一直读出来是0,相当于一直触发了。加了打印函数,发现一直是通道3触发。

点评

未启动的按键,不要做处理即可。  详情 回复 发表于 5 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:93
  • 最近打卡:2025-06-14 13:12:15

74

主题

6088

回帖

1万

积分

超级版主

积分
12715
发表于 5 天前 | 显示全部楼层
明月*** 发表于 2025-6-11 11:03
谢谢回复。之前理解的不对,由于自己的板子 不是16键触摸。个别通道一直读出来是0,相当于一直触发了。加 ...

未启动的按键,不要做处理即可。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-06-13 08:35:04

1

主题

25

回帖

145

积分

等待验证会员

积分
145
发表于 4 天前 | 显示全部楼层
梁工,遇到一个新问题,折腾了半天没搞懂,程序始终无法运行。我正常运行的程序,包含初始化,使用了TSCTRL = 0x80; 在MCU准备进入休眠时,代码如下,                 
      X32KCR = 0x80 + 0x40;   //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
      while (!(X32KCR & 0x01));  //等待时钟稳定
                  printf("进入休眠\n\r");
                        TSCTRL = 0x00;
                        TSCTRL = (1<<4) + (1<<3) + (1<<2) + 0;        
                  //关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
                  DelayXms(1);
                        PCON |= 0x02;        //睡眠
                        NOP(5);
                        printf("WAKE..\n\r");
                  TSCTRL = (1<<7) + (1<<6) + (1<<3) + (1<<2) + 0;        //开始扫描, 无平均, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
                         if(B_KeyPress)
                        {
                                B_KeyPress = 0;
                                if(WakeUpkey == 0)        
                                {
                                        P20 = ~P20;
                                        TSCTRL = 0x80;                        //开始自动扫描, 无平均, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
                                         return; //退出睡眠
        }
                                if(WakeUpkey == 1)        P21 = ~P21;
                                if(WakeUpkey == 2)        P42 = ~P42;
                                printf("WakeUpkey = %bd \n\r",WakeUpkey);
                        }        

现在的现象和问题就是:我只要在其他地方调用过 TSCTRL = 0x80;这句,包含初始化阶段,也就是TSGO=1,等到我再回到上述进入休眠的流程。就无法通过触摸按键从休眠中唤醒。实在不知道问题出在哪?

点评

请参考我主楼的程序。  详情 回复 发表于 4 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:93
  • 最近打卡:2025-06-14 13:12:15

74

主题

6088

回帖

1万

积分

超级版主

积分
12715
发表于 4 天前 | 显示全部楼层
明月*** 发表于 2025-6-12 09:11
梁工,遇到一个新问题,折腾了半天没搞懂,程序始终无法运行。我正常运行的程序,包含初始化,使用了TSCTRL ...

请参考我主楼的程序。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-06-13 08:35:04

1

主题

25

回帖

145

积分

等待验证会员

积分
145
发表于 4 天前 | 显示全部楼层
梁*** 发表于 2025-6-12 09:24
请参考我主楼的程序。

关于触摸低功耗的部分基本上跟你的一样的了。这个问题始终存在,懵了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-06-13 08:35:04

1

主题

25

回帖

145

积分

等待验证会员

积分
145
发表于 4 天前 | 显示全部楼层
梁*** 发表于 2025-6-12 09:24
请参考我主楼的程序。

梁工,你好,我直接用你的代码跑,只要 加上 TSCTRL = 0x80; 这句,后面的唤醒功能就完全失效了。我认为这是一个BUG。C:\Users\yang.xingyuan\Desktop\1749709885494.jpg
1749709885494.jpg

点评

你启动扫描,马上又进入睡眠,可能不行。你这样试下: TSCTRL = 0x00; delay_ms(50); //延时一下 TSCTRL = (1  详情 回复 发表于 4 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:93
  • 最近打卡:2025-06-14 13:12:15

74

主题

6088

回帖

1万

积分

超级版主

积分
12715
发表于 4 天前 | 显示全部楼层
明月*** 发表于 2025-6-12 14:33
梁工,你好,我直接用你的代码跑,只要 加上 TSCTRL = 0x80; 这句,后面的唤醒功能就完全失效了。我认为这 ...

你启动扫描,马上又进入睡眠,可能不行。你这样试下:
TSCTRL = 0x00;
delay_ms(50);        //延时一下
TSCTRL = (1<<3) + (1<<2) + 0; //关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-06-13 08:35:04

1

主题

25

回帖

145

积分

等待验证会员

积分
145
发表于 3 天前 | 显示全部楼层
梁*** 发表于 2025-6-12 14:48
你启动扫描,马上又进入睡眠,可能不行。你这样试下:
TSCTRL = 0x00;
delay_ms(50);        //延时一下

感谢回复。这里加上延时,确实有效果
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 04:18 , Processed in 0.235770 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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