lier378912453 发表于 2024-5-1 09:28:05

触摸按键休眠后无法唤醒

现象:触摸按键功能正常,根据案例增加休眠部分
{                TSCHEN1 = 0xff;                //TK0~TK7        仅仅允许K0唤醒
                TSCHEN2 = 0x0f;                //TK8~TK15
                TSCTRL = (1<<3) + (1<<2) + 0;        //关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP

                NOP(2);
                PCON |= 0x02;        //睡眠
                NOP(5);

    PrintString1("STC8H4K64TLR 唤醒后\r\n");
                TSCHEN1 = 0xff;                //TK0~TK7        允许所有16个键
                TSCHEN2 = 0x0f;                //TK8~TK15
                TSCTRL = (1<<7) + (1<<3) + (1<<2) + 0;}
就无法唤醒了,
扫描函数如下,

void Touch_Init(void)
{
//        u8 i;
//TSRT = 0x00;                  //没有LED分时扫描
        TSCHEN1 = 0xff;                //TK0~TK7
        TSCHEN2 = 0x0f;                //TK8~TK12 1111
        TSCFG1= (7<<4) + 6;        //开关电容工作频率 = fosc/(2*(TSCFG1+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
        TSCFG2= 1;                //配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)1(1/2)2(5/8)3(3/4)
//        TSCTRL = (1<<7) + (1<<6) +3;        //开始扫描, B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
        TSRT = 0x00;                //没有LED分时扫描
        TSCTRL =0xa0; //0xa0
//B7:TSGO=1使能触摸按键 1011 0100
//B6:SINGLE=1单次扫描模式、=0自动重复扫描
//B5:TSWAIT=1完成一轮扫描后、TSIF 被硬件置 1,此时触摸按键控制器会暂停扫描,直到 TSIF 标志位被清 0后才开始下一轮的扫描
//B4:TSWUCS=0使用内部32K晶振
//B3:TSDCEN=0不使能16位比较器
//B2:TSWUEN=1使能低功耗唤醒功能
//B1B0:TSSAMP=11单次按键扫描4次
TSWUTC = 20;                        //唤醒
        IE2 |= 0x80;                //允许触摸按键中断
        EA = 1;
        ReadZeroData();
}
void Touch_Scan()
{
        u8 i;
        if(B_1ms)
        {
                        B_1ms = 0;
                        for(i=0;i<12;i++)          //#
                        {
                                JudgeKey(i);        //判断键值
                        }

                        B = (u8)tpFlag;
                        if(B0)           //触摸按键被触发后,对应的指示灯信号进行翻转
                        {
                                beep(10);
                                key_value=3;
                                LED3 = !LED3;
                                TX1_write2buff(key_value);
                        }
                        if(B1)       
                        {
                                beep(10);
                                key_value=6;
                                LED6 = !LED6;
                                TX1_write2buff(key_value);
                        }
                        if(B2)       
                        {
                                beep(10);
                                key_value=1;
                                LED1 = !LED1;
                                TX1_write2buff(key_value);
                        }
                        if(B3)       
                        {
                                beep(10);
                                key_value=4;
                                LED4 = !LED4;
                                TX1_write2buff(key_value);
                        }
                        if(B4)       
                        {
                                beep(10);
                                key_value=8;
                                LED8 = !LED8;
                                TX1_write2buff(key_value);
                        }
                        if(B5)       
                        {
                                beep(10);
                                key_value=10;         
                                LED12 = !LED12;
                                TX1_write2buff(key_value);
                        }
                        if(B6)       
                        {
                                beep(10);
                                key_value=11;            //*
                                LED11 = !LED11;
                                TX1_write2buff(key_value);
                        }
                        if(B7)       
                        {
                                beep(10);
                                key_value=7;
                                LED7 = !LED7;
                                TX1_write2buff(key_value);
                        }
                       
                        B = (u8)(tpFlag >> 8);
                        if(B0)       
                        {
                                beep(10);
                                key_value=12;
                                LED13 = !LED13;
                                TX1_write2buff(key_value);
                        }
                        if(B1)       
                        {
                                beep(10);
                                key_value=9;
                                LED9 = !LED9;
                                TX1_write2buff(key_value);
                        }
                        if(B2)       
                        {
                                beep(10);
                                key_value=5;
                                LED5 = !LED5;
                                TX1_write2buff(key_value);
                        }
                        if(B3)       
                        {
                                beep(10);
                                key_value=2;
                                LED2 = !LED2;
                                TX1_write2buff(key_value);                               
                        }                       
                        tpFlag = 0;       
                       
                TSCHEN1 = 0xff;                //TK0~TK7        仅仅允许K0唤醒
                TSCHEN2 = 0x0f;                //TK8~TK15
                TSCTRL = (1<<3) + (1<<2) + 0;        //关闭触摸模块, 允许16位数字比较器, 允许低功耗唤醒。 B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
               
                NOP(2);
                PCON |= 0x02;        //睡眠
                NOP(5);
                       
    PrintString1("STC8H4K64TLR 唤醒后\r\n");
                TSCHEN1 = 0xff;                //TK0~TK7        允许所有16个键
                TSCHEN2 = 0x0f;                //TK8~TK15
                TSCTRL = (1<<7) + (1<<3) + (1<<2) + 0;
        }
}

乘风飞扬 发表于 2024-5-1 11:06:23

用这个帖子提供的例程试试:
触摸按键唤醒,1uA/1个键/1秒唤醒,STC触摸MCU, 唤醒【主时钟停振/省电模式】
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=5167
(出处: 国芯技术交流网站)

lier378912453 发表于 2024-5-1 13:38:36

就是参考的例程{:4_167:}

乘风飞扬 发表于 2024-5-2 09:54:17

lier378912453 发表于 2024-5-1 13:38
就是参考的例程

先直接用例子测试,功能测试正常后再进行修改或者移植。

lier378912453 发表于 2024-5-8 18:11:35

大家好请教下两个问题
一:12个触摸按键(亚克力覆盖在PCB上),多次触摸时,有时候会有串扰的问题(触摸按键时 间隔时间长一点 也会时不时出现串扰),这个应该从哪方面来分析呢
二:根据手册中的流程 触摸唤醒掉电流程一步一步操作下来,发现可以进入掉电模式 但是唤醒不起来了(待机功耗550uA 进入掉电模式时70UA左右,但是唤醒不起来)TSWUTC从128改到15 也不管
页: [1]
查看完整版本: 触摸按键休眠后无法唤醒