首页 > 其他分享 >串口DMA配置错误笔记 —— 已解决

串口DMA配置错误笔记 —— 已解决

时间:2024-12-31 09:25:38浏览次数:3  
标签:DMA HAL tx hdma Init 笔记 串口 usart2

一、DMA发送

        1、配置问题

        2、发送问题

二、DMA接收

        1、配置问题

        2、接收问题


一、DMA发送

1、配置问题

        使用DMA发送时需要将DMA配置成内存到寄存器搬运关闭寄存器的地址增长,如果要搬运的多个字节就需要开启内存的地址增长

    /* 串口 */
    hdma_usart2_tx.Instance = DMA1_Channel3;
    hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
    //!!! 设置成9数据位需要使用半字对齐 即每次增长2字节
    hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_usart2_tx.Init.Mode = DMA_NORMAL;
    hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
    HAL_DMA_Init(&hdma_usart2_tx);

        需要将DMA的通道连接到串口寄存器,一般来说所有DMA通道都可以连接串口寄存器,但部分芯片的DMA的部分通道可能不支持连接,需要查看用户手册。如果是HAL库,连接后还需要使用__HAL_LINKDMA将串口句柄和DMA句柄进行链接。


    HAL_DMA_ChannelMap(&hdma_usart2_tx, DMA_CHANNEL_MAP_USART2_WR);

    __HAL_LINKDMA(&huart2, hdmatx, hdma_usart2_tx);

        串口和DMA的时钟都不要忘记开启

    __HAL_RCC_USART2_CLK_ENABLE();
    __HAL_RCC_DMA1_CLK_ENABLE();

2、发送问题

        如果使用     HAL_UART_Transmit_DMA(&huart2,(uint8_t *)data,43);  进行发送需要确保发送完毕前data的内存没有被释放,DMA发送调用完后不会阻塞,如果函数结束后data的数据还没搬运完就会出错,最方便的办法就是将data设置为全局变量。

    uint16_t data[43];

        如果上一次的数据没有发送完却再次开启DMA发送会导致发送失败,即进入HAL_BUSY,建议开启DMA中断,在中断中调用会自动清除发送完毕标志位允许下一次传输

    void DMA1_Channel3_IRQHandler(void)
    {
        HAL_DMA_IRQHandler(&hdma_usart2_tx);
    }

二、DMA接收

1、配置问题

        需要配置成寄存器到内存,同样关闭寄存器增长开启内存增长

    //需要先开启DMA再开启串口
    hdma_usart1_rx.Instance = DMA1_Channel2;
    hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart1_rx.Init.Mode = DMA_NORMAL;
    hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
    HAL_DMA_Init(&hdma_usart1_rx);

2、接收问题

        进行DMA接收时最好不要到接收的内存中读取数据,如果需要读取数据要先关闭DMA接收

    //读取DMA
    HAL_UART_DMAStop(huart);

    //读取数据...

    //再次开启DMA
    HAL_UART_Receive_DMA(&huart1,rx_buf.buf,RX_BUF_MAX);

        开启DMA接收时如果串口数据寄存器DR里有数据DMA就会立即搬运一次,如果不想接收该数据可以开启DMA前先清空DR

标签:DMA,HAL,tx,hdma,Init,笔记,串口,usart2
From: https://blog.csdn.net/weixin_63723467/article/details/144781596

相关文章

  • Day5笔记
    随机匹配为了帮大家更快地发现和自己兴趣相同的朋友匹配1个还是匹配多个?答:匹配多个,并且按照匹配的相似度从高到低排序怎么匹配?(根据什么匹配)答:标签tags还可以根据user_team匹配加入相同队伍的用户本质:找到有相似标签的用户举例:用户A:[Java,大一,男]用户B:[Java,......
  • Day6笔记
    一些代码注解List<String>tagList=gson.fromJson(tags,newTypeToken<List<String>>(){}.getType());``Gson`是Google提供的用于转换Java对象和JSON表示之间的一个简单轻量级库。newTypeToken<List>(){}.getType()创建了一个匿名内部类的实例来捕获泛型类型信息L......
  • ov5640_lcd_display学习笔记
    最近学习了正点原子fpgaov5640摄像头显示例程,特此记录一下。系统框架与接口FPGA要操控的外围器件为ov5640摄像头、LCD和DDR3,接口方面也并不算复杂,用到的接口为sccb、dvp以及RGB888。sccb接口用来配置摄像头寄存器参数,并且iic兼容sccb,所以配置寄存器直接调用iic的驱动模块即......
  • 《具体数学》阅读笔记
    《具体数学》阅读笔记目录《具体数学》阅读笔记1.常见化简技巧1.1.基数变换1.2.待定系数法1.3.和式和递归式1.3.1.求和因子1.3.2扰动法1.3.3巧用定律与法则1.常见化简技巧1.1.基数变换形如\[\begin{aligned}&f(j)=\alpha_j,&&1\lej\led;\\&f(dn+j)=cf(n)+\beta_......
  • 读书笔记3
    《程序员的修炼之道:从小工到专家》第八章主要探讨了如何进行有效的软件项目管理,以及在项目管理中的最佳实践。以下是这一章节的读书笔记,总结了重要观点和概念。软件开发不仅仅是编写代码,良好的项目管理是确保项目成功的关键要素。项目管理涵盖了计划、执行、监控和收尾等整个过程......
  • 读书笔记2
    《程序员的修炼之道:从小工到专家》的第七章主要集中在与他人协作的艺术,关注团队合作及沟通技巧在软件开发中的重要性。以下是这一章节的读书笔记,概述了主要观点和关键概念。在现代软件开发中,程序员通常不再单打独斗,团队合作是取得成功的关键。成功的软件项目常常依赖于团队成员之......
  • html 笔记梳理
    style属性用于改变HTML元素的样式。通过HTML样式,能够通过使用style属性直接将样式添加到HTML元素,或者间接地在独立的样式表中(CSS文件)进行定义。background-color属性为元素定义了背景颜色:<bodystyle="background-color:yellow">      //大背景是黄......
  • rabbitmq学习笔记
    RabbitMQ简介简介2006年,AMQP规范发布。2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ1.0发布AMQP​AMQP,即AdvancedMessageQueuingProtocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议......
  • 8086汇编(16位汇编)学习笔记10.寄存器总结
    8086汇编(16位汇编)学习笔记10.寄存器总结-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区-BpSend.net寄存器8086CPU有14个寄存器它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、 IP**、CS、DS、ES、**SS、PSW。8086CPU所有的寄存器都是16位的,可以存放两个字节。AX、......
  • 读书笔记
    《程序员的修炼之道:从小工到专家》的第六章主要集中在如何持续学习与自我提升。以下是这一章节的读书笔记,概述了其中的一些主要观点和概念。程序员的职业生涯中,技术是不断发展的,学习新技术和工具已成为必然。提升自己的技能是走向专家之路的重要一步。持续学习不仅可以增广自己的......