|
本帖最后由 zouleinb 于 2023-5-5 17:49 编辑
工程用的是实例代码里的uart dma发送和接受。工程希望读到5个字符以后写11个字符出去,结果第一次收到5个字符可以正常发11个字符出去,但第二次收到4个字符就发了11个字符。原因猜测是不是读写在同一片缓冲区,发送以后的最后一个字节,都会被读到。希望我读的数据都是串口工具发出来的
uart代码
#include "main.h"
#include "uart0_DMArx.h"
uint8_t DMARxData[5];
void Uart0DMA_Config(uint8_t *buffer, uint32_t length)
{
FL_DMA_ConfigTypeDef DMA_ConfigStruct = {0};
DMA_ConfigStruct.memoryAddress = (uint32_t)buffer;
DMA_ConfigStruct.transmissionCount = length - 1;
FL_DMA_StartTransmission(DMA, &DMA_ConfigStruct, FL_DMA_CHANNEL_1);
}
void Uart0DMA_ConfigTX(uint8_t *buffer, uint32_t length)
{
FL_DMA_ConfigTypeDef DMA_ConfigStruct = {0};
DMA_ConfigStruct.memoryAddress = (uint32_t)buffer;
DMA_ConfigStruct.transmissionCount = length - 1;
FL_DMA_StartTransmission(DMA, &DMA_ConfigStruct, FL_DMA_CHANNEL_2);
}
void TestDMA_Uart0(void)
{
FL_DMA_Enable(DMA);
Uart0DMA_Config(DMARxData, 5);
FL_UART_EnableRX(UART0);
while(!FL_DMA_IsActiveFlag_TransferComplete(DMA, FL_DMA_CHANNEL_1));
FL_DMA_ClearFlag_TransferComplete(DMA, FL_DMA_CHANNEL_1);
TestDMA_Uart0TX();
}
void TestDMA_Uart0TX(void)
{
uint8_t TestTxData[11] = "TestUart-TX";
volatile uint8_t tmp08;
FL_DMA_Enable(DMA);
Uart0DMA_ConfigTX(TestTxData, 11);
FL_UART_EnableTX(UART0);
// 等待最后一字节数据发送完成
while(FL_UART_IsActiveFlag_TXShiftBuffEmpty(UART0) == FL_RESET) {};
FL_UART_ClearFlag_TXShiftBuffEmpty(UART0);
}
main 函数
int main(void)
{
/* Reset of all peripherals, Initializes the Flash inte**ce and the Systick. */
/* SHOULD BE KEPT!!! */
MF_Clock_Init();
/* Configure the system clock */
/* SHOULD BE KEPT!!! */
MF_SystemClock_Config();
/* Initialize FL Driver Library */
/* SHOULD BE KEPT!!! */
FL_Init();
/* Initialize all configured peripherals */
/* SHOULD BE KEPT!!! */
MF_Config_Init();
// TestDMA_Uart0TX();
while(1)
{
TestDMA_Uart0();
}
}
实验现象
这个是工程效果,用debug调试发现第二次数值中第一个元素是X,其他4个元素是b,期望有什么方法让5个元素都是b
|
-
|