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.

MSP430FR5994: 关于DMA实现UART通信。

Part Number: MSP430FR5994

我根据官方例程更改了一些配置想实现基于MSP430FR5994的UART发送数据,却发现串口助手接受皆为乱码。

以下为我更改后的代码。

#include "driverlib.h"

static char String1[] = { "Hello World\r\n" };

void main (void)
{
    //Stop Watchdog Timer
    WDT_A_hold(WDT_A_BASE);
    GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
    GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);
    PMM_unlockLPM5();
    //P3.4 = USCI_A0 TXD
    GPIO_setAsPeripheralModuleFunctionInputPin(
    GPIO_PORT_P2,
    GPIO_PIN0,
    GPIO_TERNARY_MODULE_FUNCTION
    );
    EUSCI_A_UART_initParam param = {0};
    param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
    param.clockPrescalar = 6;
    param.firstModReg = 13;
    param.secondModReg = 14;
    param.parity = EUSCI_A_UART_NO_PARITY;
    param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
    param.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;
    param.uartMode = EUSCI_A_UART_MODE;
    param.overSampling = EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;

    if (STATUS_FAIL == EUSCI_A_UART_init(EUSCI_A0_BASE, &param)) {
            return;
        }

    //Enable UART module for operation
    EUSCI_A_UART_enable(EUSCI_A0_BASE);


    //Initialize and Setup DMA Channel 0
    /*
     * Configure DMA channel 0
     * Configure channel for repeated single transfers
     * DMA interrupt flag will be set after every 12 transfers
     * Use DMA Trigger Source 1 (TA0CCR0IFG)
     * Transfer Byte-to-byte
     * Trigger Upon Rising Edge of Trigger Source Signal
     */
    DMA_initParam param1 = {0};
    param1.channelSelect = DMA_CHANNEL_0;
    param1.transferModeSelect = DMA_TRANSFER_REPEATED_SINGLE;
    param1.transferSize = (sizeof String1 - 1);
    param1.triggerSourceSelect = DMA_TRIGGERSOURCE_1;
    param1.transferUnitSelect = DMA_SIZE_SRCBYTE_DSTBYTE;
    param1.triggerTypeSelect = DMA_TRIGGER_RISINGEDGE;
    DMA_init(&param1);


    /*
     * Configure DMA channel 0
     * Use String1 as source
     * Increment source address after every transfer
     */
    DMA_setSrcAddress(DMA_CHANNEL_0,
        (uint32_t)(uintptr_t)String1,
        DMA_DIRECTION_INCREMENT);
    /*
     * Base Address of the DMA Module
     * Configure DMA channel 0
     * Use UART TX Buffer as destination
     * Don't move the destination address after every transfer
     */
    DMA_setDstAddress(DMA_CHANNEL_0,
        EUSCI_A_UART_getTransmitBufferAddress(EUSCI_A0_BASE),
        DMA_DIRECTION_UNCHANGED);

    //Enable transfers on DMA channel 0
    DMA_enableTransfers(DMA_CHANNEL_0);

    //For DMA0 trigger
    Timer_A_initCompareModeParam initCompareModeParam = {0};
    initCompareModeParam.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;
    initCompareModeParam.compareInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
    initCompareModeParam.compareOutputMode = TIMER_A_OUTPUTMODE_OUTBITVALUE;
    initCompareModeParam.compareValue = 1;
    Timer_A_initCompareMode(TIMER_A0_BASE, &initCompareModeParam);

    //Timer sourced by SMCLK, starts in up-mode
    Timer_A_initUpModeParam initUpModeParam = {0};
    initUpModeParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    initUpModeParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
    initUpModeParam.timerPeriod = 0x8192;
    initUpModeParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    initUpModeParam.captureCompareInterruptEnable_CCR0_CCIE =
        TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
    initUpModeParam.timerClear = TIMER_A_SKIP_CLEAR;
    initUpModeParam.startTimer = true;
    Timer_A_initUpMode(TIMER_A0_BASE, &initUpModeParam);
    EUSCI_A_UART_transmitData(EUSCI_A0_BASE,
                                   UCA0TXBUF);

//    //Enter LPM3
//    _BIS_SR(LPM3_bits);
    __delay_cycles(500000);
    GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
}