主题中讨论的其他器件:MSPM0G3106、
工具与软件:
你(们)好
我将 MSPM0G3106/MSPM0G3507用于以以下配置运行的 UART DMA 通信。
波特率- 2mbps
CPU 时钟- 80MHz
MCLK - 80MHz
ULPCLK - 40MHz (根据 TRM 可能达到的最大值)
所使用的 UART0 (电源域0)、指40MHz (最大值) 的 ULPCLK 作为其运行的 BUSCLK。 DMA 用于 RX 和 TX 、触发条件设置为向/从 RX/TX FIFO 传输。 DMA (电源域1)。
问题说明:
我们是一个运行时间为1ms 的 TX 任务,它一次最多创建130字节的数据包,这将成为 DMA 推送到 UART TX FIFO 的源缓冲区。 在启用内部环回的情况下、我们观察到传输的数据包中缺少随机的1或2个字节。 我们已验证数据包结构、直到为 UART DMA 事务指定了缓冲区、因此问题必须由 UART/DMA 层本身引起。
观察结果:
1、相同的代码将 MCLK 和 CPU 时钟设置为40MHz ,同时 ULPCLK 也设置为40MHz ,似乎不会造成问题。
2.在 launchpad 上, 与使用 UART3 (PD1)代替 UART0(PD0)进行的测试相同,该测试使用 MCLK 80MHz 进行 UART3 (PD1)-此设置也会处理字节的缺失问题。
对于使用 UART0 DMA 与 ULPCLK -40MHz、MCLK -80MHz、CPU 时钟-80MHz 以获得稳定性、是否有任何建议?
请查找发现问题时使用的配置的代码片段 :
时钟配置(SYS PLL):
static const DL_SYSCTL_SYSPLLConfig gSYSPLLConfig = { .inputFreq = DL_SYSCTL_SYSPLL_INPUT_FREQ_16_32_MHZ, .rDivClk2x = 0, .rDivClk1 = 0, .rDivClk0 = 0, .enableCLK2x = DL_SYSCTL_SYSPLL_CLK2X_DISABLE, .enableCLK1 = DL_SYSCTL_SYSPLL_CLK1_ENABLE, .enableCLK0 = DL_SYSCTL_SYSPLL_CLK0_ENABLE, .sysPLLMCLK = DL_SYSCTL_SYSPLL_MCLK_CLK0, .sysPLLRef = DL_SYSCTL_SYSPLL_REF_SYSOSC, .qDiv = 9, .pDiv = DL_SYSCTL_SYSPLL_PDIV_2 }; DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_BASE); DL_SYSCTL_configSYSPLL((DL_SYSCTL_SYSPLLConfig *) &gSYSPLLConfig); DL_SYSCTL_setMCLKSource(SYSOSC, HSCLK, DL_SYSCTL_HSCLK_SOURCE_SYSPLL); DL_SYSCTL_setULPCLKDivider(DL_SYSCTL_ULPCLK_DIV_2); //Low Power Mode is configured to be SLEEP0 DL_SYSCTL_setBORThreshold(DL_SYSCTL_BOR_THRESHOLD_LEVEL_0); DL_SYSCTL_setFlashWaitState(DL_SYSCTL_FLASH_WAIT_STATE_2);
UART0和 DMA 配置:
DL_UART_Main_setOversampling(UART_INST, DL_UART_OVERSAMPLING_RATE_16X); DL_UART_Main_setBaudRateDivisor(UART_INST, UART_IBRD_40_MHZ_2000000_BAUD, UART_FBRD_40_MHZ_2000000_BAUD); DL_UART_Main_enableDMAReceiveEvent(UART_INST, DL_UART_DMA_INTERRUPT_RX); DL_UART_Main_enableDMATransmitEvent(UART_INST); /* Configure FIFOs */ DL_UART_Main_enableFIFOs(UART_INST); DL_UART_Main_setRXFIFOThreshold(UART_INST, DL_UART_RX_FIFO_LEVEL_ONE_ENTRY); DL_UART_Main_setTXFIFOThreshold(UART_INST, DL_UART_TX_FIFO_LEVEL_ONE_ENTRY); /* Configuration for UART 0 Peripheral */ static const DL_UART_Main_ClockConfig gUART_ClockConfig = { .clockSel = DL_UART_MAIN_CLOCK_BUSCLK, .divideRatio = DL_UART_MAIN_CLOCK_DIVIDE_RATIO_1 }; static const DL_UART_Main_Config gUART_Config = { .mode = DL_UART_MAIN_MODE_NORMAL, .direction = DL_UART_MAIN_DIRECTION_TX_RX, .flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE, .parity = DL_UART_MAIN_PARITY_NONE, .wordLength = DL_UART_MAIN_WORD_LENGTH_8_BITS, .stopBits = DL_UART_MAIN_STOP_BITS_ONE }; /*configuration for DMA TX channel - Channel 1*/ static const DL_DMA_Config gDMA_CH1Config = { .transferMode = DL_DMA_SINGLE_TRANSFER_MODE, .extendedMode = DL_DMA_NORMAL_MODE, .destIncrement = DL_DMA_ADDR_UNCHANGED, .srcIncrement = DL_DMA_ADDR_INCREMENT, .destWidth = DL_DMA_WIDTH_BYTE, .srcWidth = DL_DMA_WIDTH_BYTE, .trigger = UART_INST_DMA_TRIGGER_1, .triggerType = DL_DMA_TRIGGER_TYPE_EXTERNAL, }; /*configuration for DMA RX channel - Channel 0*/ static const DL_DMA_Config gDMA_CH0Config = { .transferMode = DL_DMA_FULL_CH_REPEAT_SINGLE_TRANSFER_MODE, .extendedMode = DL_DMA_NORMAL_MODE, .destIncrement = DL_DMA_ADDR_INCREMENT, .srcIncrement = DL_DMA_ADDR_UNCHANGED, .destWidth = DL_DMA_WIDTH_BYTE, .srcWidth = DL_DMA_WIDTH_BYTE, .trigger = UART_INST_DMA_TRIGGER_0, .triggerType = DL_DMA_TRIGGER_TYPE_EXTERNAL, };