This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430G2553的TA0用于触摸按键检测时TA1也停止计时了?

Other Parts Discussed in Thread: MSP430G2553

在一个项目中使用到了MSP430G2系列,看中的是它的价格优势和相对其它厂家(如st,atmel)更为多样化的电容式触控检测方式。

开始使用MSP430G2503,只有一个定时器TA0,但是这样TA0既要定时又要触摸按键检测,即使在每次检测触摸后修正计时也无法取得既定的定时精度,

所以更换为MSP430G2553,它有两个定时器,我把TA0用作触摸按键检测,TA1用作系统滴答时钟(10ms为中断周期)。

然而在测试时发现系统滴答时钟总是慢一些,后来检查发现慢的时间正好是触摸按键检测时间(使用ACLK产生时间阀门作接近式感应,每次检测时间近50ms)。

然而看触控库代码,其中只对TA0进行了上下文切换,应该不会对TA1计时造成影响才对。

请问为什么TA1的计时会在TA0用于电容式触摸时暂停?如何让TA1不受电容式触控库的影响正常计时?

  • 从中断的原理上来分析这样的现象是正常的,因为当一个中断(TA0)正在执行时,其它中断的请求无法得到响应,必须执行完前一个中断后才能执行。

    如何来避免这样的情况来精确计时,我目前能想到的是使用RTC,但是G系列中没有此模块。或者用中断嵌套,时序上会很复杂并且并不能真正做到精确计时。不知道高手们的高见如何?

  • 我觉得不是这个原因,因为中断程序设计的原则就是尽量占用较短时间完成中断处理,防止占用主程序或者其它中断的时间。

    查看电容触控库的具体实现也可以发现,程序利用WDT产生时间阀门,阀门内进入LPM0/3等待,

    定时到的ISR仅有一句__bic_SR_register_on_exit(LPM3_bits);,即使以12KHz的ACLK来运行该语句也不可能需要长达50ms(600时钟周期)。

    不过看到这条语句我也明白为什么TA1会暂停了,因为TA1使用的是SMCLK,而在LPM3下SMCLK被禁止,自然TA1就不会走时了。

    TI的电容触控库真是见缝插针地想低功耗,一看我是用ACLK产生时间阀门就自动选择LPM3模式,导致SMCLK的外设就不能工作,要改的话只能手动改触控库硬件抽象层代码,不是很方便。希望触控库配置文件能增加时间阀门内MCU工作状态的配置,这样使用起来更灵活。

    为做项目突击学的几天MSP430,不是很熟,见笑了。。

  • 一开始没有完全明白你的问题,现在根据描述已经明白了,而且您自己也找到了问题的原因。我看了一下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模式,所以在例程中应用的最多的就是这个模式,根据自己的需求稍加改动并不会很麻烦,可以尝试一下。