使用UART和USART在STM32上进行双向通信

在本文中,我们将深入了解如何在STM32上使用UART(通用异步收发传输器)和USART(通用同步异步收发传输器)实现双向通信。UART和USART是常见的串口通信协议,通常用于与其他设备进行数据传输。我们将重点介绍如何配置UART和USART外设,以及如何在STM32中实现双向通信。

首先,我们需要选择适当的引脚,并在STM32的引脚配置中进行设置。假设我们选择了UART1和USART1,并将它们连接到两个不同的外部设备。下面是配置引脚的代码示例:

```c
// 引脚配置
GPIO_InitTypeDef GPIO_InitStruct = {0};// 使能GPIO时钟
__HAL_RCC_GPIOA_CLK_ENABLE();// 配置UART引脚
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置USART引脚
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_UART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```

在上述代码中,我们启用了GPIOA的时钟,并将引脚9和引脚10设置为UART1的引脚。我们将引脚2和引脚3设置为USART1的引脚。这些引脚配置具体取决于你所选择的UART和USART外设以及引脚的可用性。

接下来,我们需要配置UART和USART外设,以使它们可以进行数据传输。我们分别配置UART1和USART1的示例代码如下:

```c
// UART配置
UART_HandleTypeDef huart1 = {0};// 使能UART时钟
__HAL_RCC_USART1_CLK_ENABLE();// 配置UART
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();
}// USART配置
USART_HandleTypeDef husart1 = {0};// 使能USART时钟
__HAL_RCC_USART1_CLK_ENABLE();// 配置USART
husart1.Instance = USART1;
husart1.Init.BaudRate = 115200;
husart1.Init.WordLength = USART_WORDLENGTH_8B;
husart1.Init.StopBits = USART_STOPBITS_1;
husart1.Init.Parity = USART_PARITY_NONE;
husart1.Init.Mode = USART_MODE_TX_RX;
husart1.Init.CLKPolarity = USART_POLARITY_LOW;
husart1.Init.CLKPhase = USART_PHASE_1EDGE;
husart1.Init.CLKLastBit = USART_LASTBIT_DISABLE;if (HAL_USART_Init(&husart1) != HAL_OK)
{// 初始化错误处理Error_Handler();
}
```

在上述代码中,我们先分别启用了UART1和USART1的时钟。然后,我们对它们进行了相应的配置。对于UART1,我们设置了波特率为9600,字长为8位,停止位为1,无奇偶校验。我们使能了发送和接收模式,同时禁用了硬件流控制。对于USART1,我们设置了波特率为115200,字长为8位,停止位为1,无奇偶校验。我们使能了发送和接收模式,设置了时钟极性和时钟相位,同时禁用了最后一位时钟。

现在,我们已经成功配置了UART和USART的引脚和外设参数。我们可以使用HAL库提供的函数来发送和接收数据。下面是通过UART和USART进行数据传输的代码示例:

```c
// UART发送数据
uint8_t uart_data_to_send[10] = "Hello UART!";
HAL_UART_Transmit(&huart1, uart_data_to_send, 11, HAL_MAX_DELAY);// UART接收数据
uint8_t uart_data_received[10];
HAL_UART_Receive(&huart1, uart_data_received, 10, HAL_MAX_DELAY);// USART发送数据
uint8_t usart_data_to_send[10] = "Hello USART!";
HAL_USART_Transmit(&husart1, usart_data_to_send, 12, HAL_MAX_DELAY);// USART接收数据
uint8_t usart_data_received[10];
HAL_USART_Receive(&husart1, usart_data_received, 10, HAL_MAX_DELAY);
```

在以上代码中,我们通过HAL_UART_Transmit和HAL_UART_Receive函数分别对UART进行发送和接收数据。通过HAL_USART_Transmit和HAL_USART_Receive函数分别对USART进行发送和接收数据。我们通过传递发送缓冲区的指针、数据长度以及最大延迟时间来实现数据的发送和接收。

最后,我们需要处理可能发生的错误。例如,如果在发送或接收期间发生了错误,我们可以使用回调函数来处理它们(与前面的文章中提到的错误回调函数类似)。

以上是使用UART和USART在STM32上进行双向通信的一个简单示例。通过适当的引脚配置和外设参数设置,我们可以轻松实现双向通信,并进行数据的发送和接收。

【代码】:
完整的代码示例如下:

```c
#include "stm32f4xx_hal.h"// 错误处理函数
void Error_Handler(void)
{while (1){// 错误处理}
}// UART错误回调函数
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1){// 处理UART错误Error_Handler();}
}// USART错误回调函数
void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart)
{if (husart->Instance == USART1){// 处理USART错误Error_Handler();}
}int main(void)
{// 引脚配置GPIO_InitTypeDef GPIO_InitStruct = {0};// 使能GPIO时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 配置UART引脚GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置USART引脚GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_UART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// UART配置UART_HandleTypeDef huart1 = {0};// 使能UART时钟__HAL_RCC_USART1_CLK_ENABLE();// 配置UARThuart1.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();}// USART配置USART_HandleTypeDef husart1 = {0};// 使能USART时钟__HAL_RCC_USART1_CLK_ENABLE();// 配置USARThusart1.Instance = USART1;husart1.Init.BaudRate = 115200;husart1.Init.WordLength = USART_WORDLENGTH_8B;husart1.Init.StopBits = USART_STOPBITS_1;husart1.Init.Parity = USART_PARITY_NONE;husart1.Init.Mode = USART_MODE_TX_RX;husart1.Init.CLKPolarity = USART_POLARITY_LOW;husart1.Init.CLKPhase = USART_PHASE_1EDGE;husart1.Init.CLKLastBit = USART_LASTBIT_DISABLE;if (HAL_USART_Init(&husart1) != HAL_OK){// 初始化错误处理Error_Handler();}// UART发送数据uint8_t uart_data_to_send[15] = "Hello UART!";HAL_UART_Transmit(&huart1, uart_data_to_send, strlen(uart_data_to_send), HAL_MAX_DELAY);// UART接收数据uint8_t uart_data_received[15];HAL_UART_Receive(&huart1, uart_data_received, 14, HAL_MAX_DELAY);// USART发送数据uint8_t usart_data_to_send[15] = "Hello USART!";HAL_USART_Transmit(&husart1, usart_data_to_send, strlen(usart_data_to_send), HAL_MAX_DELAY);// USART接收数据uint8_t usart_data_received[15];HAL_USART_Receive(&husart1, usart_data_received, 14, HAL_MAX_DELAY);while (1){// 主循环}
}
```

以上是一个简单的例子,介绍了如何使用UART和USART在STM32上进行双向通信。你可以根据实际需求进行修改和扩展。

 嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击这里,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦。 

​ 点击链接扫码进入嵌入式交流群 ​https://fss.mpay8.cn/article/dmrjinh2C6fjejm

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

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

相关文章

基于PaddleSeg开发的人像抠图web api接口

前言 基于PaddleSeg开发的人像抠图web api接口,提取官方代码,适配各种系统,通过api的接口进行访问。 环境要求 1、Python3.7以上 2、源码(文章最后下载) 源码结构 测试module.py中添加如下代码: if __na…

字符串函数strlen的用法详解及其相关题目

strlne函数的使用 一.strlen函数的声明二.strlen函数的头文件三.相关题目代码1代码2题目1题目2题目3题目4题目5题目6 一.strlen函数的声明 size_t strlen ( const char * str );二.strlen函数的头文件 使用strlen函数我们需要使用以下头文件 #include <string.h>三.相…

Powercli常用命令

背景 vcenter web界面不如命令行快&#xff0c;且不能批量操作。 根据实际需求逐步补充使用到的powercli 命令。 00 通过bat脚本配置terminal标签页 在WindowsTerminal上配置新的标签页&#xff0c;实现打开标签页即默认连接vcenter。 脚本内容如下&#xff1a; echo off p…

Unity中C#使用协程控制Shader材质变化

文章目录 前言一、协程是什么二、在Unity中使用协程1、我们在 Start 中测试一下协程的执行顺序2、我们实现一个点击按钮实现角色受击效果 三、协程中的动画过渡1、首先&#xff0c;在协程内实现中毒并且消散的效果2、在 OnGUI 内&#xff0c;给一个新按钮使用刚刚定义的协程 四…

STM32通用定时器

本文实践&#xff1a;实现通过TIM14_CH1输出PWM&#xff0c;外部显示为呼吸灯。 通用定时器简介 拥有TIM2~TIM5、TIM9~TIM14 一共10个定时器&#xff0c;具有4路独立通道&#xff0c;可用于输入捕获、输出比 较&#xff0c;同时包含了基本定时去的所有功能。 通用定时器的结…

深入分析爬虫中time.sleep和Request的并发影响

背景介绍 在编写Python爬虫程序时&#xff0c;我们经常会遇到需要控制爬取速度以及处理并发请求的情况。本文将深入探讨Python爬虫中使用time.sleep()和请求对象时可能出现的并发影响&#xff0c;并提供解决方案。 time.sleep()介绍 首先&#xff0c;让我们来了解一下time.s…

前端——html拖拽原理

文章目录 ⭐前言⭐draggable属性&#x1f496; api&#x1f496; 单向拖动示例&#x1f496; 双向拖动示例 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端——html拖拽原理。 vue3系列相关文章&#xff1a; vue3 fastapi 实现选择目录所有文…

根据已有安装的cuda配置合适的pytorch环境

目前网络上根据电脑配置安装合适的深度学习环境的帖子已经很多了&#xff0c;但是现实中会出现很久之前已经安装了对应的cuda&#xff0c;但是现在忘记了当时安装的是什么版本。本文针对这一问题展开攻略。 1 cuda安装版本查询 我们在查询自己应该安装什么版本的cuda时&#…

【模电】直流通路与交流通路

直流通路与交流通路 通常&#xff0c;在放大电路中&#xff0c;直流电源的作用和交流信号的作用总是共存的&#xff0c;即静态电流、电压和动态电流、电压总是共存的。但是由于电容、电感等电抗元件的存在&#xff0c;直流量所流经的通路与交流信号所流经的通路不完全相同。因此…

【设计模式】职责链模式设计在线文档帮助系统

职责链模式设计在线文档帮助系统 任务三&#xff1a;使用职责链模式设计在线文档帮助系统 某公司欲开发一个软件系统的在线文档帮助系统&#xff0c;用户可以在任何一个查询环境中输入查询关键字&#xff0c;如果当前查询环境下没有相关内容&#xff0c;则系统会将查询按照一定…

获取Spring容器Bean工具类

获取Spring容器Bean工具类 1、创建SpringUtils工具类2、注册 SpringUtils工具类3、如果打包的是War方式&#xff0c;可能上面两个注册工具类的方法都没用 1、创建SpringUtils工具类 public class SpringUtils implements ApplicationContextAware {private static Application…

【鸿蒙应用开发】开发环境搭建及IDE安装使用

1.下载安装包 安装包下载地址&#xff1a; 点击跳转下载页面 可以根据自己的操作系统选择对应版本下载。 本文以Windows安装为例&#xff0c;Mac安装方式相同 2. 安装 下载好后&#xff0c;打开安装包&#xff0c;进入安装界面&#xff1a; 点击Next&#xff0c;进入安…

【Vue】使用 Vue CLI 脚手架创建 Vue 项目(使用命令行创建)

前言 在开始使用Vue进行开发之前&#xff0c;我们需要先创建一个Vue项目。Vue CLI&#xff08;Command Line Interface&#xff09;是一个官方提供的脚手架工具&#xff0c;可以帮助我们快速创建Vue项目。 步骤 打开终端或命令行工具&#xff0c;运行以下命令&#xff1a; vu…

蔚碳科技联合中投会发布国内首个 ESG 尽职调查服务标准

11 月 26 日&#xff0c;蔚碳&#xff08;上海&#xff09;科技有限公司&#xff08;以下简称“蔚碳科技”&#xff09;受邀出席由深圳市人民政府主办&#xff0c;深圳市发展和改革委员会、深圳市生态环境局、龙岗区人民政府共同承办的 2023 碳达峰碳中和论坛暨深圳国际低碳城论…

手机升级到iOS15.8后无法在xcode(14.2)上真机调试

之前手机是iOS14.2的系统,在xcode上进行真机测试运行良好&#xff0c;因为想要使用Xcode的Instruments功能&#xff0c;今天将系统更新到了iOS15.8 &#xff0c;结果崩了 说是Xcode和手机系统不兼容不能进行真机测试。在网上查不好些方法&#xff0c;靠谱的就是下载相关版本的…

05、pytest断言确定的异常

官方用例 # content of test_sysexit.py import pytestdef f():raise SystemExit(1)def test_mytest():with pytest.raises(SystemExit):f()解读与实操 ​ 标准python raise函数可产生异常。pytest.raises可以断言某个异常会发现。异常发生了&#xff0c;用例执行成功&#x…

常见的几种计算机编码格式

前言&#xff1a; 计算机编码是指将字符、数字和符号等信息转换为计算机可识别的二进制数的过程&#xff0c;正因如此&#xff0c;计算机才能识别中英文等各类字符。计算机中有多种编码格式用于表示和存储文本、字符和数据&#xff0c;实际走到最后都是二进制&#xff0c;本质一…

CefSharp 获取POST(AJAX)、GET消息返回值(request)

CefSharp作为专门为爬虫工具开发的库比Selenium这种开发目的是页面测试工具然后用来做爬虫的工具要贴心得多。我们操作网页的时候发送或者做了某个动作提交表单之后需要知道我们的动作或者提交是否成功&#xff0c;因为有的页面会因为网络延迟问题提交失败&#xff0c;需要准确…

VIVADO-FFT IP核学习记录

根据用户手册使用IP核 ① 找到user guide / product guide 并打开 ② 找到Customizing and Generating the Core(不同手册可能题目不一样)&#xff0c;查看IP核的创建过程中各个参数的意义和设置方法。 ③ 找到port description &#xff0c;查看接口注释 根据网络教程使用…

微信小程序调用相机拍摄或手机相册

wx.chooseMedia(Object object) 功能描述 拍摄或从手机相册中选择图片或视频。