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.

[参考译文] MSP430FR2475:定时器中断不工作

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1167422/msp430fr2475-timer-interrupt-not-working

器件型号:MSP430FR2475

大家好、

我正在处理 Lora 项目、我的要求是发送数据后、如果 TX 未完成、 我希望等待达到超时。 为此、在发送我称为计时器的数据后、我在 while 循环中等待、以检查是否执行了计时器中断。  即使我选中 TAR 寄存器、也会被填充并正常工作。   在 TCCR0 定时器溢出中断后、中断不起作用。 下面是我的示例代码

定时器代码:

void timer_init (void)

TA1CCR0 = 0;//最初、停止计时器
TA1CCTL0 |= CCIE;//为 CCR0启用中断。
TA1CTL = tassel_2 + ID_0 + MC_1;//选择 SMCLK、SMCLK/1、向上计数模式

#pragma vector = Timer1_A0_vector
_interrupt void Timer_A (void)

OFCount++;
if (OFCount >= 200)

sx1262.rf_Reach 超时= 1;
OFCount = 0;

TX 代码:

void Tx_Start (uint8_t * txbuf、uint8_t PAYLOAD_LENGTH)

SetStandby (1);//0:STDBY_RC;1:STDBY_XOSC
SetBufferBaseAddress (0、0);//(TX_BASE_addr、RX_BASE_addr)
WriteBuffer (0、txbuf、PAYLOAD_LENGTH);//(offset、* data、length)
SetPacketParams (PAYLOAD_LENGTH);//PreambleLength;HeaderType;PayloadLength;CRCType;InvertIQ
SetDioIrqParams (TxDone_IRQ);//TxDone IRQ

//定义同步字值
SetTx (0);//timeout = 0
Sx1262_Flag.is _TX = 1;//启动标识和启动指示器
timer_init();
TA1CCR0 = 1000-1;
Sx1262_Flag.RF_TIMEOUT = 0;
Sx1262_Flag.RF_REACH 超时= 0;//清除发送超时标志
//等待 IRQ TxDone 或超时
while (!rf_IRQ ())


if (Sx1262_Flag.RF_REACH 超时)//在发送超时时时时复位模块

UART_WRITE ("RF 超时...\n");
ClearIrqStatus (TxDone_IRQ);//清除 IRQ TxDone 标志
SetStandby (1);//0:STDBY_RC;1:STDBY_XOSC
RESET_sx1262 ();//重置射频
sx1262_Config();
中断;

Sx1262_Flag.IRQ_Status = GetIrqStatus();
if (TxDone_IRQ&Sx1262_Flag.IRQ_Status) break;  

Sx1262_Flag.IRQ_Status = GetIrqStatus();
ClearIrqStatus (TxDone_IRQ);//清除 IRQ TxDone 标志

请提出建议。

提前感谢。

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

    尊敬的 Vinod Kumar:

    我建议不要在计时器初始化中将 TA1CCR 设置为0、而是将其设置为999值、然后在配置计时器时、可以使用 TACLR 掩码清除计时器。 您可以在 TimerA ISR 内部放置一个断点、以查看是否曾到达该断点。

     有关示例、请参阅 msp430fr267x_TA0_16.c。

    此致、

    Luke

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

    您好、Luke、

    感谢您的快速响应。

    正如您所建议的、我对代码进行了更改、但计时器中断仍然没有执行。  

    我的简单要求是、根据计时器中断标志、我希望在 while 循环期间中断。

    当前问题是在执行循环时、计时器中断不起作用。

    请建议。

    此致、

    Vinod

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

    尊敬的 Vinod:

    我假设您已经在计时器 ISR 中放入了断点、但您没有到达该断点。 我确实会在您的代码中看到这个 sx1262.rf_Reach 超时和一个 Sx1262_Flag.rf_timeout。 尽管它们看起来相似、但我猜背景中有一些东西会改变该变量、以将它们设置为彼此相等。 我还希望它们是全球性的,以防止出现任何范围问题。  

    您能否在 TimerInit()之后放置一个断点并在寄存器视图中检查 TimerA 寄存器? 我想验证所有寄存器是否都更新了适当的值、以及 TA1CCR0是否正确设置为999。 可能会发生的情况是、当 TA1CCR0的值最初设置为0时、它会导致计数冲突、因为没有要计数的内容、并且中断永远不会触发、因为该值永远不会被复位。

    此致、

    Luke