STM32F0XX DMA串口发送数据

简介: 最近在接手一个安排的时候,需要修改之前的一些代码的外设接口,然后发现之前有部分关于USART通过DMA收发数据的部分功能,修改移植的时候发现有些需要注意的事项,以及解释的,做一篇小笔记吧,博主使用的单片机是STM32f071。
**前言:**

最近在接手一个安排的时候,需要修改之前的一些代码的外设接口,然后发现之前有部分关于USART通过DMA收发数据的部分功能,修改移植的时候发现有些需要注意的事项,以及解释的,做一篇小笔记吧,博主使用的单片机是STM32f071。


USART有三种模式进行传输:轮询、中断、以及DMA。

轮询模式

CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。

中断控制方式

当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。

直接内存存取技术(DMA)方式

所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。

· 如果没有多操作过,可以用STM32CubeMX进行快速配置哈,这是之前学习CubeMX时候看到教程,很精简,点击进入链接。

串口的基本配置大家可以看哈野火老哥的教程,很扎实很细致。

首先配置好需要用的usartx:4edc953e2c684bbe819ffa954c899c08.png

时钟配置,开启gpio、usart、dma时钟.4edc953e2c684bbe819ffa954c899c08.png

IO配置为需要的模式.**注意:**f0系类的MCU配置复用功能的时候需要配置GPIOx_AFR寄存器,此在数据手册查询到PD5 PD6引脚默认复用功能引脚便是USART2,所以此处便可以省略配置,但是其他时候大家配置的时候记得进行查询在进行配置.4edc953e2c684bbe819ffa954c899c08.png

数据手册查询位置4edc953e2c684bbe819ffa954c899c08.png

此处为stm32f0开发手册GPIO寄存器配置查询4edc953e2c684bbe819ffa954c899c08.png

usart2外设配置

利用DMA通道发送接收串口时候,收发是分离的。


DMA的发送有几个步骤.

1.在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。

2. 将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道)

3.开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,DMA和调试是不同步的,即不管Keil 是什么状态,DMA总是发送数据。

3. 等待发送完成标志位,即下面的终端服务函数中的第3点设置的标志位。或者根据自己的实际情况来定,是否要一直等待这个标志位,也可以通过状态机的方式来循环查询也可以。或者其他方式判断数据发送完成.


DMA的接收步骤

串口接收DMA在初始化的时候就处于开启状态,一直等待数据的到来,在软件上无需做任何事情,只要在初始化配置的时候设置好配置就可以了。

判断数据数据接收完成:

这里判断接收完成是通过串口空闲中断的方式实现,即当串口数据流停止后,就会产生IDLE中断。这个中断里面做如下几件事:

1.关闭串口接收DMA通道,2点原因:1>.防止后面又有数据接收到,产生干扰。2>.便于DMA的重新配置赋值,下面第4点。

2. 清除DMA 所有标志位

3. 从DMA寄存器中获取接收到的数据字节数

4. 重新设置DMA下次要接收的数据字节数,注意,这里是给DMA寄存器重新设置接收的计数值,这个数量只能大于或者等于可能接收的字节数,否则当DMA接收计数器递减到0的时候,又会重载这个计数值,重新循环递减计数,所以接收缓冲区的数据则会被覆盖丢失。

5. 开启DMA通道,等待下一次的数据接收,注意,对DMA的相关寄存器配置写入,如第4条的写入计数值,必须要在关闭DMA的条件进行,否则操作无效。

说明一下,STM32的IDLE的中断在串口无数据接收的情况下,是不会一直产生的,产生的条件是这样的,当清除IDLE标志位后,必须有接收到第一个数据后,才开始触发,一断接收的数据断流,没有接收到数据,即产生IDLE中断。

此处文字是摘录别人的文字,大家可以看哈别人的文章,可以更好的学习一哈.附上链接.

虽然其他人写的很详细,但是博主用的使用是DMA移植发送形式,并没有在DMA通道的专用中断函数发送.

MCU中DMA有5个通道的,有7个通道的,博主使用的MCU是七个通道的,我们需要从stm32开发手册进行查询并配置对应的通道,这个很重要,记得,因为其他的配置都很常规,在这里配置的时候需要注意,因为配置一旦出错,就很容易出现hardfault.

串口接收DMA在初始化的时候就处于开启状态,一直等待数据的到来,在软件上无需做任何事情,只要在初始化配置的时候设置好配置就可以了。

判断数据数据接收完成:

这里判断接收完成是通过串口空闲中断的方式实现,即当串口数据流停止后,就会产生IDLE中断。这个中断里面做如下几件事:

关闭串口接收DMA通道,2点原因:1.防止后面又有数据接收到,产生干扰。2.便于DMA的重新配置赋值,下面第4点。

清除DMA 所有标志位

从DMA寄存器中获取接收到的数据字节数

重新设置DMA下次要接收的数据字节数,注意,这里是给DMA寄存器重新设置接收的计数值,这个数量只能大于或者等于可能接收的字节数,否则当DMA接收计数器递减到0的时候,又会重载这个计数值,重新循环递减计数,所以接收缓冲区的数据则会被覆盖丢失。

开启DMA通道,等待下一次的数据接收,注意,对DMA的相关寄存器配置写入,如第4条的写入计数值,必须要在关闭DMA的条件进行,否则操作无效。

说明一下,STM32的IDLE的中断在串口无数据接收的情况下,是不会一直产生的,产生的条件是这样的,当清除IDLE标志位后,必须有接收到第一个数据后,才开始触发,一断接收的数据断流,没有接收到数据,即产生IDLE中断。

4edc953e2c684bbe819ffa954c899c08.png

DMA处查询usart2_通道为ch4,或者可以通过Remap到ch7进行发送数据.4edc953e2c684bbe819ffa954c899c08.png

由于数据发送的时候,尚未发送完成就执行完函数,所以加上发送完成标志完成判断,然后再清除掉标志.

DMA通道配置函数,配置之后就可以使用此函数了.4edc953e2c684bbe819ffa954c899c08.png

主函数调用

4edc953e2c684bbe819ffa954c899c08.png

串口打印显示

但是Remap请慎用,有些MCU是没有此项功能的.博主最早之前就是想用Remap,没有主要此处,所以造成了发送一直显示只能发送第一个byte.4edc953e2c684bbe819ffa954c899c08.png

示范一个错误案例:没有查询是否可以DMA Remap就直接进行Remap

4edc953e2c684bbe819ffa954c899c08.png4edc953e2c684bbe819ffa954c899c08.png4edc953e2c684bbe819ffa954c899c08.png

**结语:**大家写的时候一定多多注意,希望可以帮到大家,写的比较匆忙,好多知识点就不写了,CSDN等等大家都总结的很详细.

目录
相关文章
|
5月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
818 0
|
1月前
|
存储 数据管理 数据处理
处理STM32 DMA方式下的HAL_UART_ERROR_ORE错误
通过正确配置UART和DMA、实现有效的错误处理回调函数以及优化数据处理和缓冲区管理,可以有效处理STM32中DMA方式下的 `HAL_UART_ERROR_ORE`错误。这些方法确保了数据的高效传输和处理,避免了因数据溢出导致的通信中断和数据丢失。希望这些解决方案能够帮助您在实际应用中更好地应对和解决此类问题。
252 0
|
5月前
STM32CubeMX 串口收发一帧数据
STM32CubeMX 串口收发一帧数据
71 9
|
5月前
|
芯片
STM32CubeMX 串口数据收发
STM32CubeMX 串口数据收发
182 2
|
5月前
|
监控
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
438 0
|
6月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
488 2
|
7月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
6月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
540 4
|
6月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
814 2