在usart文章中讲解了串口的轮询和中断模式,本文介绍一下通过dma模式控制串口传输。
直接存储器访问 (dma) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 cpu 操作的情况下通过 dma 快速移动数据。这样节省的 cpu 资源可供其它操作使用。说白了dma就是一个搬运工,将数据从一个地方搬到另一个地方而不需要cpu处理。作为一个搬运工,要他正常工作必须要确定几个重要的参数:
传输模式:数据从哪里搬到哪里。三种可能的传输方向:存储器到外设、外设到存储器或存储器到存储器
通道选择:就是数据传输的是走那条道路
仲裁器:多个dma传输是优先级高的优先传输
数据长度:每次传输的数据长度,可以一个字节,两个字节(半字),四个字节(字)
指针递增:如果使能了递增模式,则下一次传输的地址将是前一次传输的地址递增 1(对于字节)、2(对于半字)或4(对于字)
打开stm32cubemx重新建工程,配置和上一章配置一样。只是这个工程中,在dma设置栏添加uasart发送tx和接收rx的dma。发送选择 dma1 channel 4通道,方向从存储器到外设。优先级为低。接收选择dma1 channel 5通道,方向外设到存储器,优先级为低。mode为normal,data width选择byte。
其中mode设置可以选择normal表单次传输,传输一次后终止传输,circular表示循环传输,传输完成后又重新开始继续传输,不断循环永不停止。此处选择单次传输。
increment address表示地址指针递增。串口发送数据是将数据不断存进串口的发送数据寄存器(usartx_tdr)。所以外接的地址是不递增。而内存储器存储的是要发送的数据,所以地址指针要递增才能将所以的数据发送出去。
串口数据发送寄存器只能存储8bit,每次发送一个字节,所以数据长度选择byte。另外要注意的一点,必须要开启串口中断。dma1中断已默认开启。生成报告以及代码,编译程序。在usart.c文件中,可以找到刚才的dma设置。
在main函数前面添加发送的数据。
在main()函数的while(1)循环中添加应用程序,通过dma将数据发送出去。这是只测试发送,至于接收可以看usart文内容。
编译程序并下载到开发板。用usb线连接开发板到电脑,在电脑上打开串口调试助手。选择对应的串口号,设置波特率为115200,接收到如图信息。需要注意的是,如果不开启串口中断,则程序只能发送一次数据,程序不能判断dma传输是否完成,usart一直处于busy状态。
iPhoneSE2进入中端市场 或可助苹果从中国企业争夺市场
农药残留检测仪器的技术参数
诺基亚情怀已经过去,那就重新征服,诺基亚8或将来临
带您探秘芯片与晶圆测试世界中的神器
研究人员证明可以使用生成性对抗网络(GAN)伪造CT和MRI扫描结果
通过DMA模式控制串口传输的方法
中美贸易争议升温 美下一步可能瞄准消费性电子
小米有品上架一款小沐智能马桶盖AI版 断网情况下也能本地语音控制智能马桶盖的各个功能
三星Galaxy Note 10系列即将发布国行版内置8GB+256GB组合支持25W快充
低功耗冷链资产管理RFID芯片SI24R2F+介绍
5G网络的基本架构
用户之声 | 胜利能源无人驾驶项目取得新突破
如何使用米勒电容对运算放大器补偿?
铝电解电容和钽电容怎么区分正负极呢?
中国将成为6G技术早期采用者和规模最大市场之一
虹科案例|亚太赫兹雷达实现金属腐蚀与食品药品包装的无损检测
iPhone新机背后有什么秘密?iPhone中的PCB板需要什么技术支持?
KDDI表示5G设备是否采用华为产品还尚未确定
芯趋势 芯商机丨2022 ELEXCON 深圳国际电子展圆满落幕
西门子PLC转以太网模块在建材矿粉磨系统中的应用案例