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.

[参考译文] CCS/MSP432P401R:MSP 432 DMA UART 交替模式

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/598795/ccs-msp432p401r-msp-432-dma-uart-ping-pong

器件型号:MSP432P401R

工具/软件: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 ();
}

项目文件为:e2e.ti.com/.../Uart_5F00_Dma.rar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将了解一下该代码、并使用新的 SimpleLink SDK 和 CCSv7.x (这是适用于所有 MSP432项目的推荐工具集和 SDK)进行试用。 您可以同时在自己的系统上尝试此操作、以查看此操作是否有用。
    此致、
    Bob
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Bob、你有什么东西吗?