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.

[参考译文] MSP430FR5739:定时器 A0中断问题

Guru**** 2380860 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1476177/msp430fr5739-timer-a0-interrupt-issue

器件型号:MSP430FR5739

工具与软件:

您好!

我误解了 Timer0_A0/A1的含义、并适当地调整了我的问题。

我想帮忙弄清楚为什么 当使用 P1.2作为从外部硬件提供的 TA0CLK 输入时 Timer0_A1 ISR 会无限期触发。 尽管如此、Timer0_A0和 Timer0_A0 ISR 似乎运行正常。

主项目代码已经被简化、所有宏和定义被删除、这是因为它与以下问题无关:

#include "cs.h"
#include "msp430fr5739.h"

void delay_ms(uint16_t _value){ //basic delay function
	for (int i = _value; i >= 0; i--){
		__delay_cycles(((double)1000000.0 / (double)1000.0));
	}
}

volatile uint8_t counter_A0 = 0;
volatile uint8_t counter_A1 = 0;

float test(uint16_t sample_time){
	P4OUT |= (BIT0); //turn oscillations on (external circuit, connected to P1.2)
	delay_ms(5); //let settle

	__bis_SR_register(GIE);

	TA0CTL = (TASSEL__TACLK | MC__CONTINUOUS | TACLR | TAIE | CNTL__16);
	delay_ms(sample_time);
	TA0CTL = (TASSEL__TACLK | MC__STOP); //this line is never reached

	__bic_SR_register(GIE);

	P4OUT &= ~ (BIT0);//turn oscillations off

	uint32_t pulses = (65536 * counter_A1) + TA0R;

	return(pulses * (1000.0 / (float)sample_time));
}

void main(void){
	WDTCTL = WDTPW | WDTHOLD;   //stop watchdog timer
	__bic_SR_register(GIE);
	
	P4DIR |= (BIT0); //initiate extrnal control pin
	P1DIR &= ~(BIT2); //initiate P1.2 as TA0CLK
	P1SEL0 &= ~(BIT2);
	P1SEL1 |= (BIT2);

	float count_out = test(100);
	//do something with count_out

	__bis_SR_register(LPM0_bits + GIE); //enable global interrupts and enter LPM0
}

#pragma vector = TIMER0_A0_VECTOR
__interrupt void timerA0_ISR(void){
	counter_A0++; //incriment counter (working as intended)
}

#pragma vector = TIMER0_A1_VECTOR
__interrupt void timerA1_ISR(void){
	counter_A1++; //shouldn't be called? (never clears)
}

有人能解释为什么触发了两个 Timer0 (TA0)向量吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的,所以有一个不健康的编辑做了这篇文章,但与我自己的谈话帮助我弄清楚。 在此之前、不要使用溢出寄存器或 TA0CCR1/2/3/ETC 寄存器进行计时器中断。

    在我的 ISR 中添加以下行已修复了我的所有问题。  

    uint16_t aaaa = TA0IV;

    但是、在未正确处理 Timer0_A1时、是什么导致 Timer0_A0递增?

    此外、是否有办法将完整的16位计时器与 TA0CCR0中断配合使用、以允许 ISR 不手动读取/清除 IV 寄存器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="642922" url="~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1476177/msp430fr5739-timer-a0-interrupt-issue/5666673 #5666673"]然而、当未正确处理 Timer0_A1时、导致 Timer0_A0递增的原因是什么?[/QUOT]

    优先级。

    CCRx 的 ISR 没有清除中断源、因此当它退出时、它立即引起了另一个中断。 绑定 CPU 并阻止它执行其他操作。

    同时、计时器会继续计数并最终触发 CCR0中断。 优先级较高的中断。 因此会对它进行处理。 这个会自动清除。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在运行该代码时没有看到 COUNTER_A0递增。 [我通过 TB2添加了一个时钟发生器、并将其插入到了 P1.2。] 我不知道在不设置 TA0CCTL0:CCIE 的情况下会怎么发生这种情况。

    我确实看到 COUNTER_A1失控。 这可以通过(正如您所做的那样)读取 TA0IV 来解决、知道结果将是什么、 或者通过以下方式来解决:

    > TA0CTL 并且=~TAIFG;//清除溢出 IFG

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您花时间进行测试、回复并提供替代选项。