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.mzph.cn/news/715297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式中汇编语言的基本实现

大家好,今天给大家分享,GNU汇编的语法。 第一:汇编简介 GNU 汇编语法适用于所有的架构,并不是 ARM 独享的,GNU 汇编由一系列的语句组成, 每行一条语句,每条语句有三个可选部分,如下…

小白学视觉 | 详解遗传算法 GA(Python实现代码)

本文来源公众号“小白学视觉”,仅用于学术分享,侵权删,干货满满。 原文链接:详解遗传算法 GA(Python实现代码) 转自:机器之心 英文:www.analyticsvidhya.com/blog/2017/07/introduc…

在线上传解压PHP文件代码,压缩/压缩(网站一键打包)支持密码登录

在线上传解压PHP文件代码,压缩/压缩(网站一键打包)支持密码登录 资源宝分享:www.httple.net 如果你没有主机控制面板这个是最好选择,不需要数据库,上传当控制面板使用,无需安装任何扩展,安全高,…

重拾前端基础知识:CSS

重拾前端基础知识:CSS 前言选择器简单选择器属性选择器组合选择器 插入CSS内嵌样式(Inline Style)内部样式(Internal Style)外部样式(External Style) 层叠颜色背景颜色文本颜色RGB 颜色HEX 颜色…

ESD管 uClamp3331ZA、AZ5A83-01B 、AZ8523-01B国产替代ESD0321CW

上海雷卯ESD二极管 ESD0321CW替代国外品牌型号uClamp3331ZA、AZ5A83-01B 、AZ8523-01B,参数对比如下: 判断ESD二极管是否可以替代需注意的几点: 1. VRWM 是否接近 2. 抗静电能力是否接近; 3. VBR 是否接近; 4. IPP…

Julia语言中的位运算符、赋值运算符、算术运算符

算术运算符 # 使用基本的赋值运算符 a 10 println("a 的初始值是: $a") # 使用加法赋值运算符 a 5 println("a 加上 5 后的值是: $a") # 使用减法赋值运算符 - a - 3 println("a 减去 3 后的值是: $a") # 使用乘法赋值运算符…

Mistral发布语言大模型Mistral Large;法国新星Mistral挑战 OpenAI 霸主地位

🦉 AI新闻 🚀 Mistral发布语言大模型Mistral Large 摘要:Mistral Large 是 Mistral AI 公司最新发布的旗舰语言模型,具备顶尖水平的推理能力。它主要被设计用于处理复杂的多语言推理任务,比如文本理解、转换和代码生…

上位机图像处理和嵌入式模块部署(上、下位机通信的三个注意点)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 如果最终部署在客户现场的是一个嵌入式设备,那么上位机在做好了算法编辑和算法部署之后,很重要的一步就是处理上位机和下位…

beets,一个有趣的 Python 音乐信息管理工具!

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Beet库? 安装Beet库 使用Beet库 Beet库的功能特性 1. 多种音乐格式支持 2. 自动标签识…

【学习笔记】数据结构与算法05:树、层序遍历、深度优先搜索、二叉搜索树

知识出处:Hello算法:https://www.hello-algo.com/ 文章目录 2.4 树2.4.1 「二叉树 binary tree」2.4.1.1 二叉树基本操作2.4.1.2 二叉树的常见类型「完美二叉树 perfect binary tree」「完全二叉树 complete binary tree」「完满二叉树 full binary tre…

H12-821_106

106.如图所示,RTA的GEO/0/0、GEO/0/1接口分别连接部门1和2,其网段分别为10.1.2.0/24、10.1.3.0/24网段,为限制部门1和2之间的相互访间,在RTA上部署traffic-filter,以下哪些部署方式是正确? A.配置ACL3000拒…

职场的过早优化

过早优化,指的是还没弄清楚需求未来的变化的走向的时候,忽略了更重要的问题。 放在职业发展上:你在没有积累足够职场资源(眼界、能力、人脉等等),也没有对职业发展形成清晰认知的时候,就过早地进…

【c++】构造函数(下)——初始化列表

Hello,everybody!构造函数的内容比较多,语法还有些复杂。我分成了两篇文章进行讲解,大家在看过构造函数(上)后再来看这篇文章更容易理解哟! 1.初始化列表的格式 类似这种格式,在初始化列表中第一行用冒号开头,剩下的用…

力扣每日一题 使二叉树所有路径值相等的最小代价 满二叉树 贪心

Problem: 2673. 使二叉树所有路径值相等的最小代价 文章目录 思路复杂度Code 思路 👨‍🏫 灵神题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) 🌎 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int minIncrements(int …

Vue+SpringBoot打造无代码动态表单系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 动态类型模块2.2 动态文件模块2.3 动态字段模块2.4 动态值模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 动态类型表3.2.2 动态文件表3.2.3 动态字段表3.2.4 动态值表 四、系统展示五、核心代码5.1 查询档案类型5.…

(四)优化函数,学习速率与反向传播算法--九五小庞

多层感知器 梯度下降算法 梯度的输出向量表明了在每个位置损失函数增长最快的方向,可将它视为表示了在函数的每个位置向那个方向移动函数值可以增长。 曲线对应于损失函数。点表示权值的当前值,即现在所在的位置。梯度用箭头表示,表明为了增…

GEE入门篇|图像处理(三):阈值处理、掩膜和重新映射图像

阈值处理、掩膜和重新映射图像 本章前一节讨论了如何使用波段运算来操作图像, 这些方法通过组合图像内的波段来创建新的连续值。 本期内容使用逻辑运算符对波段或索引值进行分类,以创建分类图像。 1.实现阈值 实现阈值使用数字(阈值&#xf…

PXE网络启动实战(第一篇 启动WinPE)

免责声明:文中有一些图片来源自网络,如有版权请通知我删除,谢谢! 目录 一、无盘站 二、PXE启动 三、PXE启动原理 四、启动WinPE 1、服务器准备 2、客户端 3、TFTP服务 4、WinPE选择 5、具体操作: 预告 一、无盘站 网络启动最早用于无盘系统,那时的电脑只配备软…

【python量化】多种Transformer模型用于股价预测(Autoformer, FEDformer和PatchTST等)_neuralforecast

写在前面 在本文中,我们利用Nixtla的NeuralForecast框架,实现多种基于Transformer的时序预测模型,包括:Transformer, Informer, Autoformer, FEDformer和PatchTST模型,并且实现将它们应用于股票价格预测的简单例子。 …

Libero集成开发环境中Identify应用与提高

Libero集成开发环境中Identify应用与提高 Identify的安装