<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)

<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)

本节主要讲解串口DMA通信的功能,主要采用DMA接收数据的方式;
DMA、串口的详细解说可参考《STM32F4XXX中文参考手册》,资料有详细的讲解和说明,文档可跟作者联系索取,或百度搜索也可。

本系列教程同类文章包括以下:
1、<STM32>STM32CubeMX-基础工程创建及LED灯控制 (1)
2、<STM32>STM32CubeMX-工程创建及定时器控制LED灯闪烁(2)
3、<STM32>STM32CubeMX-串口收发通信(结束标识“\r\n”)(3)
4、<STM32>STM32CubeMX-ADC采集(软件触发单通道)(4)
5、<STM32>STM32CubeMX-CAN通信(扫描读取数据方式)(5)

话不多说,开始写代码吧。。

一、打开STM32CubeMX选择对应的芯片型号,后进入开发界面

1、双击“STM32CubeMX”软件打开,打开后如下图所示,选择红色框1;
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第1张图片
2、在弹出的对话框输入芯片型号然后选择对应使用的芯片。
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第2张图片
3、上述芯片选择完成后进入开发的配置流程。

二、配置

1、配置debug下载代码方式,这里作者选择SWD;
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第3张图片
2、配置晶振
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第4张图片
3、配置串口
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第5张图片
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第6张图片
设置一下DMA优先级
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第7张图片
4、配置系统时钟
直接输入168,回车会自动配置。
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第8张图片
5、配置工程输入路径
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第9张图片
6、配置文件输出方式
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第10张图片
7、点击“GENERATE CODE”输出工程。
打开工程。
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第11张图片

三、补充代码

1、在usart.c添加变量

uint8_t USART1_RX_BUF[USART1_REC_LEN];     //接收缓冲,最大USART1_REC_LEN个字节.
uint16_t USART1_RX_STA=0;       //接收状态标记

<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第12张图片

添加中断启动配置:

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);  //开启空闲中断
	HAL_UART_Receive_DMA(&huart1,USART1_RX_BUF,USART1_REC_LEN);  //开启DMA接收中断

<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第13张图片

2、在usart.h添加变量

#define USART1_REC_LEN  			200  	//定义最大接收字节数 200
extern uint8_t  USART1_RX_BUF[USART1_REC_LEN]; //接收缓冲,最大USART2_REC_LEN个字节.末字节为换行符 
extern uint16_t USART1_RX_STA;         		//接收状态标

<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第14张图片
3、stm32f4xx_it.c内容修改如下:
添加串口头文件:

#include "usart.h"

<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第15张图片
在串口中断添加接收数据处理:

uint8_t tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE状态
  if((tmp_flag != RESET))//判断接收是否结束
	{ 
		 __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清楚标志位
		 HAL_UART_DMAStop(&huart1); 
		 uint8_t temp=__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);                 
		 USART1_RX_STA =USART1_REC_LEN-temp; //计算数据长度
			//USART2_RX_STA |= 0x8000; //标记接收完成
		 HAL_UART_Transmit_DMA(&huart1, USART1_RX_BUF,USART1_RX_STA);//发送数据
		 HAL_UART_Receive_DMA(&huart1,USART1_RX_BUF,USART1_REC_LEN);//开启DMA
	}

<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第16张图片

四、编译运行

1、选择下载代码方式
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第17张图片
2、编译后下载
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第18张图片
3、将串口1 PA9 PA10连接串口调试模块接PC,并打开串口调试助手。发送数据。
<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)_第19张图片

五、总结

通过串口调试助手将数据发给串口1,在串口1中将接收的数据返回给串口调试助手。测试串口通信的DMA收发数据正常。
与预期要求设定相符。

你可能感兴趣的:(STM32CubeMX,STM32,stm32,单片机,嵌入式硬件)