本人菜鸟,试了很多次DMA的收发都未成功,发送相对简单点,贴出发送部分的代码,哪位大神帮分析一下,问题出在哪一步,在此谢过了
在确认串口4使用普通的方式可以正常发送的前提下,改用DMA方式发送(F429串口4的发送用的是DMA1数据流4的第4通道)。
第一步,自己添加了下面的三个函数
第二步,在串口4初始化完成并配置完引脚的地方,调用配置DMA的函数MYDMA_Config(uart4DMATxHandle, uart4Handle, DMA1_Stream4, DMA_CHANNEL_4);
第三步,就想调用_BSP_UARTxTransmit(gSendBuffer, 10),将数据发送出去,但失败了,下面的发送完成中断函数DMA1_Stream4_IRQHandler是始终未被调用
UART_HandleTypeDef uart4Handle;//原来定义有的
//--------------自己写的三个函数--------------------------
u8 gSendBuffer[10]={0x10,0x20,0x30,0x40,0x50,0,0,0,0,0};
DMA_HandleTypeDef uart4DMATxHandle;
//--------------自己添加的三个函数--------------------------
//配置DMA函数
void MYDMA_Config(DMA_HandleTypeDef dmaHandler, UART_HandleTypeDef *uartHandler, DMA_Stream_TypeDef *DMA_Streamx, u32 chx)
{
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
//Tx DMA配置
dmaHandler.Instance=DMA_Streamx; //数据流选择
dmaHandler.Init.Channel=chx; //通道选择
dmaHandler.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设
dmaHandler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
dmaHandler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
dmaHandler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
dmaHandler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
dmaHandler.Init.Mode=DMA_NORMAL; //外设普通模式
dmaHandler.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
dmaHandler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
dmaHandler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
dmaHandler.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
dmaHandler.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
HAL_DMA_DeInit(&dmaHandler);
HAL_DMA_Init(&dmaHandler);
__HAL_LINKDMA(uartHandler,hdmatx,dmaHandler); //将DMA与UART4联系起来(发送DMA)
}
//使用DMA发送数据
void _BSP_UARTxTransmit(uint8_t *pData, uint16_t Size) //传输的数据量
{
//开启DMA传输
HAL_DMA_Start(uart4Handle.hdmatx, (uint32_t)pData, (uint32_t)&uart4Handle.Instance->DR, Size);
//使能串口DMA发送,没有对应的函数只能直接使用寄存器
uart4Handle.Instance->CR3 |= USART_CR3_DMAT;
}
//DMA发送中断处理
void DMA1_Stream4_IRQHandler(void)
{
//DMA1_Steam4传输完成
if(__HAL_DMA_GET_FLAG(&uart4DMATxHandle, DMA_FLAG_TCIF3_7))
{
//清除DMA1_Steam4传输完成标志
__HAL_DMA_CLEAR_FLAG(&uart4DMATxHandle, DMA_FLAG_TCIF3_7);
//传输完成以后关闭串口DMA
HAL_UART_DMAStop(&uart4Handle);
}
//调用中断处理公共函数
HAL_DMA_IRQHandler(uart4Handle.hdmatx);
}