文章目录

  • 一. 环境
  • 二. 使用STM32CubeMX
  • 三. USART DMA中断通信
    • 1. UART函数库介绍
    • 2. 编写代码
    • 3. 最终效果
  • 四. 软件调试
  • 五. 总结

一. 环境

  • 硬件:stm32f103c8t6 核心板
  • 软件:STM32CubeMX 6.3.0
  • 软件:keil5 mdk

二. 使用STM32CubeMX

这里与前一篇串口通信文章只在于多了个DMA设置以及开启串口中断使能。STM32CubeMX实现串口通信_diyu-CSDN博客

与前一篇串口中断文章只多了个DMA设置。STM32CubeMX实现串口中断通信_diyu-CSDN博客

  1. 设置DMA

为了方便,串口发送以及接受都开启DMA

  1. 开启串口中断

三. USART DMA中断通信

1. UART函数库介绍

结构体以及函数定义均在头文件: stm32f1xx_hal_uart.h

  • UART结构体定义
UART_HandleTypeDef huart1;
  • 串口发送/接收函数

HAL_UART_Transmit():串口发送数据,使用超时管理机制
HAL_UART_Receive():串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT():串口中断模式发送
HAL_UART_Receive_IT():串口中断模式接收
HAL_UART_Transmit_DMA():串口DMA模式发送
HAL_UART_Transmit_DMA():串口DMA模式接收

  • 串口中断函数

HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数

2. 编写代码

在文件main.cmain函数外部 添加以下代码

#define LENGTH 8     //接受缓冲区大小
uint8_t RxBuffer[LENGTH];   //接受缓冲区
uint8_t RxFlag = 0;       //接收完成标志;0表示接受未完成,1表示接收完成

main函数内部,while循环外部添加以下代码

//发送提示信息
uint8_t message1[]="****UART commucition using IDLE IT DMA****\n";
uint8_t message2[]="Please enter 8 characters: \n";
HAL_UART_Transmit(&huart1,(uint8_t *)message1,sizeof(message1),HAL_MAX_DELAY);
HAL_UART_Transmit(&huart1,(uint8_t *)message2,sizeof(message2),HAL_MAX_DELAY);
//使能DMA接收中断
HAL_UART_Receive_DMA(&huart1, (uint8_t *)RxBuffer,LENGTH);

while循环内部添加一下代码

while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///添加下面代码HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"hello windows!\n", 15 );HAL_Delay(1000);  //延时1sif(RxFlag == 1)  //如果接受完成,不在发送数据{HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"Recevie Success!\n",17);  //提示接受成功break;  //退出循环,不在发送数据}}

main函数后面,添加中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  //串口接收中断回调函数
{if(huart->Instance == USART1)   //判断发生接收中断的串口{RxFlag=1;   //置为接收完成标志//DMA使能接收中断  这个必须添加,否则不能再使用DMA进行发送接受HAL_UART_Receive_DMA(&huart1, (uint8_t *)RxBuffer,LENGTH);}
}

如果没有再次开启 HAL_UART_Receive_DMA,你将不能继续使用DMA发送以及接受。

比如,如果没有开启,我这里不能使用DMA发送 Recevie Success!

3. 最终效果

编译,将程序烧录或下载进核心板,打开串口助手查看接收到的数据。

波特率、停止位、数据位、校验位要与配置的一致

你可以发送 8 个字节内容进行中断发送

这里发送8个字节内容 “stop DMA”,进行中断。串口接受成功后,不再发送数据

四. 软件调试

如果要进行软件调试,与前一篇文章相同。STM32CubeMX实现串口通信_diyu-CSDN博客

五. 总结

总体而言还是很简单的,只要了解HAL库中的串口发送接收函数以及DMA中断函数,然后调用即可。

DMA中断与串口中断实际上是一样的,都是固定长度的收发。

如果想实现任意长数据收发,可以采用IDLE中断以及DMA接收。

STM32CubeMX实现串口DMA中断通信相关推荐

  1. GD32E230F6p6的串口DMA中断收发及printf

    GD32E230F6p6的串口DMA中断收发及printf 简介 一.初始化配置 选择DMA通道 头文件 串口&DMA初始化 二.串口DMA收发及printf DMA发送 DMA收发中断处理 ...

  2. STM32CubeMX实现串口通信

    文章目录 一. 环境 二. 使用STM32CubeMX 1. 安装固件库 2. 工程设置 三. USART串口通信 1. UART函数库介绍 2. 代码编写 3. 最终效果 四. 软件调试 五. 总结 ...

  3. 巧用STM32串口DMA的normal和circular模式,达到并行执行效果

    芯片型号:stm32f103rct6:SPI接口ADC; 代码功能描述:有xyz3路数据,每路1个双通道adc采集,从x路依次数据并用串口发送出去,14字节,2250000bps: 方案1:按照顺序执 ...

  4. CubeMX 串口DMA

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.基本配置 二.使用步骤 1.main.c 2.stm32f1xx_it.c 三.启动串口DMA中断使能 总结 前言 提 ...

  5. 【嵌入式基础】串口中断通信VS串口DMA通信

    目录 目录 前言 一.串口通信 1. 通信方式 2.通信速率 3.串口通信的三种工作方式 二.串口中断通信 1.串口中断特点 2.CubeMX配置初始化串口中断相关外设 3.串口中断程序分析 4.实验 ...

  6. STM32CubeMX实现串口中断通信

    文章目录 一. 环境 二. 使用STM32CubeMX 三. USART中断通信 1. UART函数库介绍 2. 编写代码 3. 最终效果 四. 软件调试 五. 总结 一. 环境 硬件:stm32f1 ...

  7. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

  8. STM32应用(七)JY901九轴姿态模块(串口DMA空闲中断和I2C通信)

    文章目录 0.相关基础知识介绍 0.1六轴.九轴传感器有什么区别? 1.JY901模块简介 1.1 产品概述 1.2 性能参数 1.3 实物图和接线 2.软件和使用说明书 3.串口通信JY901 3. ...

  9. 串口中断方式与DMA方式通信

    文章目录 一.串口中断介绍 1.串口发送/接收函数 2.串口中断函数 3.串口查询函数 二.中断方式串口通信 1.题目要求 2.工程建立 3.代码编写 4.烧录与结果演示 三.DMA介绍 1.DMA简 ...

最新文章

  1. 软件测试--利用组合覆盖法设计测试用例
  2. Redis源码分析:过期key删除与设置key的过期时间
  3. 使用wireshark工具获得直连设备的IP地址
  4. 使用DDMS抓取安卓APP的奔溃日志
  5. win10 系统安装 服务器失败怎么回事,Win10正式版安装出现问题怎么办
  6. java gui 项目解密,java GUI(实例小项目--列出磁盘目录)
  7. linux删除缓存脚本,Linux 设置定时清除buff/cache的脚本
  8. javascript的实现事件的一些实例
  9. java 无法加载资源,JavaScript:无法加载资源:服务器响应状态为404(未找到)
  10. LeetCode MySQL 1126. 查询活跃业务
  11. 天天在做图表,其实你根本不懂数据可视化
  12. html图标框架中文版,常见css框架有哪些?
  13. spring集成compass中出现的问题和总结
  14. 精通HTML5+CSS3需要学什么?
  15. 基于Dialog的MFC程序在启动时隐藏为托盘程序(三)
  16. Eclipse用法和技巧
  17. python实现集合并交差运算_集合的并交差运算
  18. 如何免费下载卫星影像图
  19. 浅谈单线程的Redis快的原因是什么
  20. 多机器人编队人工势场法协同避障算法原理及实现

热门文章

  1. 什么pdf转换成excel转换器好
  2. Linux实战教学笔记15:磁盘原理
  3. SwiftUI macOS源码大全之倒计时App基于coredata(教程含源码)
  4. Source Insight4.0字体大小及护眼背景配置
  5. 地震了!最好直接砸死我!
  6. IE6,IE7和firefox的兼容问题大集合
  7. Axure高级功能(变量、动态面板[轮播图]、中继器)
  8. 微信小程序时间戳转换为日期
  9. 一个简单的朋友圈单张或多张图片展示的思路
  10. python 列表求最大值_Python找出列表中的最大数和最小数