問題描述:
QTouch觸摸按鍵低功耗模式會影響其它外設的正常運行。
故障現象:
晶片型號:AVR64DA64-I/PT
開發環境:Atmel Start + Microchip Studio 7.0
故障描述:在使能低功耗後,定時器周期變長,USART接收錯誤。
分析過程:
1、由於定時器和USART都是使用的24MHz主時鐘,懷疑主時鐘受影響。檢查配置並嘗試開啟Run standby功能,無效。
QTouch觸摸按鍵低功耗模式會影響其它外設的正常運行。
故障現象:
晶片型號:AVR64DA64-I/PT
開發環境:Atmel Start + Microchip Studio 7.0
故障描述:在使能低功耗後,定時器周期變長,USART接收錯誤。
/* Enable or disable low-power scan
* Range: 0 or 1.
* Default value: 1
*/
#define DEF_TOUCH_LOWPOWER_ENABLE 1u
分析過程:
1、由於定時器和USART都是使用的24MHz主時鐘,懷疑主時鐘受影響。檢查配置並嘗試開啟Run standby功能,無效。
ccp_write_io((void *)&(CLKCTRL.OSCHFCTRLA),
CLKCTRL_FREQSEL_24M_gc /* 24 */
| 1 << CLKCTRL_AUTOTUNE_bp /* Auto-Tune enable: enabled */
| 1 << CLKCTRL_RUNSTDBY_bp /* Run standby: enabled */);
2、修改休眠模式,由Standby模式改為Idle模式,外設運行正常。但進入休眠後的電流明顯變大。 SLPCTRL.CTRLA = 1 << SLPCTRL_SEN_bp /* Sleep enable: enabled */
| SLPCTRL_SMODE_IDLE_gc; /* Idle Mode */ //SLPCTRL_SMODE_STDBY_gc
3、對比Idle和Standby模式的區別,發現在Standby模式下Sleep時定時器和USART會停用。但在未進休眠之前,也應該能正常工作才對?
4、屏蔽掉 sleep 指令,雖然不能休眠,但在進入休眠之前定時器和USART都可以正常運行了,說明故障是由於sleep引起的。
5、檢查sleep指令的執行邏輯,在sleep指令前後使用IO口翻轉的方法,使用邏輯分析儀抓取IO波形,發現在進入休眠之前,也會執行sleep指令,確定是休眠邏輯異常。
if (time_to_measure_touch_flag != 1u) {
//Test IO set high.
sleep_cpu();
//Test IO set low.
}
6、還原之前的所有改動,然後在sleep指令前增加一個判斷條件,僅在低功耗測量模式下才執行sleep指令,故障排除。if (time_to_measure_touch_flag != 1u) {
if(lp_mesurement)
sleep_cpu();
}
解決方案:
在touch.c的touch_process()函數中。
在sleep指令前增加一個判斷條件 if(lp_mesurement),僅在低功耗測量模式下才執行sleep指令,未進入休眠前不執行,故障排除。
經驗總結:
QTouch庫的休眠邏輯也許只考慮了Touch的低功耗,沒有考慮同時使用其它外設的情況。需要稍作修改才能正常運行。
評論