STC 触摸按键低功耗唤醒CPU
1 TSU能做自我唤醒以来扫描按键
2 按键扫描结果小于设定值时,TSU会将TSIF置1 并唤醒CPU,
3 那唤醒CPU后32K晶振还是每隔一段时间去唤醒TSU做按键扫描吗?
4 休眠时是通过32K定时周期唤醒扫描,进休眠模式后才会开始计时,唤醒后就不计时了
5 怎么设置唤醒通道呢?
比如我只想让TK0才能唤醒MCU
6 当CPU被唤醒后,除了可以直接读取TSDNCHN[3:0]认定的时那个按键有触摸外,也可以在正常工作模式再实行按键扫描以确认是否唤醒是因为干扰所致。
7 调试经验:
A要通过设置TSCTRL寄存器改变TSU模块工作状态时,应先清除TSCTRL的最高位TRGO,否则无法改写成功。
B TSCTRL从单次扫描进入掉电模式后,然后再离开掉电模式后,即唤醒后TSU默认的工作模式是有按键按下并达到设定的阀值就工作一次(进一次TSU中断),松开按键就不工作了(不再进TSU中断了) ,不是前面设置的单次扫描模式了。
唤醒后,清0 TRGO,并设置单次扫描,程序就只工作一次;
如果唤醒后什么都不设置,有按键按下达到触发值就会产生一次中断,按键松开后,就不产生TSU中断了;说明这种设置还是睡眠时的比较器在起作用,如果触摸值小于比较器阀值,则TSIF会置1,然后就产生中断了。松开后触摸值大于比较器阀值,TSIF不会置1,所以松开按键后就不会产生中断了。
唤醒后设置 TSCTRL=0Xa0,则不管有没有按键按下,会一直不停的产生中断,说明TSU模块在一直不停的工作。
测试程序如下:
Main:
TSCHEN1 = 0x13; //TK0~TK7 仅仅允许K0唤醒
TSCHEN2 = 0x00; //TK8~TK15
TSCTRL = (1<<3) + (1<<2) + 0; // 关闭触摸模块,允许16位数字比较器,允许低功耗唤醒
B7: TSGO, B6: SINGLE, B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
PCON |= 0x02; //睡眠
NOP(5);
// TSCTRL =0x00;
// TSCTRL = (1<<7) + (1<<6); //danci saomiao
TSCTRL =0x00;
TSCTRL=0xA0;
while (1)
{
if(B_KeyPress)
{
B_KeyPress=0;
if(WakeUpkey == 0) P_K3_LED = ~P_K3_LED; //按键触摸操作
if(WakeUpkey == 1) P_K3_LED = ~P_K3_LED;
if(WakeUpkey == 4) P_K3_LED = ~P_K3_LED;
}
delay_ms(250);
delay_ms(250);
}
中断 :
void TKSU_ISR(void) interrupt TKSU_VECTOR
{
u8 j;
j = TSSTA2;
if(j & 0x40) //Êý¾ÝÒç³ö, ´íÎó´¦Àí(ÂÔ)
{
TSSTA2 |= 0x40; //д1ÇåÁã
}
if(j & 0x80) //ɨÃèÍê³É
{
TSSTA2 |= 0x80; //д1ÇåÁã
j &= 0x0f;
WakeUpkey = j;
B_KeyPress = 1;
TK_cnt[j] = TSDAT; //±£´æÄ³¸öͨµÀµÄ¶ÁÊý
}
}
TSWUEN:触摸按键控制器低功耗使能位
0:关闭触摸按键控制器低功耗唤醒功能
1:是能触摸按键控制器低功耗唤醒功能。
使能后当MCU进入power-down 状态后,旋即进入触摸按键低功耗唤醒MCU模式。
TSWUEN只有在MCU进入power-down mode以及TSIF为0时才会真正有作用。
TSIF通道扫描完成标志,一次扫描16个通道,一次扫描有16个中断?
TSCTRL 触摸按键控制寄存器
SINGLE :
0:重复扫描模式
1:单次扫描模式。当TSGO=1时,当完成一轮按键扫描后,硬件将自动将TSGO清0终止扫描。
一轮按键扫描包括多个通道。

MCU 进入低功耗后,定时器开始工作,周期性的使TSU模块扫描,如果扫描值与设定的通道阀值比较,
如果满足条件就会产生中断并唤醒MCU,唤醒后定时器就不工作了。TSU模块开始以当前的设置开始工作。
唤醒后也可以重新设置TSU模块
唤醒时由于设置了唤醒时间,假设设置为1S,触摸时,会出现有时候唤醒时间长,有时候唤醒时间短。

浙公网安备 33010602011771号