本人菜鸟,试了很多次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);
}
由于是在原来项目里将串口4改DMA的,用的是HAL库,如果使用STM32CubeMX生成的代码,现在还理不清整个数据发送过程各个函数的执行顺序,所以没法将STM32CubeMX生成的代码拷贝过来用,只能自己仿着写,仿着写又不知道哪些函数是必须用的,比如第三个函数DMA1_Stream4_IRQHandler有没有必须写,STM32CubeMX代码是没有的,网上很多又说要写
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。