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.
工具/软件:Code Composer Studio
大家好、我想使用 DMA 在 UART 上传输数据。 我在下面的论坛中找到了这段代码、但它对我不起作用它填充了我的两个缓冲区、但它不会在串行和乒乓格式传输数据、您能帮我吗?
源代码: LINK_UART_DMA。
代码:
#include "rom_map.h" #include "driverlib.h" #include #include #include "msp.h" #include #include #define zCHAN_DMA_UART_TX DMA_CHANGE_0 //********* // DMA 控制表 //********* #ifdef ewarm #pragma DATA_alignment=1024 #else #pragma DATA_ALIGN (controlTable、1024) #endif uint8_t controlTable[1024]; //********* // UART 参数 //********* #define zUART_BAUD_RATE 9600 /* UART 配置参数。 'zUART_BAUD_RATE '波特率。 *射频。 TI 在线计算器、网址 为:* "="">software-dl.ti.com/.../a> */ const eUSCI_UART_Config uartConfig = { EUSCI_A_UART_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 78、 // BRDIV = 78 2、 // UCxBRF = 2 0、 // UCxBRS = 0 EUSCI_A_UART_NO_奇 偶校验、 //无奇偶校验 EUSCI_A_UART_LSB_FIRST、 // LSB 优先 EUSCI_A_UART_One_stop_bit、 //一个停止位 EUSCI_A_UART_MODE、 // UART 模式 EUSCI_A_UART_oversampling_BAUDRATE_generation //无过采样 }; //********* //乒乓数据缓冲 器//********* #define Size_buff _a_TX 16 #define Size_b_TX 16 static uint8_t zUI8_buff _a_TX[size_buff _a_TX]; static uint8_t zUI8_buff B_TX[size_b_TX]; //********* //功能 //********* void ConfigSysClk (void) { /*为 DCO 频率计算启用 FPU */ map_fpu_enableModule(); /*将 DCO 设置为48MHz (升级 Vcore)*/ MAP_PCM_setCoreVoltageLevel (PCM_VCORE1); MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 12); /*等待模块初始化*/ uint32_t indConfgClk; 对于(indConfgClk = 0;indConfgClk < 1000;indConfgClk++); } void ConfigLED_Pins (void) { /* LED1:红色*/ MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0); /* LED RGB:P2.0:红色、P2.1:绿色、P2.2:蓝色*/ MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN0); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0); MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN1); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1); MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN2); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN2); } void ConfigUart (void) { /*在 UART 模式下选择 P1.2和 P1.3 */ MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、 GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION); /*配置 UART 模块*/ MAP_UART_initModule (EUSCI_A0_BASE、uartConfig); /*启用 UART 模块*/ MAP_UART_enableModule (EUSCI_A0_BASE); MAP_Interrupt_enableInterrupt (INT_EUSCIA0); } void ConfigDma4Uart (void) { /*配置 DMA 模块*/ map_dma_enableModule(); MAP_DMA_setControlBase (controlTable); /*将通道0分配给 EUSCIA0TX*/ MAP_DMA_赋 值通道(DMA_CH0_EUSCIA0TX); /*禁用将不在基本 DMA 模式中使用的备用 DMA 通道的通道属性*/ MAP_DMA_disableChannelAttribute (DMA_CH0_EUSCIA0TX、 UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR | UDMA_ATTR_REQMASK); /*设置控制参数:主要和次要通道*/ MAP_DMA_setChannelControl (DMA_CH0_EUSCIA0TX | UDMA_PRI_SELECT、 UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1); MAP_DMA_setChannelControl (DMA_CH0_EUSCIA0TX | UDMA_ALT_SELECT、 UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1); /*设置信道传输:主信道和次信道*/ MAP_DMA_setChannelTransfer (DMA_CH0_EUSCIA0TX | UDMA_PRI_SELECT、 UDMA_MODE_Pingpong、zUI8_buff _a_TX、 (void*) MAP_UART_getTransmitBufferAddressForDMA (EUSCI_A0_BASE)、 size_buff _a_tx); MAP_DMA_setChannelTransfer (DMA_CH0_EUSCIA0TX | UDMA_ALT_SELECT、 UDMA_MODE_Pingpong、zUI8_buff _B_TX、 (void*) MAP_UART_getTransmitBufferAddressForDMA (EUSCI_A0_BASE)、 size_buff _B_TX); /*分配中断*/ MAP_DMA_赋 值中断(DMA_INT1、zCHAN_DMA_UART_TX); /*清除中断*/ MAP_DMA_clearInterruptFlag (zCHAN_DMA_UART_TX); /*启用 DMA 通道*/ MAP_DMA_enableChannel (zCHAN_DMA_UART_TX); /*为 DMA 通道启用中断*/ /*在 TIM-TI 中,我们需要在启用 DMA 通道后启用中断 *确保我们不会陷入"死锁"状态*/ MAP_DMA_enableInterrupt (DMA_INT1); } //********* //'DAM_INT1'的 ISR 例程 //********* void dma_UART_TX_IntHndlr (void) { uint32_t ui32模式; MAP_DMA_clearInterruptFlag (0); //检查乒乓"A"传输是否完成。 ui32Mode = MAP_DMA_getChannelMode (DMA_CH0_EUSCIA0TX | UDMA_PRI_SELECT); if (ui32Mode = uDMA_MODE_STOP) { MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P2、GPIO_PIN2); MAP_DMA_setChannelTransfer (DMA_CH0_EUSCIA0TX | UDMA_PRI_SELECT、 UDMA_MODE_Pingpong、zUI8_buff _a_TX、 (void*) map_UART_getTransmitBufferAddressForDMA ( EUSCI_A0_BASE)、SIZE 缓冲区_A_TX); } //检查乒乓"B"传输是否完成。 ui32Mode = MAP_DMA_getChannelMode (DMA_CH0_EUSCIA0TX | UDMA_ALT_SELECT); if (ui32Mode = uDMA_MODE_STOP) { MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P2、GPIO_PIN1); MAP_DMA_setChannelTransfer (DMA_CH0_EUSCIA0TX | UDMA_ALT_SELECT、 UDMA_MODE_Pingpong、zUI8_buff _B_TX、 (void*) map_UART_getTransmitBufferAddressForDMA ( EUSCI_A0_BASE)、SIZE 缓冲区_B_TX); } } //********* //针对 DMA 错误的 ISR (DMA_ERR ISR) //********* void uDMAErrorHandler (void) { uint32_t ui32Status; //检查 uDMA 错误位 ui32Status = map_dma_getErrorStatus(); //如果存在 uDMA 错误,则清除错误并递增错误计数器 IF (ui32Status) { map_dma_clearErrorStatus(); //切换 LED 以指示 DMA 错误 MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0); } } int main (void) { /*停止 WDT */ MAP_WDT_A_HOLDTimer(); /*初始化缓冲区*/ memset (zUI8_buff _a_TX、'A'、size_buff _a_TX); memset (zUI8_buff _B_TX、"B"、size_buff _B_TX); /*Config Sys Clk*/ ConfigSysClk(); /*配置 LED */ ConfigLED_Pins (); /*配置 UART */ ConfigUart(); /*配置 DMA */ ConfigDma4Uart(); /*配置 LPM */ MAP_PCM_gotoLPM0 (); }