|
问题:配置了触摸按键唤醒和其他中断唤醒的时候,当TSWUTC该寄存器的值配置较小的时候,发现触摸唤醒可以正常运行,但是其它唤醒方式出现了问题(如:外部中断唤醒),即有概率出现无法通过除触摸唤醒之外的其他唤醒源让单片机唤醒。
void Touchkey_Init() //触摸配置函数
{
TSCHEN2 = 0x0c; //触摸按键使能 P52 TK10 P53 TK11
TSCFG1 = (7<<4) + 6; //B6~B4:开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), B2~B0:放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最好大于等于3(1000)
TSCFG2 = 1; //B1~B0:配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4) 1(1/2) 2(5/8) 3(3/4)
TSRT = 0x00; //没有LED分时扫描
IE2 |= 0x80; //允许触摸按键中断
}
void main()
{
P_SW2 |= 0x80;
PORT_INTI();
Touchkey_Init();
EA = 1;
delay_ms(500);
Touchkey_Zero(); //获取按键0点
B_TK_Lowpass = 0;
main_state = 0;
while(1)
{
switch(main_state)
{
case 0:
ET0 = 0;
TSCTRL &= 0x73; //暂停扫描
TSWUTC = 0x01; //在睡眠模式下1s唤醒一次进行触摸按键扫描判断是否需要唤醒
TSTH10 = 0x0f00; //控制触摸唤醒灵敏度
TSTH11 = 0x0f00;
IRC32KCR |= 0X80; //开启内部低速IRC
while(!(IRC32KCR & 1)); //等待时钟稳定
TSCTRL |= 0x0c; //开启触摸按键唤醒
AUXINTIF &= ~0x20; //清除外中断3标志位
INTCLKO =EX3;
PCON = 0x02;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
// main_state = 1;
break;
case 1:
ET0 = 1;
light();
}
}
}
void INT3_Isr() interrupt 11 //P37 时间设置按键唤醒??
{
P50 = ~P50;
}
上述代码设置了外部中断3唤醒和触摸按键唤醒,通过外部中断3唤醒的时候会有概论出现无法唤醒。于是在外部中断函数中加入了电平翻转来验证是否触发过中断
如上图所示,上面的信号为外部中断引脚信号,下面的为电平翻转验证信号
该图是在我未加入触摸唤醒时的逻辑分析图,可以看到每当有外部中断下降沿的时候,验证信号均发生了翻转,也就是可以正常唤醒
上图是我加入触摸唤醒之后,发现当外部中断下降沿产生的时候,会有概论出现未进入到中断函数进行验证信号电平翻转,也就是无法正常唤醒
我验证出来,当在唤醒的时候,在如上配置触摸按键一次执行时间大约为2ms,触摸按键低电模式唤醒时间为7ms,也就是应该可以正常完成一个触摸扫描?
或者是当进行触摸按键唤醒扫描的时候,无法识别到其它外设电平变换(导致没有中断标志位)?
|
|