lypjiji 2021-06-01 19:45 采纳率: 0%
浏览 311

关于stm32f429串口4使用DMA方式发送

本人菜鸟,试了很多次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);
}

  • 写回答

2条回答 默认 最新

  • lypjiji 2021-06-01 19:51
    关注

    由于是在原来项目里将串口4改DMA的,用的是HAL库,如果使用STM32CubeMX生成的代码,现在还理不清整个数据发送过程各个函数的执行顺序,所以没法将STM32CubeMX生成的代码拷贝过来用,只能自己仿着写,仿着写又不知道哪些函数是必须用的,比如第三个函数DMA1_Stream4_IRQHandler有没有必须写,STM32CubeMX代码是没有的,网上很多又说要写

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器