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.

[参考译文] MSP430FR2355:CCS 没有 TIMER_B2_BASE 的宏值

Guru**** 2487425 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1226292/msp430fr2355-ccs-has-no-macro-value-for-timer_b2_base

器件型号:MSP430FR2355

我有两个计时器工作正常。 初始化 B1计时器的代码为:

/* Configure TimerB1 to generate 100 Hz Clock */
void jiffyClockInitTimerB1(void){
    Timer_B_initUpModeParam param = {0};
    param.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
    param.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_48;       // 16uS / 62.5 KHz
    param.timerPeriod = 624;             //625 ticks = 10 mS / 100 Hz
    param.timerInterruptEnable_TBIE = TIMER_B_TBIE_INTERRUPT_ENABLE;
    param.captureCompareInterruptEnable_CCR0_CCIE = TIMER_B_CCIE_CCR0_INTERRUPT_ENABLE;
    param.startTimer = true;
    Timer_B_initUpMode(TIMER_B1_BASE, &param);
    HWREG16(TIMER_B1_BASE + OFS_TBxCTL) &= ~(TBIE);     // Turn off overflow (goes to zero) IRQ
}

这种编译和工作正常。 现在我要使用 B2计时器、让此代码使其运行:

void sineWaveInitTimerB2(void){
    Timer_B_initUpModeParam param = {0};
    param.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
    param.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_12;       // SMCLK at 3 MHz  4uS / 250.5 KHz
    param.timerPeriod = 71;             // 284uS --> 3.52 KHz  / 8  =440 Hz
    param.timerInterruptEnable_TBIE = TIMER_B_TBIE_INTERRUPT_ENABLE;
    param.captureCompareInterruptEnable_CCR0_CCIE = TIMER_B_CCIE_CCR0_INTERRUPT_ENABLE;
    param.startTimer = true;
    Timer_B_initUpMode(TIMER_B2_BASE, &param);
    HWREG16(TIMER_B2_BASE + OFS_TBxCTL) &= ~(TBIE);     // Turn off overflow (goes to zero) IRQ
}

 当我尝试编译这个代码时、我收到一个未定义 TIMER_B2_BASE 的错误。

我在顶部添加了这个宏、源文件:

#define TIMER_B2_BASE (*(volatile uint16_t *)((uint16_t) 0x0400 +(0x0000)))

现在编译、但是看不到计时器运行(我看不到 IRQ)。

有什么想法为什么有有效的宏用于 timer_B0_BASE 和 timer_B1_base 而不是  timer_B2_base ?

FWiw、这个中断处理程序是一个用于定时器1的中断处理程序副本。 它看起来像:

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER2_B0_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(TIMER2_B0_VECTOR)))
#endif
void TIMER0_B2_ISR(void){
    // to DEBUG, pulse the P2.2 bit so we can see when we take timer interrupts and see how long it takes
 GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN3);

    // Important safety tip: the CCIFG interrupt flag is automatically reset when the TBxCCR0 IRQ is serviced
 //    Timer_B_clearTimerInterrupt(TIMER_B0_BASE);
     HWREG16(TIMER_B2_BASE + OFS_TBxCCTL0) &= ~(CCIFG | COV);        // COV is a safety
     HWREG16(TIMER_B2_BASE + OFS_TBxCTL) &= ~TBIFG;        // "counter went to zero" interrupt flag, saf

 GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN3);        // exit timer irq DEBUG
}

请注意、使用编译没有问题

#pragma vector=TIMER2_B0_vector

语句。

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

    根据我的 msp430fr2355.h 副本、规范名称为 tb2_base、而不是 timer_b2_base:

    >= define __MSP430_BASEADDRESS_TB2__ 0x0400
    >/define TB2_base _MSP430_BASEADDRESS_TB2__

    Timer_B[0/1]_BASE 是在 legace.h 中定义的、我想当 MSP430中包含两个以上的 TimerB-s 时、该值被忽略了

    通过右键点击 timer_B1_base (在代码中)、然后点击"转到定义"、您可以看到这是怎么工作的。

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

      更改为 TB2_base 完成了、我可以看到计时器中断。

     当我 在现有代码中右键单击 timer_B1_base 时、没有看到"Go to Definition"选项、但没关系。

     对.h 文件中的核心条目进行更改始终是一个挑战。 也许 TI 可以在 legace.h 中为下一个用户添加条目。

     要加快处理海量包含文件、宏、"ROM 中的代码"和寄存器名称、需要花费大量时间、尤其是当 CCS 中竭尽全力让您在处理器之间移动并且需要进行较少的代码重写时。 很值得一来、在这种可以跳转至不同芯片变量的能力与缓慢建立我自己的库之间、我在5个不同的项目和3个不同的封装中使用了 MPS430FRxxxx 系列的4个变体。

    这解决了我的问题,谢谢你的答复。 我现在返回到我的正常计划调试程序已经在进行中!