STM32CubeMX串口通讯

2023-05-16

串口的简单介绍

RS-232与TTL

根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准。而STM32的串口是TTL电平标准的。如果需要使用到RS-232则需要一个电平转换芯片。

单工通信、半双工通信和全双工通信

讲到串口,我们还需要具备这些基础概念。

单工通讯

(1)单工通讯特点很简单,就是只有一个发送端,一个接收端。从一开始发射端和接收端就已经确立,无法改变,数据传输只能从发送端向接收端发送

(2)举个生活中的例子,你可以理解为某些霸道的家长,从一开始就已经确定了他是发射端,小孩只能被动接收。只能是家长教育孩子,不能孩子指正家长。

半双工通信

(1)半双工通信的特点就是,双方既可以是发送端又可以是接收端。不过问题在于,每一次数据传输过程中,任何一方只能为一种状态。如果你是接收端,就只能是接收端。如果你是发送端,那么就只能是发送端。

(2)以生活中能够见到的对讲机为例,当A在对讲机中说话的时候。B只能听,不能说话。如果B要说话了,那么需要等待A说话完成之后,B才能说话。

全双工通信

(1)在全双工传输模式下,发送方和接收方之间的通信可以同时进行,我可以是发送端的同时,又是接收端

(2)以我们打电话为例子。如果A打电话给B,B听到了与A不同的意见的时候,B可以在A说话的同时陈述自己的观点,也就是插嘴。(不礼貌,手动狗头)

(3)STM32的串口就是全双工的,不过一般都是使用半双工的方式收发信息

串口作用以及需要配置的东西

(1)串口通讯作为最常用的通讯手段之一,作用许多。最常见的就是使用蓝牙模块或者是WIFI模块进行通讯,也可以实现与OpenMV实现通讯。

(2)串口一般都有波特率,数据位,校验位,停止位,流控需要配置。为什么需要配置这些东西呢?因为两个不同的设备进行交流的时候,需要在同一个频道上。就好比,一个只会说中文的人与一个只会说英文的人是无法进行沟通的。

既然两个人要需要共同,那么只要说一种语言就行了,为什么还有这么多配置呢?接下来我一一介绍。 

波特率

(1)串口其实分为两种UART(异步通信)和USART(同步通讯)。这两者的区别是什么呢?

(2)同步通讯你可以理解为你打电话给别人,电话双方都是同时沟通交流的。

(3)而异步通讯,你可以理解为电话留言。我发一段话给你,你不在没关系,有时间的时候听就可以了。我们一般使用异步通讯

数据位

数据位,决定了通信过程中传输的有效数据位数,数据位通常有5、6、7 、8 bit,根据需要进行相应的配置一般配置为8bit,因为一个字节就是8bit

校验位

有时候,我们需要对接收到的数据进行判断是否正确。因为有时候进行数据交互过程中,可能受到一些外接干扰。一般来说会有4中校验方式。偶校验、奇校验、1校验和0校验。

偶校验:有效数据和校验位中“1”的个数为偶数。比如有效数据:11001010, 此时有效数据“1”的个数为 4 个,所以偶校验位为“0”。如果我们接收到的数据,查看偶校验位为1,表示数据受到干扰。

奇校验:有效数据和校验位中“1”的个数为奇数。比如有效数据:01101001, 此时总共有 4 个“1”,为达到奇校验效果,校验位为“1”。如果我们接收到的数据,查看奇校验位为0,表示数据受到干扰。

1校验:无论什么内容,校验位永远是1。如果受到的数据,校验位是0,表示数据受到干扰。

0校验:无论什么内容,校验位永远是0。如果受到的数据,校验位是1,表示数据受到干扰。

停止位

(1)停止位一般有1,1.5,2。因为不同设备的时钟可能有偏差,就好像即使是双胞胎也有不同一样。

(2)而微小的时钟偏差,会出现微弱的不同步现象。只进行一次数据传输还好,当我们进行多次数据传输之后,这个不同步会逐渐放大,最后导致数据传输有问题。所以停止位还提供了一次校正时钟同步的机会。

(3)这个过程就好像是一条笔直的路线,汽车一直往前开。假如司机不小心动了一点点方向盘,只走几十米可能看不出来偏差。但是假如再走个几百米,就能够看到明显偏移了路线。所以司机需要不断修正方向盘保持直行。

流控

(1)这个对于很多刚入门的人不会关注,都是直接设置无流控的,我也没用过。还是简单介绍一下。

(2)因为两个不同的设备对数据的处理速度不同,可能导致丢失数据的情况。比如A向B发送数据,A的处理速度极快,不断给B发送数据。但是B处理速度可能慢一点,会接收不过来,导致数据丢失。

(3)举个例子。就像我们上模电课,老师思路敏捷,滔滔不绝。但是我们对这些知识的处理速度可能会慢一点。这样就会导致,做作业的时候,很奇怪,这个东西讲过吗?

(4)流控又分为硬件流控与软件流控。硬件流控就是 RTS (Require ToSend,发送请求)和CTS (Clear ToSend,发送允许)这两个引脚。这个时候串口通讯就不再是只有GND,TX,RX这三个了,将会增加RTS 和CTS 这两个引脚。

(5)一般不用流控。需要更深了解的,自行学习

最后强调一点!

TX(Transmit )发送数据,需要与另外一个MCU的RX连接(Receive )。两边的GND要连接,因为都需要知道对方的基准电压是多少!

STM32CubeMX配置

时钟配置

还是和之前的一样步骤

UART配置

生成文件 


Keil编程

查看 MX_USART1_UART_Init();

我发现我生成的串口文件里面没用进行串口使能,即使我再CubeMX里面设置了。

所以你们要看看__HAL_UART_ENABLE_IT()这个函数。

 

void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
 /*使能串口接收断 */
  __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);  

}

编写中断服务程序

在stm32f1xx_it.c中找到void USART1_IRQHandler(void)。

void USART1_IRQHandler(void)
{
  uint8_t ch=0; 
  
	if(__HAL_UART_GET_FLAG( &UartHandle, UART_FLAG_RXNE ) != RESET)
	{		
    ch=( uint16_t)READ_REG(UartHandle.Instance->DR);
    WRITE_REG(UartHandle.Instance->DR,ch); 
 
	}
}

代码解析

其实也没什么可以说的。就讲解一下中断服务函数部分。

__HAL_UART_GET_FLAG()

(1)因为串口中断由多种行为引起,比如主控发送数据可以引起,主控接收到数据也可以引起。所以我们需要知道到底是那种行为引起的中断。

(2)一般只要了解接收中断即可,所以我只讲接收中断部分。

	if(__HAL_UART_GET_FLAG( &huart1, UART_FLAG_RXNE ) != RESET)
	{		

	}

(1)huart1就是你在串口初始化的时候STM32CubeMX定义的。你复制后面这个部分写在huart1位置即可。

(2)后面的UART_FLAG_RXNE表示接收中断。

(3)如果是接收中断,__HAL_UART_GET_FLAG()将会返回SET,如果不是接收中断返回RESET。这个if就是用来判断是否为接收中断,如果是接收中断进入if语句。

READ_REG()和WRITE_REG()

这个不是函数,是宏定义。我们鼠标点击READ_REG,然后按F12。即可查看他的定义。

#define WRITE_REG(REG, VAL)   ((REG) = (VAL))

#define READ_REG(REG)         ((REG))

(1)其实这个就是直接寄存器操作,操作DR寄存器。

(2)无论是发送的数据还是接收的数据我们都存放在DR寄存器中,如果是发送数据,那么就让DR寄存器写入数据。如果是接收数据,那么就将DR寄存器的数据存入变量中。

(3)所以READ_REG()是读取数据,WRITE_REG()是发送数据。

 

如果要更改发送接收数据的串口怎么办?

/*****usart.c*****/
UART_HandleTypeDef huart1;  //假如这个是串口1的结构体
UART_HandleTypeDef huart2;  //假如这个是串口2的结构体

/***stm32f1xx_it.c***/

void USART1_IRQHandler(void)  //串口1中断函数
{
  uint8_t ch=0; 
  
	if(__HAL_UART_GET_FLAG( &huart1, UART_FLAG_RXNE ) != RESET)
	{		
    ch=( uint16_t)READ_REG(huart1.Instance->DR);
    WRITE_REG(huart1.Instance->DR,ch); 
 
	}
}

void USART2_IRQHandler(void) //串口2中断函数
{
  uint8_t ch=0; 
  
	if(__HAL_UART_GET_FLAG( &huart2, UART_FLAG_RXNE ) != RESET)
	{		
    ch=( uint16_t)READ_REG(huart2.Instance->DR);
    WRITE_REG(huart2.Instance->DR,ch); 
 
	}
}

实验

软件准备

需要一个串口工具。gitee仓库自取

材料准备

 需要一个TTL转串口模块。TX——RX,GND——GND,3.3——3.3。

实验结果

 电脑发送什么,单片机就回什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeMX串口通讯 的相关文章

  • STM32CubeMX代码第一次烧录后无法再识别STM32

    本文记录的是我在烧录时出现的问题 xff0c 具体细节会因为使用的软件或者STM32不同而不同 在使用STM32CubeMX生成的代码 xff0c 经过keil5编写后 xff0c 使用usb接口烧录进STM32然后发现keil5中再也识别
  • STM32CUBEMX的freertos一般使用方法笔记

    一 使用STM32CubeMX创建FreeRTOS操作系统 LED闪烁的配置 接下来配置时钟 xff0c 点击生成 此处为用户代码编写处 xff1b 开启这个选项便可以使用更加精确的延时 在代码区添加 便可以 xff01 二 任务挂起和取消
  • STM32CubeMX 下载和安装 详细教程

    HAL库 STM32CubeMX开发 STM32F407 目录 STM32CubeMX安装包 Win 6 6 1 下载链接 STM32CubeMX 下载 步骤1 xff1a 点击官网链接下载 官网下载地址 xff1a https www s
  • MDK-ARM与STM32CubeMX软件的下载及安装

    一 STM32CubeMX 的下载及安装 第一步 xff1a 下载应用软件 1 1 软件下载地址 xff1a www st com stm 32 cubemx 1 2 JAVA开发环境的搭建 xff0c JAVA下载地址 xff1a www
  • 第20章 USART—串口通讯—零死角玩转STM32-F429系列

    第20章 USART 串口通讯 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege 本章参考
  • STM32CubeMX的下载以及安装

    第一步 xff1a 安装应用软件 下载STM32CubeMX软件并安装 xff1b 第二步 xff1a 安装MCU固件包 在线安装用户所选的STM32微控制器对应的MCU固件包 具体操作步骤如下 xff1a 软件的下载地址 xff1a ht
  • 1、STM32CubeMX和STM32Cube库(HAL)详细介绍

    目录 前言 STM32Cube生态 STM32Cube 是什么 xff1f STM32Cube 软件工具套件 STM32Cube Embedded 软件 STM32CubeMX 编辑 前言 也许大家在学习正点原子或者其他32视频和代码的时候
  • 【STM32CubeMX】使用STM32F103C8T6输出PWM波形实现呼吸灯

    STM32CubeMX 使用STM32F103C8T6输出PWM波形实现呼吸灯 一 关于PWM二 Cube MX创建工程三 修改代码四 效果展示五 总结六 参考与代码下载 一 关于PWM 1 关于PWM 含义 PWM xff08 Pulse
  • STM32CubeMX串口通讯

    串口的简单介绍 RS 232与TTL 根据通讯使用的电平标准不同 xff0c 串口通讯可分为 TTL 标准及 RS 232 标准 而STM32的串口是TTL电平标准的 如果需要使用到RS 232则需要一个电平转换芯片 单工通信 半双工通信和
  • NVIDIA Jetson Xavier NX 串口通讯(发送YOLO检测结果)(记录)

    目录 NVIDIA Jetson Xavier NX串口cutecom助手测试发送YOLO检测结果 开始之前声明 xff1a 本文在NVIDIA Jetson Xavier NX上跑YOLOv4模型 xff0c 配合ZED相机实时检测 xf
  • 串口通讯UART/RS232/RS485/RS-422笔记

    串口通讯详解笔记 串口通讯概述串口通讯传输数据帧的结构UARTRS232RS485RS 422RS 232 RS 422和RS 485的主要区别 xff08 重要 xff09 串口通讯概述 串口通讯是指数据按位 xff08 bit xff0
  • 【STM32】 STM32 F4 串口通讯

    概念 串口 xff0c 即串行接口 xff0c 是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去 xff0c 同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件 串口通信 xff08 Serial Commu
  • STM32串口通讯(接收完成一整个数据帧再将数据发送出去)

    STM32串口通信可以分为查询 xff0c 中断 xff0c DMA三种方式进行通讯 xff0c 本文主要就中断的方式进行讲解 采用中断的方式进行通讯时 xff0c 可以使能接受非空中断 xff08 RXNE xff09 xff0c 当接收
  • NX串口通讯windows

    我用windows与NX进行通讯 xff0c 用的线是CH340下载线 USB端连接windows xff0c 绿色的TXD连接NX的10号 RXD xff0c 白色的RXD连接NX的8号 TXD 目录 1 windows端 2 NX端 2
  • DSPF28335 SCI FIFO串口通讯

    在工作过程中 xff0c 通过串口进行上位机与控制器之间进行数据的传输 xff0c 标准的串口通讯容易造成数据的丢失和内存堆满的现象 xff0c 便使用SCI中的FIFO对数据进行中断处理 一 串口通信基本知识 F28335 处理器共有 3
  • STM32CubeIDE使用笔记(02):STM32CubeMX配置与代码生成

    文章目录 目的 用户界面 引脚输出和配置 时钟配置 项目管理 工具 代码生成 更换芯片 总结 目的 STM32CubeIDE中整合了STM32CubeMX用来配置芯片资源生成初始化代码 本篇将介绍STM32CubeMX使用方法 用户界面 界
  • 用 STM32 通用定时器做微秒延时函数(STM32CubeMX版本)

    概述 在使用 DHT11 的时候 时序通信需要微秒来操作 STM32CubeMX 自带一个系统时钟 但是实现的是毫秒级别的 因此就自己用通用计时器实现一个 文章目录 概述 1 配置定时器时钟 2 计数器时钟频率及计数模式 预分频系数 计数器
  • STM32CUBEMX F103 HAL库开发 两路定时器的Encoder编码器模式

    机器人开发过程中 对于直流电机来说 编码器至关重要 它不仅可以使我们对电极进行精确的速度闭环 位置闭环 还可以通过时间积分 根据运动学关系 获得速度 位置等信息 STM32的定时器有编码器模式 大大的方便我们的开发 使用STM32cubeM
  • warning: #940-D: missing return statement at end of non-void function “fgetc“解决方案

    问题描述 warning 940 D missing return statement at end of non void function fgetc 解决方案 解决措施 引入头文件stdio h
  • STM32CubeMX 生成工程步骤图文说明

    本文也适合STM32CubeMX 支持的所有芯片的设置 调整文章结构 添加图文说明 2022 2 增加其他应用章节 增加 ADC 设置说明 2023 3 考虑到增加的内容越来越多 修改文章标题 增加PWM设置说明 2023 4 增加 DAC

随机推荐

  • Hal库_stm32开发之串口IDLE空闲中断+DMA接收不定长数据并修改数据

    本文写自于博主编写平衡智能车程序的时候 xff0c 由于中断使用的较多 xff0c 如定时器中断 xff0c 串口中断等等 为了避免MCU运行程序时卡死 xff0c 我就将串口中断改为串口IDLE空闲接收中断 可以实现不定长数据的接收 xf
  • PCB学习(一)——立创EDA边框设置

    一 伴随原理图转PCB生成的边框 通过在 原理图界面 点击 设计 下的 原理图转PCB xff08 Alt 43 P xff09 xff0c 可以得到如下 矩形边框 二 PCB界面设置边框 在 PCB界面 点击 工具 下的 边框设置 xff
  • c++模板类/模板函数的声明与定义应该放在头文件里

    c 43 43 模板类 模板函数的声明与定义应该放在头文件里 xff0c 不要分开来写类中函数的声明与定义 xff08 比如在 H文件里声明某个成员函数 xff0c 在 CPP文件里定义该成员函数 xff09 xff0c 这样会导致连接错误
  • STM32的GPIO端口配置八种模式的理解

    文章目录 一 GPIO的结构框图二 八种模式1 模拟输入 xff08 GPIO Mode AIN xff09 2 浮空输入 xff08 GPIO Mode IN FLOATING xff09 3 上拉输入 xff08 GPIO Mode I
  • ESP32 micro-usb 多数据量并简单加密的串口通信

    文章目录 前言一 ESP32和上位机的环境二 上位机部分1 串口通信的准备2 数据的准备与发送 三 下位机部分1 ESP32串口通信准备2 数据的接收四 同时测试 总结 前言 最近在研究单片机与上位机的串口通信 xff0c 刚好手头有一块E
  • boost之跨平台 错误处理

    system C 43 43 中处理错误的最佳方式是使用异常 xff0c 但操作系统和许多底层AP工不具有这个能力 xff0c 它们一般使用更通用也更难以操作的错误代码来表示出错的原因 xff0c 不同的操作系统的错误代码通常不是兼容的 x
  • 记录一下vector基本用法(简单易懂)

    vector容器的初始化 vector的使用首先需要加一个头文件 include lt vector gt xff1b vector lt int gt a 最一般的初始化方法 xff0c 就是定义一个容器啊a xff1b vector l
  • MPU6050基本原理介绍及程序配置

    一 MPU6050简介 1 内部主要结构 xff1a 陀螺仪 加速度计 数字运动处理器DMP xff08 Digital Motion Processor xff09 PS MPU6050还含有第二IIC接口 xff0c 用于连接一个 第三
  • Robomaster上位机视觉摘要——比赛规则篇

    本文是笔者多日来总结的2023赛季中针对上位机组的比赛规则摘要 xff0c 力求一文让你看懂上位机在赛场中的飒爽身影 目录 电力元件 电池 遥控器 激光 涂装 机器人 飞镖 雷达 空中机器人 工程机器人 哨兵机器人 英雄与步兵机器人 视觉应
  • C语言:结构体——关于内存字节对齐图文详解

    前言 xff1a 我们在学到c语言内存管理的时候总是一遍惊叹 xff0c 其聪明的内存管理策略 xff0c 一遍抱怨其难以理解的方法 xff0c 网上的资料要不讲究的太详细 xff0c 要不没能讲解清楚 xff0c 今天我们根据实例来学习一
  • 结构体+联合体 详解

    文章目录 一 结构体1 结构体变量2 特殊声明3 结构体的引用1 嵌套调用2 自引用 三 结构体的初始化四 结构体的内存对齐1 用法2 练习题3 修改对齐数 五 位段1 用法2 练习题 六 联合体1 用法2 练习题1 正常算法题2 用联合体
  • Ubuntu20.04——一篇文章让你从零配置VINS_Mono环境以及运行(2023年最新)

    注 xff1a 文末包含该文章涉及的所有安装包的网盘链接 零 换源 xff08 也可以先不换 xff0c 后面觉得下载慢再换也行 xff09 1 备份原来的源 sudo cp etc apt sources list etc apt sou
  • 学C语言推荐的书和软件—C Primer Plus和Dev C++

    写这个的目的是复习巩固C Primer Plus的知识 xff0c 我会一直更新这个系列 对于这本书 xff0c 入门C语言是完全够了 xff0c 后面的链表 队列和二叉树比较综合 xff0c 难度大一些 用这本书学C语言非常好 xff0c
  • mavlink python

    from pymavlink import mavutil Create the connection m 61 mavutil mavlink connection 39 udpin 0 0 0 0 14550 39 dir m mav
  • C++Vector浅析,Vector用法大全

    vector基本概念 功能 xff1a vector数据结构和数组非常相似 xff0c 也成为单端数组 vector与普通数组的区别 xff1a 不同之处在与数组是静态空间 xff0c 而vector可以动态扩展 动态扩展 xff1a 并不
  • 网络通信--Linux

    文章目录 网络通信的基础通信模型IP地址和端口port 网络套接字网络字节序初识UDP与TCP两种协议sockaddr结构体家族认识一些网络常用基础函数 UDP实现简单通信TCP实现简单通信总结 网络通信的基础 网络通信是建立在多层协议之下
  • Git分支和版本(标签)

    目录 一 Git分支 1 1 四大环境 xff08 分支 xff09 1 1 1 分支和标签的关系 1 2 分支的作用 1 3 演示分支 1 3 1 在Gitee中创建项目 1 3 2 克隆到本地 1 3 3 建立分支 1 3 4 切换分支
  • 前端必会算法——栈和队列

    上一篇 前端必会算法 标准快速排序 栈和队列 栈 xff08 Stack xff09 可以理解为是一个箱子 xff0c 存放东西的容器 栈结构的特点 xff1a 先入后出 xff0c 栈相当于一个箱子 xff0c 先放进去的东西被压在了下面
  • OpenMV的单颜色识别讲解

    OpenMV的官方教程 xff1a 寻找色块 xff1b single color rgb565 blob tracking示例讲解 xff1b 视频讲解 需要提前看的文章 xff1a 程序烧录 xff1b 颜色阈值设置 目录 thresh
  • STM32CubeMX串口通讯

    串口的简单介绍 RS 232与TTL 根据通讯使用的电平标准不同 xff0c 串口通讯可分为 TTL 标准及 RS 232 标准 而STM32的串口是TTL电平标准的 如果需要使用到RS 232则需要一个电平转换芯片 单工通信 半双工通信和