文章目录

  • 一.串口中断介绍
    • 1、串口发送/接收函数
    • 2.串口中断函数
    • 3、串口查询函数
  • 二.中断方式串口通信
    • 1.题目要求
    • 2.工程建立
    • 3.代码编写
    • 4.烧录与结果演示
  • 三.DMA介绍
    • 1.DMA简介
    • 2.DMA的应用场景
    • 3.DMA传输方式
    • 4.DMA框图
    • 5.DMA方式的接口函数
  • 四.DMA串口通信
    • 1.工程建立
    • 2.代码编写
  • 五.总结

一.串口中断介绍

UART结构体定义
UART_HandleTypeDef huart1;

1、串口发送/接收函数

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_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

2.串口中断函数

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();串口接收错误函数

  • 串口接收中断回调函数

注意:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改。

HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

  • 串口中断处理函数,对接收到的数据进行判断和处理 判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用,如果接收数据,则会进行接收中断处理函数,如果发送数据,则会进行发送中断处理函数

HAL_UART_IRQHandler(UART_HandleTypeDef *huart);

3、串口查询函数

HAL_UART_GetState(); 判断UART的接收是否结束,或者发送数据是否忙碌

二.中断方式串口通信

  由于笔者上一篇博客已经讲述了中断的原理故而这里不再赘述,https://blog.csdn.net/weixin_64559251/article/details/127455380?spm=1001.2014.3001.5501

1.题目要求

  采用串口中断方式重做上周的串口通信作业,分别实现:1)当stm32接收到字符“s”时,停止持续发送“hello windows!”; 当接收到字符“t”时,持续发送“hello windows!”(提示:采用一个全局标量做信号灯);2)当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”; 当接收到字符“go stm32!”时,持续发送“hello windows!”(提示:要将接收到的连续字符保存到一个字符数组里,进行判别匹配。写一个接收字符串的函数。

2.工程建立

(1)在STMCubeMX主界面,创建新项目,点击ACCEE TO MCU SELECTOR

(2)在part name里选择自己的芯片(一般选择直接搜索所需芯片),本文采用STM32F103C8T6点击信息栏中的具体芯片信息选中,点击start project

(3)设置RRC,设置高速外部时钟HSE,选择外部时钟源

(4)设置串口
1)点击USART1
2)设置MODE异步通信
3)基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1,接收和发送都使能
4)GPIO引脚设置 USART1_RX/USART_TX(这里一般自动设置好了)
5) NVIC Settings 一栏使能接收中断


可发现引脚已自动配置如下图

(5)时钟设置

3.代码编写

在main.c和usart.c中添加头文件#include "stdio.h"
(1)在usart.c文件中,添加如下代码,进行重定义

/* USER CODE BEGIN 1 *///加入以下代码,支持printf函数,而不需要选择use MicroLIB
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#if 1
//#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle;
}; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001);  return ch;
}
#endif/* USER CODE END 1 */


(2)main.c主函数中,添加发送数据

 while (1){/* USER CODE END WHILE */if(flag==1){printf("Hello windows!\r\n");HAL_Delay(500);}/* USER CODE BEGIN 3 */}

(3)在main.c中添加如下定义,用来接收串口数据

void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
uint8_t aRxBuffer;         //接收中断缓冲
uint8_t Uart1_RxBuff[256];     //接收缓冲
uint8_t Uart1_Rx_Cnt = 0;        //接收缓冲计数
uint8_t str1[20] = "stop stm32";
uint8_t str2[20] = "go stm32"; //定义需要识别的字符串
uint8_t   cAlmStr[] = "数据溢出(大于256)\r\n";
int flag=1;

(4)添加开启接收中断的语句

/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
/* USER CODE END 2 */

(5)在main.c下部添加中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE: This function Should not be modified, when the callback is needed,the HAL_UART_TxCpltCallback could be implemented in the user file*//*if(Uart1_RxBuff[0]=='s'){flag=0;}if(Uart1_RxBuff[0]=='t'){flag=1;}*/if (strcmp(Uart1_RxBuff, str1) == 0) flag = 0;if (strcmp(Uart1_RxBuff, str2) == 0) flag = 1;if(Uart1_Rx_Cnt >= 255)  //溢出判断{Uart1_Rx_Cnt = 0;memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);  }else{Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位{HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去Uart1_Rx_Cnt = 0;memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组}}HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}
  • 这里读者只需要修改一下注释行,便可实现要求(1)和要求(2)了

4.烧录与结果演示

编译后不报错,烧录即可,注意烧录时注意烧录是boot0接1

串口通信(1)

串口通信(2)

三.DMA介绍

1.DMA简介

  DMA,全称Direct MemoryAccess,即直接存储器访问

  CPU无时不刻的在处理着大量的事务,但有些事情却没有那么重要,比方说数据的复制和存储数据,如果我们把这部分的CPU资源拿出来,让CPU去处理其他的复杂计算事务,是不是能够更好的利用CPU的资源呢?

  因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理。


2.DMA的应用场景

  DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:

外设到内存
内存到外设
内存到内存
外设到外设

3.DMA传输方式

  • 普通模式
    传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。

  • 循环模式
    可用于处理环形缓冲区和连续数据流(例如ADC扫描模式)。当激活循环模式后,每轮传输结束时,要传输的数据数量将自动用设置的初始值进行加载, 并继续响应DMA请求。

4.DMA框图

5.DMA方式的接口函数



四.DMA串口通信

1.工程建立

新建过程跟上述一样,这里笔者不再赘述
(1)设置RRC

(2)设置串口USART1,同时可查看波特率等设置是否正确

(3)使能中断选择

(4)DMA设置

(5)分别点击两个通道,查看模式设置是否为Normal,右侧Memory是否选中

(6)在System view下选择DMA,并ADD通道MEMTOMEM

(7)时钟设置

2.代码编写

(1)在main.c文件添加代码

uint8_t Senbuff[] = "Hello world!\r\n";  //定义数据发送数组

(2)在main.c文件添加代码

  HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));HAL_Delay(1000);

(3)编译无错误后,烧录运行即可

五.总结

  至此笔者已经将串口通信的三种方式分别演示了一遍,轮询,中断以及DMA。在此次实验中笔者更为深入地了解到了串口通信,也发现了DMA的妙用,DMA传输过程不占用CPU资源,可以边传输边运行其他任务,更加高效。在今后我们也可以多加练习,多加运用,对这些内容进行更为深入的体会,笔者也会继续努力。


参考

1.https://blog.csdn.net/qq_46467126/article/details/121076618?spm=1001.2014.3001.5502
2.https://blog.csdn.net/qq_43279579/article/details/110138564
3.https://blog.csdn.net/as480133937/article/details/104827639/

串口中断方式与DMA方式通信相关推荐

  1. 计算机组成原理DMA方式原理,计算机组成原理4(程序查询方式、程序中断方式、DMA方式及其I/O接口电路)...

    一.程序查询方式 1.程序查询方式的接口电路 2.符号说明 &与非门 B工作触发器 D完成触发器 3.程序查询工作过程(输入) (1)当CPU通过I/O指令启动输入设备时,该指令的设备码将通过 ...

  2. 操作系统之I/O管理:1、I/O控制器、I/O控制方式(程序直接控制方式、中断驱动方式、DMA方式、通道控制方式)

    1.I/O设备的概念.分类 基础知识 思维导图 什么是I/O设备? 分类 I/O控制器 思维导图 I/O控制器功能 I/O控制器的组成 内存映像I/O vs 寄存器独立编址 I/O控制方式 1.程序直 ...

  3. (计算机组成原理)第七章输入和输出系统-第四节3:I/O方式之DMA方式

    文章目录 一:什么是DMA方式 二:DMA控制器组成 三:DMA传送过程 (1)预处理 (2)数据传送 (3)后处理 四:DMA方式的特点 五:DMA传送方式 (1)停止CPU访问主存 (2)DMA和 ...

  4. 计算机组成原理4(程序查询方式、程序中断方式、DMA方式及其I/O接口电路)

    文章目录 一.程序查询方式 二.程序中断方式 三.DMA方式 一.程序查询方式 1.程序查询方式的接口电路 2.符号说明 &与非门 B工作触发器 D完成触发器 3.程序查询工作过程(输入) ( ...

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

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

  6. 【计算机原理与接口技术(UNIX)⑮】——输入/输出系统【查询方式、中断控制方式、DMA 、8237A】

    ✅ 通过对 [计算机与UNIX汇编原理 ① ~ ⑫]的学习,我们已经大致掌握了汇编程序设计的相关知识 接下来,我将其分栏名改为 [计算机原理与接口技术(UNIX) ],重点将放在 "计算机原 ...

  7. 哈工大计算机组成原理第五章下(二)——>DMA方式

    哈工大计算机组成原理课程 b站 mooc 大纲: 文章目录 输入输出系统下(二)--DMA(直接存储器访问)方式 一.DMA方式的特点 1. DMA和程序中断两种方式的数据通路 2. DMA与主存交换 ...

  8. 5.1.3 OS控制I/O设备的几种方式?(程序直接控制方式、中断驱动方式、DMA、通道控制)

    文章目录 0.思维导图 1.程序直接控制方式 2.中断驱动方式 3.DMA方式 4.通道控制方式 5.四种方式总结一下 0.思维导图 1.程序直接控制方式 key word : 轮询 完成一次读/写操 ...

  9. 关闭串口_USART串口通信,DMA方式,一分钟从入门到大师

    在<USART串口通信,中断方式,一分钟从菜鸟到大师(完整版)>文中详细介绍了中断方式串口通信的时序.在需要大量串口通信的应用中,<为什么需要DMA?你知道吗?>指出了中断方式 ...

最新文章

  1. (拆点+最小路径覆盖) bzoj 2150
  2. 如何安装JHipster
  3. go string 换行_从词法分析角度聊 Go 代码组成
  4. IDT 信息设计工具使用
  5. Spring IOC和MVC基础知识
  6. 数据挖掘十大经典算法之——Apriori 算法
  7. MongoDB基础知识总结
  8. android左侧固定导航栏,Android使用fragment实现左侧导航
  9. 代码流星雨是什么形式_为什么要在2020年与流星合作
  10. 洛谷 U10783 名字被和谐了
  11. java c 转换_Java怎么转换c语言?
  12. 电容充放电原理图_别找了,去耦电容全攻略就在这!
  13. 域对抗网络Domain adversarial neural network及其应用相关论文
  14. cubemx stm32 配置两个串口_用STM32CubeMX怎么配置串口的接收中断
  15. 网卡参数设置建议与各个网卡参数含义详解
  16. ibm z系列服务器图片,IBM Z系列本本最清晰图片全面曝光(图)
  17. Eclipse设置护眼(绿豆沙)颜色
  18. 吕 思 伟 ---- 潘 爱 民 :: ATL 介 绍( 一) (转)
  19. 2020上海全国计算机一级考试时间,2020全国等级计算机考试时间(全国计算机一级报名时间)...
  20. JavaScript 实现购物车

热门文章

  1. 艾伟:一次挂死(hang)的处理过程及经验
  2. QLabel图片居中无拉伸
  3. div里嵌套div设置不换行的方法
  4. 基于深度学习的FAQ检索式问答系统
  5. ad元件定位孔放在哪一层_调节阀定位器常见故障
  6. iapp php邮箱怎么反馈,iCloud邮箱
  7. 武林外传爆笑江湖java7723_原班人马上演爆笑江湖路《武林外传电影手游》评测...
  8. TOMCAT下ab测试出现超时的解决
  9. AN7114 音频功率放大电路
  10. 安装Ubuntu 18.04 遇到32位兼容问题