在一个项目中使用到了MSP430G2系列,看中的是它的价格优势和相对其它厂家(如st,atmel)更为多样化的电容式触控检测方式。
开始使用MSP430G2503,只有一个定时器TA0,但是这样TA0既要定时又要触摸按键检测,即使在每次检测触摸后修正计时也无法取得既定的定时精度,
所以更换为MSP430G2553,它有两个定时器,我把TA0用作触摸按键检测,TA1用作系统滴答时钟(10ms为中断周期)。
然而在测试时发现系统滴答时钟总是慢一些,后来检查发现慢的时间正好是触摸按键检测时间(使用ACLK产生时间阀门作接近式感应,每次检测时间近50ms)。
然而看触控库代码,其中只对TA0进行了上下文切换,应该不会对TA1计时造成影响才对。
请问为什么TA1的计时会在TA0用于电容式触摸时暂停?如何让TA1不受电容式触控库的影响正常计时?
Vivian(MCU) Zhang:
从中断的原理上来分析这样的现象是正常的,因为当一个中断(TA0)正在执行时,其它中断的请求无法得到响应,必须执行完前一个中断后才能执行。
如何来避免这样的情况来精确计时,我目前能想到的是使用RTC,但是G系列中没有此模块。或者用中断嵌套,时序上会很复杂并且并不能真正做到精确计时。不知道高手们的高见如何?
Vivian(MCU) Zhang:
回复 Caize Wu:
一开始没有完全明白你的问题,现在根据描述已经明白了,而且您自己也找到了问题的原因。我看了一下touch cap libaray, 分底层layer 和 硬件相关层 HAL, 你的问题只与HAL这一层相关,需要改动的地方很少,只需要将此层中调用的函数模型(默认是TI_CTS_RO_PINOSC_TA0_WDTp_HAL)中__bis_SR_register(LPM3_bits+GIE); 改为__bic_SR_register(LPM0_bits+GIE) 或__bic_SR_register(GIE),前者是进入LPM0,此状态虽然进入低功耗模式,但SMCLK任然保持打开状态,不会影响TA1工作;后者是任然保持active模式,只是将全局中断打开。
需要注意:无论进入何种模式,都需要打开全局中断GIE。相应的在main函数中也需要将退出低功耗模式的语句__bic_SR_register_on_exit(LPM3_bits+GIE)做相应修改。
其实是只低功耗模式的应用,并不涉及touch cap其它代码的修改。由于一般低功耗模式最常见的是LPM3模式,所以在例程中应用的最多的就是这个模式,根据自己的需求稍加改动并不会很麻烦,可以尝试一下。