HAL库实现DMA串口通信

一、DMA
(一)定义
①DMA(Direct Memory Access)全称为:直接内存访问。

②DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA控制接口逻辑芯片共同组成,嵌入式系统的DMA控制器内建在处理器芯片内部,一般称为DMA控制器,DMAC)。

③DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。

(二)DMA传输
①DMA传输就是将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

②DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输:外设到内存、内存到外设、内存到内存、外设到外设。

1.传输参数
参数设置主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。

也就是说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。

2.DMA传输方式
①DMA_Mode_Normal,正常模式,

当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
  
②DMA_Mode_Circular ,循环传输模式

当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式

(三)C8T6的DMA资源
stm32F103C8T6有一个DMA资源(7个通道),每个通道都支持软件触发和特定的硬件触发,一般在存储器和存储器之间数据传输用软件触发,外设和存储器之间数据传输用硬件触发。
DMA1里仲裁器是有多通道使用的情况下,根据通道优先级决定通道使用顺序问题。在总线矩阵里也有一个仲裁器,作用是当CPU和DMA同时访问同一个外设时,DMA会暂停CPU的访问。DMA请求用与硬件触发DMA数据转运
DMA基本框图


在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。DMA传输结束,如果有更多的请求时,外设可以启动下一个周期。

每次DMA传送由3个操作组成:

①从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
②存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
③执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。

(四)DMA中断
每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。


二、使用HAL库实现DMA串口通信
(一)在STM32CubeMX中新建文件
1.选择c8t6

2.设置RCC、SYS

一定要将sys的debug设置为Serial wire ,否则一直是no debug的话,使用ST-Link烧录第一次后,后面烧录需要将boot0置1才能再次烧录进去,就变得和串口一样麻烦了。

3.设置USART1、DMA

4.设置时钟源

5.设置项目文件

(二)编写代码

(三)运行程序

三、总结

通过使用DMA串口通信实现最小系统板与windows11之间进行通信,发送“Hello World!”,与之前使用中断来进行通信相比,对cpu的占用更小,更加实用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
HAL提供了多种函数用于串口DMA接收数据的功能。其中,常用的函数有HAL_UART_Receive_DMA()和HAL_UART_Receive_IT()。HAL_UART_Receive_DMA()函数将启动DMA传输模式,通过DMA通道从串口接收数据。而HAL_UART_Receive_IT()函数则是使用中断模式进行串口数据接收。这两种函数都可以实现串口DMA接收的功能,只需要根据具体需求选择适合的函数进行配置。 在使用DMA接收串口数据时,需要先通过HAL_UART_Receive_DMA()函数启动DMA传输,并设置接收缓冲区的地址和大小。当有数据到达时,DMA将自动将数据存储到指定的缓冲区中。 同时,在使用DMA接收串口数据时,也可以使用HAL_UART_DMAStop()函数来结束DMA传输,并释放相关资源。 需要注意的是,使用DMA接收串口数据需要事先配置好DMA通道和中断优先级,并确保串口配置正确。 总结起来,使用HAL进行串口DMA接收,可以通过调用HAL_UART_Receive_DMA()函数来启动DMA传输,并使用HAL_UART_DMAStop()函数来结束DMA传输。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【STM32】HAL STM32CubeMX教程十一---DMA (串口DMA发送接收)](https://blog.csdn.net/as480133937/article/details/104827639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [基于HEL利用DMA实现串口通信](https://blog.csdn.net/weixin_52805078/article/details/127468446)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值