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.

[参考译文] MSP430FR6989:共享矢量 ISR

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/889601/msp430fr6989-shared-vector-isr

器件型号:MSP430FR6989

我正在尝试实现以下目标:

当 TAR 回零事件发生时、我想让 LED 闪烁;当通道1的比较事件发生时、我也想让红色 LED 闪烁。

通道1和 TAR 共用同一个矢量定时器_A1_vector、因此我们只需要一个 ISR。 此陈述是否正确?

我的实施:

#include 
#define redLED BIT0 //在 P1.0处为红色
#define greenLED BIT7 //在 P9.7

处为绿色(void)
{
WDTCTL = WDTPW | WDTHOLD;//停止 WDT
PM5CTL0 &=~LOCKLPM5;//启用 GPIO 引脚
P1DIR |= redLED;
P9DIR |=绿色 LED;
P1OUT &=~Ω reddLED;
P9OUT &=~绿色 LED;

TA0CCR1 =(12000-1);
TA0CCTL1 &=~CCIFG;
TA0CCTL1 |= CCIE;

TA0CTL = tassel_1 | ID_0 | MC_2 | TACLR;

while (1){}

返回0;
}

#pragma vector = TIMER0_A1_vector
__interrupt void T0A1_ISR ()
{
if ((TA0CTL & TAIFG)!= 0){
P1OUT ^=绿色 LED;
TA0CTL &=~TAIFG;
}

if ((TA0CCTL1 & CCIFG)!= 0){
P1OUT ^=红色 LED;
TA0CCR1 += 12000;
TA0CCTL1 &=~CCIFG;
}
}

//将 ACLK 配置为32KHz 晶振
void CONFIG_ACLK_TO_32KHz 晶振(){

//默认情况下、ACLK 在5MHz/128 = 39KHz 的 LFMODCLK 上运行
//将引脚重新路由至 LFXIN/LFXOUT 功能
PJSEL1 &=~BIT4;
PJSEL0 |= BIT4;
//等待振荡器故障标志保持清零
CSCTL0 = CSKEY;//解锁 CS 寄存器

执行{

CSCTL5 &=~LFXTOFFG;//本地故障标志
SFRIFG1 &=~OFIFG;//全局故障标志

} while ((CSCTL5 & LFXTOFFG)!= 0);

CSCTL0_H = 0;//锁定 CS 寄存
器返回;
}

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

    是的。

    "A0"矢量仅用于 CCR0。 您不需要检查(实际上您不能检查)也不需要清除。

    "A1"向量用于所有其他向量。 您需要像完成的那样进行检查和清除。

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

    因此、我不确定我理解您的意思。  

    如果寄存器 TAxCCTL1与寄存器 TACTL 共用向量 A1。 我只需要一个中断服务例程、但是、我必须检查这两个寄存器的标志位以查看其中一个是否被触发。 这就是我们在这里要实现的目标。 尽管这对我来说很有意义、但它会编译! 仍然没有响应。 为什么会这样呢?

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

    1) 1)您需要全局启用中断。 将其添加到 while ()循环之前:

    >_enable_interrupt (); // GIE=1

    2) 2)拼写错误警报:

    >        P1OUT ^= greenLED;

    Try: 

    >        P9OUT ^= greenLED;

     

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

    啊! 我当时过度思考这个问题。 这是我没有重复检查代码的错误。

    很不错! 谢谢 Bruce。  

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

    您好!

    请告诉我、

    您如何使用 Aclk?

     您已使用了 Aclk 的函数,

    但我在 Main()中找不到该函数的用途?

    以及如何在主函数中调用中断?

    如上所述、请使用 GIE。