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.

[参考译文] MSP430FR2311:捕获模式中的定时器 B0

Guru**** 2548020 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/588592/msp430fr2311-timer-b0-in-capture-mode

器件型号:MSP430FR2311

该代码在捕获模式下作为 TB0工作。

它不会进入中断服务例程。

我在 IAR 中使用断点进行了测试

#include
#define NUMBER_TIMER_CAPTURES 20.
volatile unsigned int timerBaptureValues[number_timer_capturs];
unsigned int Index = 0;
void Start_Signal ();
void read_response ();

void main (void)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 &=~LOCKLPM5;//禁用 GPIO 上电默认高阻抗模式



P2SEL1 &=~BIT1;
P2SEL0 |= BIT1;
P2DIR |= BIT1;//将数据引脚设定为输出方向
P2OUT &=~BIT1;//将输出设置为低电平
_DELAY_CYCLES (18000);//低电平持续18ms
P2DIR &=~BIT1;
P2REN |= BIT1;
TB0CTL |= TBSSEL_2 | MC_2 | TBCLR;//使用 SMCLK 作为时钟源,清除 TB0R
TB0CCTL0 |= CM_2 | CCIS_0 | CAP | SCS | CCI | CCIE;//选择输入信号
//捕获上升沿,
//使用 CCI0A=SMCLK、
//同步捕捉,
//启用捕获模式,
//启用捕捉中断
TB0CTL |= TBSSEL_2 | MC_2 | TBCLR;//使用 SMCLK 作为时钟源,清除 TB0R

_bis_SR_register (GIE);



// Timer0_B3 CCR0,TB 中断处理程序
#pragma vector = TIMER0_B0_vector
_interrupt void TIMER0_B0_ISR (void)

TB0CCTL0 &=~CCIFG;
timerBaptureValues[Index++]= TB0CCR0;

if (索引>= 20)

索引= 0;

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

    我想查看表 6-13。 数据表中的 Timer0_B3信号连接。 您正在代码中配置 T0.0、但 CCIS_0的输入是 RTC。 这是您想要的吗?  如果您想继续使用 timer0、则可能需要配置 TB0CCTL1并使用引脚 P1.6。 否则、您可以更改为使用 Timer1、然后改为设置 TB1CCTL2。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    捕获模式对我来说是新的,我已经尝试了您的建议。
    但代码仍然不会遇到 ISR。

    #include
    #define NUMBER_TIMER_CAPTURES 20.
    volatile unsigned int timerBaptureValues[number_timer_capturs];
    unsigned int Index = 0;
    void Start_Signal ();
    void read_response ();


    void main (void)

    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式



    P2SEL1 &=~BIT1;
    P2SEL0 |= BIT1;
    P2DIR |= BIT1; //将数据引脚设置为输出方向
    P2OUT &=~BIT1; //将输出设置为低电平
    _DELAY_CYCLES (18000); //低电平持续18ms
    P2DIR &=~BIT1;
    P2REN |= BIT1;
    TB1CTL |= TBSSEL_2 | MC_2 | TBCLR; //使用 SMCLK 作为时钟源,清除 TB0R
    TB1CCTL2 |= CM_2 | CCIS_CCIA | CAP | SCS | CCIE; //选择输入信号
    //捕获上升沿,
    //使用 CCI0B=ACLK、
    //同步捕捉,
    //启用捕获模式,
    //启用捕捉中断
    TB1CTL |= TBSSEL_2 | MC_2 | TBCLR; //使用 SMCLK 作为时钟源,清除 TB0R

    _bis_SR_register (GIE);






    // Timer0_B3 CCR0,TB 中断处理程序
    #pragma vector = Timer1_B0_vector
    _interrupt void Timer1_B0_ISR (void)

    TB1CCTL2 &=~CCIFG;
    timerBaptureValues[Index++]= TB1CCR1;

    if (索引>= 20)

    索引= 0;

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

    #pragma vector = Timer1_B0_vector

    这会捕获(TB1) CCR0中断(您尚未启用-并且可能不希望启用)。 尝试:

    #pragma vector = Timer1_B1_vector

    捕获"除 CCR0之外的所有其他内容"中断。 另请参见 SLASE58A 表6-2 (矢量0xFFF2)。

    --------------

    timerBaptureValues[Index++]= TB1CCR1;

    这不是您想要的 CCR。 尝试:

    timerBaptureValues[Index++]= TB1CCR2;

    --------------

    此外、"Index (索引)"应该是"volatile (易失性)";现在这不会引起问题、但最终会导致问题。