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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1163839/msp430fr2475-timer-based-delay-library

器件型号:MSP430FR2475

您好;

我的软件在一段时间后以8MHz 频率出现了频率变化、但在16MHz 频率下无法正常工作。 我怀疑计时器模块、UART 配置和主时钟配置;

如果我在库中犯了任何错误、您能检查一下并发表评论吗?

时钟配置

void initClockTo8MHz()
{
    __bis_SR_register(SCG0); // disable FLL
    // CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source
    CSCTL0 = 0;             // clear DCO and MOD registers
    CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first

    CSCTL1 |= DCORSEL_3; // Set DCO = 8MHz
    CSCTL2 = FLLD_0 + 243;

    __delay_cycles(3);
    __bic_SR_register(SCG0); // enable FLL
    while (CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1))
        ; // FLL Lock
}

void initClockTo16MHz()
{
    // Configure one FRAM waitstate as required by the device datasheet for MCLK
    // operation beyond 8MHz _before_ configuring the clock system.
    FRCTL0 = FRCTLPW | NWAITS_1;

    // Clock System Setup
    __bis_SR_register(SCG0);   // disable FLL
    CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source
    CSCTL0 = 0;                // clear DCO and MOD registers
    CSCTL1 &= ~(DCORSEL_7);    // Clear DCO frequency select bits first
    CSCTL1 |= DCORSEL_5;       // Set DCO = 16MHz
    CSCTL2 = FLLD_0 + 487;     // DCOCLKDIV = 16MHz
    __delay_cycles(3);
    __bic_SR_register(SCG0); // enable FLL
    while (CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1))
        ; // FLL locked
}

UART 配置

     * This is for 115200 Baud rate (8Mhz)
     */

    UCA1BRW = 4;
    UCA1MCTLW |= 0x0500;
    UCA1MCTLW |= UCBRF_3;
    UCA1MCTLW |= UCOS16_1;
    UCA1CTLW0 &= ~UCSWRST;
    UCA1CTLW1 = 0;
    UCA1IE |= UCRXIE;

    /*
     * This is for 115200 Baud rate (16Mhz)
     */
    /*
    UCA1BRW = 8;
    UCA1MCTLW |= 0x0000;
    UCA1MCTLW |= UCBRF_11;
    UCA1MCTLW |= UCOS16_1;
    UCA1CTLW0 &= ~UCSWRST;
    UCA1CTLW1 = 0;
    UCA1IE |= UCRXIE;
    */

计时器库

#include <msp430.h>
#include <stdint.h>
#include "TIMER_MODULE.h"
/*
 * This function will initialize the Timer module
 */
void timerInit(void)
{
    TA1CCTL0 |= CCIE;                         // TACCR0 interrupt enabled
    TA1CCR0 = 1000 - 1;                       // timer will roll over every 1000 clock cycle / pwm period
    TA1CTL |= TASSEL_2 + ID_3 + MC_1 + TACLR; // TimerA1 SMLCK(TASSEL_2), CLOCK divide by 8(ID_3) pwm start(MC_1), Reset the timer clear TAR (TACLR)
}

/*
 * This function will return the current time with resolution
 * of 10 microsecond in each ticking
 */
uint32_t timerMicros(void)
{
    return micros + TA1R;
}

/*
 * This function will return the current time with resolution
 * of 1 millisecond in each ticking
 */
uint32_t timerMillis(void)
{
    return millis;
}

/*
 * This function will return the current time with resolution
 * of 1 second in each ticking
 */
uint32_t timerSecond(void)
{
    return (millis / 1000);
}

/*
 * This function will reset all timers
 */
void timerReset(void)
{
    millis = 0;
}

/*
 * This function will reset millis
 */
void timerResetMillis(void)
{
    millis = 0;
}

/*
 * This function will reset seconds
 */
void timerResetSecond(void)
{
    second = 0;
}

/*
 * This is an ISR to handle the timer
 */
#pragma vector = TIMER1_A0_VECTOR
__interrupt void Timer_A_CCR0_ISR(void)
{
    millis++;
    micros += 1000;
}