STM32CubeMX-串口开启DMA进行数据传输

STM32CubeMX-串口开启DMA进行数据传输

教程包含通用步骤以及专用步骤,其中,通用步骤为STM32CubeMX配置其他外设工程的通用操作,STM32CubeMX系列笔记基本通用,专用操作则是针对当前工程进行的配置

一、初始准备

1.硬件平台

使用正点原子STM32F4探索者

2.软件平台

在这里插入图片描述

STM32CubeMX软件平台 V6.2.1

Keil5软件平台 V5.32

STM32CubeProgrammer下载平台

20210207234636

二、操作步骤

1.CubeMX生成初始化代码

1.1 建立工程(通用步骤)
  • 芯片选择

打开cube软件,选择从芯片来创建工程,一般开发都是使用这个来开发,有的时候也可能使用另外两个,但不多,第二个基于ST提供的开发板创建工程,针对性高,第三个则选择ST提供的例程来创建工程

20210519191302

F4探索者的主控为STM32F407ZET6,所以在搜索框找到STM32F407ZE后点击具体芯片,再开始工程

20210208000009

  • 配置时钟源

我们点开SystemCore(系统内核设置),再点击RCC配置HSE和LSE时钟源,这里我都选择使用外部时钟,配置后,我们可以看到右边芯片引脚分配图的两个时钟源引脚点亮,表示时钟配置为外部源

20210519191953

  • 配置时钟树

我们进入ClockConfiguration配置时钟树,使时钟的输入路径和大小符合我们预期,精英板的晶振和时钟倍频如下

20210208003321

一般配置正确时颜色蓝白为主,配置错误时则会出现紫色,提示我们要修改值

20210208003622

具体时钟树的了解可以看我很久之前的文章,有做一些分析

CSDN文章链接-时钟树分析

1.2 串口配置步骤
1.2.1 开启串口

参考之前文章生成初始化代码部分进行配置:STM32CubeMX-串口中断实验

1.2.2 开启DMA

在配置普通串口的基础上增加以下步骤,点击串口配置里面的DMA设置

20210519200130

点击添加,选择RX和TX,添加后结果如下:

20210519200253

开启DMA循环,每次接收完成就会准备下次接收,不用重复使能

20210519201932

其中DMA通道已经默认分配好,可以使用默认的,如果有其他需求可以自行修改。

1.3生成代码(通用步骤)

点击进入Project Manager 配置生成工程的名字,存储路径**(不要有中文)**以及编译器,这里我们选MDK-ARM(Keil被收购后改名)

20210519193401

配置生成选项,主要为下面三大块,第一个我们选择只拷贝必要的库,第二个选择为每个外设生成.c和.h文件,保存之前的用户代码,以及删除之前的生成代码,第三个不选择

PS:用户代码段是一下注释之间的代码,只有原始的用户代码段注释才有效,用户自己添加的无效

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

20210519193757

最后点击生成代码

20210208004314

2.编写代码

开启DMA和不使用DMA的串口函数操作上区别不大,分别如下

普通串口:

超时机制发送接收,即传入参数有一个时间限制,超过之后或者完成之后,发送、接收就停止;

HAL_UART_Transmit(); //串口发送数据
HAL_UART_Receive();  //串口接收数据

中断机制发送接收,通过中断来接收或者发送数据,发送完就停止;

HAL_UART_Transmit_IT();//串口中断模式发送  
HAL_UART_Receive_IT();//串口中断模式接收

DMA串口:

DMA中断机制发送接收,通过中断来接收或者发送数据,发送完就停止;

HAL_UART_Transmit_DMA();//串口DMA模式发送
HAL_UART_Transmit_DMA();//串口DMA模式接收

打开MDK,在主函数中用户代码段编写如下代码:

头部定义字符串数组

/* USER CODE BEGIN Includes */
unsigned char buf[20];
/* USER CODE END Includes */

主函数插入以下代码

  /* USER CODE BEGIN 2 */
	//发送数据
	HAL_UART_Transmit_DMA(&huart1,"Uart System Init\r\n",sizeof("Uart System Init\r\n"));
	//启动接收固定长度的数据
	//只有在达到接收长度之后,才会调用回调函数
	HAL_UART_Receive_DMA(&huart1,buf,sizeof("jeck666\r\n"));
  /* USER CODE END 2 */
	
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		
    /* USER CODE BEGIN 3 */
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */

设置串口1回调函数(DMA回调函数的触发条件为接收到设置长度的字符串后,才调用回调函数)

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
		if(huart == &huart1)
		{
			//将接收到的数据再发送
			HAL_UART_Transmit_DMA(&huart1,buf,13);
		}
}
/* USER CODE END 4 */

3.程序下载(通用步骤)

程序下载我一般用两种方式:

第一种是使用MDK自带的下载环境下载程序,我们给单片机连接ST-Link后配置下载,点击魔术棒,选择debug

20210208181431

选择ST-link后,点击setting

20210208181619

添加对应F4的Flash

20210208181825

keil界面点击下载

20210208182113

第二种是使用Stm32Programmer下载软件,该下载软件下载方式多,下载快,下面我使用st-link下载

打开软件,点击connect左边选择stlink后再点击connect连接下载器

20210208182703

点击open file,找到工程路径下MDK文件夹下工程生成的hex文件

20210208182650

之后点击downlod下载,下载结果如下

20210208182721

3.实验现象

上gif图

11

stm32cubemx是一个用于生成STM32微控制器初始化代码的工具,而FreeRTOS是一个实时操作系统,串口DMA(直接存储器访问)是一种在数据传输时减少CPU负荷和提高效率的方式。当使用STM32CubeMX结合FreeRTOS来接收不定长数据时,可以按照以下步骤进行操作。 首先,在CubeMX中配置串口DMA的初始化参数,使其支持不定长数据接收。可以选择需要的串口和对应的DMA通道,配置串口的波特率、数据位和停止位等参数。然后,配置DMA以支持循环传输和变化长度的数据接收。 其次,生成初始化代码并在FreeRTOS中集成。CubeMX可以生成针对FreeRTOS的初始化代码,将配置好的串口DMA初始化函数添加到FreeRTOS任务中,并在任务中实现数据接收的逻辑。可以利用FreeRTOS提供的任务管理和事件控制功能,让串口DMA在后台接收数据,同时不影响其他任务的运行。 最后,根据实际需求处理不定长数据。在串口DMA接收到数据后,根据数据长度进行相应的处理,可以通过消息队列或者信号量将数据传递给其他任务进行后续处理,也可以在接收完成后发送一个事件信号通知其他任务进行处理。需要根据具体需求来设计数据处理的流程,确保数据能够被准确地接收和处理。 总之,在使用STM32CubeMX和FreeRTOS进行串口DMA接收不定长数据时,需要合理配置串口DMA参数,并在FreeRTOS任务中实现数据接收和处理的逻辑,以实现高效、稳定地数据传输和处理。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Top嵌入式

投喂个鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值