STM32 串口通信

串口发原理

    在stm32每个串口内部有发送寄存器和发送移位寄存器。
    当调用HAL_UART_Transmit 时,cpu会将发送的数据放入发送寄存器中。发送移位寄存器会将数据转换成电平的高低,从TX发出。

1、轮询模式配置、发送与接收

    轮询模式时cpu会不断检测发送数据寄存器的数据是否已经发送到发送移位寄存器。直到把本次数据全部发完,或者超时。 CPU会一直处于忙碌状态。

1.1、配置

在这里插入图片描述

1.2、发送

char message[] = "hello world\r\n";
HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), 1000);

1.3、接收

uint8_t rxbuf[1];
HAL_UART_Receive(&huart1, rxbuf, 1, HAL_MAX_DELAY);

2、中断模式

    采用中断的串口发送接收模式,不会一直占用cpu。

2.1、配置

2.2、发送

    与轮询的代码区别就是在函数后加了-IT

char message[] = "hello world\r\n";
HAL_UART_Transmit_IT(&huart1, (uint8_t *)message, strlen(message));
HAL_Delay(1100);

2.3、接收

    中断接收三字节数据:

HAL_UART_Receive_IT(&huart1, rxbuf, 3);

2.4、中断接收串口命令控制小灯亮灭

    调用HAL_UART_Receive_IT(&huart1, rxbuf, 3)函数后,如果串口接收到3字节的数据后就会调用HAL_UART_RxCpltCallback表示数据接收完成,我们在这里解析数据,控制小灯亮灭即可。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_IT(&huart1, (uint8_t *)rxbuf, 3);
	if(rxbuf[0]=='A'){
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1);
	}
	if(rxbuf[0]=='B'){
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0);
	}
	HAL_UART_Receive_IT(&huart1, rxbuf, 3);
}

3、串口的DMA模式

    DMA (Direct Memory Acess)模式可以减少cpu的负载,帮助cpu来搬运数据。

3.1 串口DMA配置

    点击add按钮添加即可
在这里插入图片描述

3.2 DMA代码

    DMA模式还是有中断参与的(DMA传输完成中断),代码和普通中断(串口接收完成中断,串口发送完成中断)模式的区别就是把IT改为DMA即可,如下,可以完成对小灯的控制:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_DMA(&huart1, (uint8_t *)rxbuf, 3);
	if(rxbuf[0]=='A'){
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 1);
	}
	if(rxbuf[0]=='B'){
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, 0);
	}

	HAL_UART_Receive_DMA(&huart1, rxbuf, 3);
}

在这里插入图片描述

4、串口实现收发不定长数据

    该功能的实现主要依靠串口的空闲中断,此中断的触发条件与接收的字节数无关,只有当RX引脚上无数据进入时,也就是串口从忙碌转为空闲时才会触发。
    所以我们可认为触发空闲中断时,一帧数据完成,在此中断服务函数中编写我们的代码即可。
    这里HAL库给我们提供了一个扩展函数:HAL_UARTEx_ReceiveToIdle_DMA可以帮我们实现接收不定长数据,当由忙碌到空闲时会触发中断进入HAL_UARTEx_RxEventCallback函数。

4.1、接收不定长数据代码实现

    将接收到的数据再通过串口发送出来

HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rxbuf, 100);

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	HAL_UART_Transmit_DMA(&huart1, (uint8_t *)rxbuf, Size);
	HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rxbuf, 10);
}

在这里插入图片描述

4.3、DMA传输过半中断

    DMA传输过半中断指的是当串口接收到指定最大长度的一半时也会触发中断导致进入HAL_UARTEx_RxEventCallback函数。上面没出现这种情况是因为我们receive时设置的参数较大100,当该值设的较小时就会出现问题。
    关闭DMA传输过半中断的函数是:__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/423050.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB源码-第150期】基于matlab的开普勒优化算法(KOA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 开普勒优化算法(Kepler Optimization Algorithm, KOA)是一个虚构的、灵感来自天文学的优化算法,它借鉴了开普勒行星运动定律的概念来设计。在这个构想中,算法模仿行星围绕太阳的…

SAP EC-CS如何实现自动抵消

SAP EC-CS 是SAP 比较早的合并方案,尽管后面有很多其他的方案作为替代,但 EC-CS 因为其成熟性,在集团合并单元不多的情况下,也可以作为一个不错的合并解决方案。可以说,会计报表合并一个核心就是实现抵消的处理&#x…

计算机视觉基础知识(十六)--图像识别

图像识别 信息时代的一门重要技术;目的是让计算机代替人类处理大量的物理信息;随着计算机技术的发展,人类对图像识别技术的认识越来越深刻;图像识别技术利用计算机对图像进行处理\分析\理解,识别不同模式的目标和对象;过程分为信息的获取\预处理\特征抽取和选择\分类器设计\分…

N皇后问题详解:回溯算法的应用与实践(dfs)

目录 一.问题描述二.思路分析1.DFS三.代码实现与解析1.分析2.完整代码 一.问题描述 题目如上图所示,在一个n*n的国际象棋棋盘上怎么摆放能使得皇后互相攻击不到(也就是在任意一列、一行、一条对角线上都不存在两个皇后) 二.思路分析 1.DFS …

C/C++内存管理及内存泄漏详解

目录 C/C内存分布 C语言中动态内存管理方式:malloc/calloc/realloc/free C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 内置类型 自定义类型 内存泄漏 概念 内存泄漏分类 ⭐…

虚拟化介绍

虚拟化理论介绍 什么是虚拟化: 虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统。 在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,V…

网络仿真(一)

网络仿真的意义 在网络规划和设计、网络设备研发、网络协议开发中,需要一种手段来反映和预测网络的性能 网络仿真可以提高网络规划设计的可靠性和准确性,明显降低网络投资风险,减少不必要的浪费 Ns-2 is a discrete event simulator Sched…

Page Object模式:为什么它是Web自动化测试的必备工具

为 UI 页面写测试用例时(比如 web 页面,移动端页面),测试用例会存在大量元素和操作细节。当 UI 变化时,测试用例也要跟着变化, PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时(包…

LabVIEW石油钻机提升系统数字孪生技术

LabVIEW石油钻机提升系统数字孪生技术 随着数字化、信息化、智能化的发展,石油钻采过程中的石油钻机数字化技术提升成为了提高钻井效率、降低生产成本的重要途径。基于中石油云平台提供的数据,采用数字孪生技术,对石油钻机提升系统进行数字化…

配置之道:深入研究Netty中的Option选项

欢迎来到我的博客,代码的世界里,每一行都是一个故事 配置之道:深入研究Netty中的Option选项 前言Option的基础概念ChannelOption与Bootstrap Option常见的ChannelOption类型ChannelConfig的使用Option的生命周期不同传输协议的Option 前言 在…

云时代【7】—— 存储卷

云时代【7】—— 存储卷 四、Docker(四)存储卷1. 存储卷(1)定义(2)分类 2. 相关指令(1)管理卷 VolumeA. 创建方式方式一:docker volume方式二:docker run -v …

美国教授查理曼说中国为何强大?中国人都不知道的民族特性

Title: 中国强大的秘密:查理曼教授的视角 在世界历史的长河中,中华民族以其辉煌灿烂的文化和举世瞩目的成就,书写了一篇篇传奇篇章。然而,对于中国人为什么能够取得如此卓越的成就,许多人却并不清楚。近日&#xff0c…

Linux搭建SFTP服务器

案例:搭建SFTP服务器 SFTP(SSH文件传输协议) SFTP(SSH文件传输协议)是一种安全的文件传输协议,用于在计算机之间传输文件。它基于SSH(安全外壳协议)的子系统,提供了加密的…

sqlserver保存微信Emoji表情

首先将数据库字段,设置类型为 nvarchar(200)一个emoji表情,占4字节就可以了,web前端展示不用改任何东西,直接提交数据保存;回显也会没有问题,C#代码不用做任何处理; 不哭不闹要睡觉&#x1f31…

若依框架使用mars3d的环境配置,地球构建

因项目需要,原本使用过的cesium依赖,现在想使用火星科技mars3d的一些功能,所以需要引入mars3d依赖,整个过程非常的坎坷,以至于我都不知道到底是哪些部分是标准的。。。先把我认为对的记录一下: 1.vue.conf…

【Java】SpringAOP —— AOP是什么? 代码实现了SpringAOP

文章目录 一、AOP是什么二、AOP的组成三、SpringAOP四、实现SpringAOP1.添加AOP框架支持2.定义切面切点3.定义相关通知 总结 一、AOP是什么 AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某一类…

JVM 第四部分—垃圾回收相关概念 2

System.gc() 在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存 然而System.gc()调用附带一个免责声明,无法保证对垃…

基于Camunda实现bpmn 2.0各种类型的任务

基于Camunda实现bpmn中各种类型任务 ​ Camunda Modeler -为流程设置器(建模工具),用来构建我们的流程模型。Camunda Modeler流程绘图工具,支持三种协议类型流程文件分别为:BPMN、DMN、Form。 ​ Camunda Modeler下载…

【Python】进阶学习:pandas--isin()用法详解

【Python】进阶学习:pandas–isin()用法详解 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅…

【java】20:枚举

枚举的二种实现方式 1) 自定义类实现枚举 2) 使用 enum 关键字实现枚举 自定义实现枚举: 1.不需要提供setXxx方法,因为枚举对象值通常为只读. 2.对枚举对象/属性使用final static共同修饰,实现底层优化. 3.枚举对象名通常使用全部大写&…