STM32 串口通讯

使用STM32的串口通讯,接收串口助手的数据,并且将接收到的数据返回串口,重定义printf功能。

配置引脚信息

由于每次新建工程都需要配置信息,比较麻烦,好在STM32CubeIDE提供了导入.ioc文件的功能,可以帮我们节省时间。

1.从BEEP的项目里导入ioc文件,并命名为Serial。

将串口1的mode修改为Asynchronous同步通讯,波特率为115200,数据宽度:8位,检验:None,停止位:1位。

image-20220309173020409

2.添加DMA发送通道

image-20220309174341557

3.打开串口1中断设置。

image-20220309174427994

核心代码解释

1.在BSP中新建蜂鸣器的驱动库bsp_uart.h和bsp_uart.c文件。在bsp_uart.h中增加以下内容:

/** bsp_uart.h**  Created on: Mar 4, 2022*      Author: Administrator*/#ifndef BSP_UART_H_
#define BSP_UART_H_#include "stdint.h"void USART1_Init(void);
void USART1_Send_U8(uint8_t ch);
void USART1_Send_ArrayU8(uint8_t *BufferPtr, uint16_t Length);#endif /* BSP_UART_H_ */

2.在bsp_uart.c中添加以下内容:

/** bsp_uart.c**  Created on: Mar 4, 2022*      Author: Administrator*/#include "bsp_uart.h"
#include "bsp.h"#define ENABLE_UART_DMA    1uint8_t RxTemp = 0;// Initialize USART1  初始化串口1
void USART1_Init(void)
{HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxTemp, 1);
}// The serial port sends one byte  串口发送一个字节
void USART1_Send_U8(uint8_t ch)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
}// The serial port sends a string of data  串口发送一串数据
void USART1_Send_ArrayU8(uint8_t *BufferPtr, uint16_t Length)
{#if ENABLE_UART_DMAHAL_UART_Transmit_DMA(&huart1, BufferPtr, Length);#elsewhile (Length--){USART1_Send_U8(*BufferPtr);BufferPtr++;}#endif
}// The serial port receiving is interrupted. Procedure  串口接收完成中断
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_RxCpltCallback can be implemented in the user file*/// 测试发送数据,实际应用中不应该在中断中发送数据// Test sending data. In practice, data should not be sent during interrupts  USART1_Send_U8(RxTemp);// Continue receiving data  继续接收数据HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxTemp, 1);
}#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{/* Place your implementation of fputc here *//* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);return ch;
}

USART1_Init():初始化串口相关内容,开启串口接收1个数据。

image-20220309183608315

USART1_Send_U8(ch):串口1发送一个字节。

image-20220309183632327

USART1_Send_ArrayU8(BufferPtr,Length):串口1发送一串数据,BufferPtr是数据的首地址,Length是数据的长度。ENABLE_UART_DMA是串口1 DMA的开关。

image-20220309183656718

3.由于串口1接收中断只进行一次,所以接收数据后需要再次调用接收数据。这里为了方便测试,所以在中断调用串口发送数据,实际应用中不应该在中断中发送数据,串口发送数据比较耗时,可能导致丢包甚至串口出错等问题。

image-20220309183851258

4.重新定义printf使用串口1发送数据。

image-20220309184205569

5.在BSP初始化中,调用USART1_Init()函数,请求接收数据。

image-20220310092311388

//bsp.c
#include "bsp.h"// LED显示当前运行状态,每10毫秒调用一次,LED灯每200毫秒闪烁一次。
// The LED displays the current operating status, which is invoked every 10 milliseconds, and the LED blinks every 200 milliseconds.  
static void Bsp_Led_Show_State_Handle(void)
{static uint8_t led_count = 0;led_count++;if (led_count > 20){led_count = 0;LED_TOGGLE();}
}// The peripheral device is initialized  外设设备初始化
void Bsp_Init(void)
{Beep_On_Time(50);USART1_Init();
}// main.c中循环调用此函数,避免多次修改main.c文件。
// This function is called in a loop in main.c to avoid multiple modifications to the main.c file
void Bsp_Loop(void)
{// Detect button down events   检测按键按下事件if (Key1_State(KEY_MODE_ONE_TIME)){Beep_On_Time(50);static int press = 0;press++;printf("press:%d\n", press);}Bsp_Led_Show_State_Handle();// The buzzer automatically shuts down when times out   蜂鸣器超时自动关闭Beep_Timeout_Close_Handle();HAL_Delay(10);
}

 

6.在按键按下后,增加printf()函数,通过串口1打印信息。

image-20220310092529061

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2022 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "bsp.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */Bsp_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){Bsp_Loop();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

实验效果

烧录程序后,LED灯每隔200毫秒闪一次,将扩展板通过micro-USB数据线与电脑连接后并打开串口助手(具体参数如下图所示),每按一次按键,蜂鸣器都会响50毫秒,可以看到串口助手会显示press:xx,每按一次按键xx自动加1。串口助手发送字符a,扩展板会自动将字符a返回。由于上面使用在中断中发送数据,所以不能一次发送太多个字符,否则会出现字符丢失甚至串口错误。

image-20220310094043392

 

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

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

相关文章

华为Mate 70系列,将首发搭载纯血鸿蒙正式版,第四季度登场

ChatGPT狂飙160天,世界已经不是之前的样子。 更多资源欢迎关注 6月22日消息,华为在HDC 2024上已经宣布,HarmonyOS NEXT开启开发者先锋用户Beta测试。 首批覆盖Mate 60系列、Mate X5系列、MatePad Pro 13.2英寸。 根据官方公布的时间表&…

Sublime Text for Mac v4.0 【注册汉化版】代码编辑器(保姆级教程,简单易懂,轻松上手)

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、Sublime Text 安装出现“软件已损坏,无法打开。要移到废纸篓”问题,解决办法: 2、汉化补丁安装3、输入注册码4、查询使用期限 安装完成!!! 效果 一、下…

【牛客深信服总结】

1.反转链表 2.协议 交换机路由器 3.手写代码,一个二叉树,从根节点到叶子结点算一条路径,打印出所有路径。 4.一些数据结构相关的问题,包括栈和队列的应用,链表和数组的区别,最大堆和最小堆,动态…

OpenCV机器学习-人脸识别

一 基本概念 1 计算机视觉与机器学习的关系 计算机视觉是机器学习的一种应用,而且是最有价的应用。 2 人脸识别 哈尔(haar)级联方法 Harr是专门为解决人脸识别而推出的; 在深度学习还不流行时,Harr已可以商用; 深度学习方法&am…

示例:WPF中如何绑定ContextMenu和Menu

一、目的:开发过程中,有些模块的右键ContextMenu菜单是需要动态显示的,既是根据不同条件显示不同的菜单,很多是通过代码去生成ContextMenu的MenuItem,本文介绍通过绑定的方式去加载ContextMenu,Menu菜单栏的…

【操作系统】期末复习,一篇就够了!【全面】

并发是指多个事件在同一时间间隔内发生 并行是指多个事件在同一时刻发生 设计实时操作系统时,首先应该考虑的是( ) B、实时性和可靠性 .单道批处理系统的主要缺点是( ) A、CPU利用率不高 批处理系统的主要缺点是&…

家政预约小程序14权限配置

目录 1 创建用户2 创建角色3 启用登录4 实现退出总结 我们现在小程序端的功能基本开发好了,小程序开发好之后需要给运营人员提供管理后台,要分配账号、配置权限,我们本篇就介绍一下权限如何分配。 1 创建用户 在微搭中,用户分为内…

简单了解ESD模型与TLP曲线

上文讲了ESD和EOS的区别,说实话远不止那些。今日再稍加深入的介绍ESD。 一 ESD原理 ESD-Electro Static Discharge静电放电,具有不同静电电位的物体互相靠近或者直接接触引起的电荷转移。正常情况下,物体内部的正负电荷是相等的&#xff0c…

RMDA通信1:通信过程和优势,以太网socket为何用户空间拷贝到内核空间

视频分享: 1.1 RDMA基本原理和优势,以太网socket通信为什么要用户空间拷贝到内核空间_哔哩哔哩_bilibili 一、以太网socket通信 1.1 以太网socket通信过程 1、发送端发起一次通信操作,数据由用户空间拷贝到内核空间。拷贝由CPU完成&#x…

【YOLO 系列】基于YOLO V8的车载摄像头交通信号灯检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

前言 随着智能交通系统的发展,交通信号灯的准确识别对于提高道路安全和交通效率具有至关重要的作用。传统的交通信号灯识别方法依赖于固定的传感器和摄像头,存在安装成本高、维护困难等问题。为了解决这些问题,我们启动了这个项目&#xff0…

中文邮件模板之向论文的作者咨询论文相关问题

目录 1. 内容 2. 邮件昵称 3. 格式很重要! 1. 内容 尊敬的: 您好,很抱歉在您百忙之中打扰您。 我是大学的一名硕士生,最近在做项目【】,您发表的论文【】给了我很大的启发。 论文中没有给出具体参数,如和…

React+TS 从零开始教程(2):简中简 HelloWolrd

源码链接:https://pan.quark.cn/s/c6fbc31dcb02 这一节,我们来见识ReactTS的威力,开始上手开发第一个组件,什么组件呢? 当然是简中简的 HelloWolrd组件啦。 在src下创建一个components,然后新建Hello.tsx …

CVPR2023论文速览Transformer

Paper1 TrojViT: Trojan Insertion in Vision Transformers 摘要原文: Vision Transformers (ViTs) have demonstrated the state-of-the-art performance in various vision-related tasks. The success of ViTs motivates adversaries to perform backdoor attacks on ViTs.…

一款有趣的Python库绘制风向图,小白容易上手

利用 Python 绘制风向图 绘制风向图通常使用 matplotlib 库的 Barbs 类来实现.这个类用于绘制风向和风速的矢量场,可以实现不同的风向图风格. 安装 ## 命令安装 matplotlib 库:pip install matplotlib用法 下面是一个简单的示例代码,绘制风向图: 使…

虚拟现实环境下的远程教育和智能评估系统(十三)

管理/教师端前端工作汇总education-admin: 首先是登录注册页面的展示 管理员 首页 管理员登录后的首页如下图所示 管理员拥有所有的权限 课程管理 1、可以查看、修改、增添、删除课程列表内容 2、可以对课程资源进行操作 3、可以对课程的类别信息进行管理&…

java的输出流File OutputStream

一、字节输出流FileOutput Stream 1、定义 使用OutputStream类的FileOutput Stream子类向文本文件写入的数据。 2.常用构造方法 3.创建文件输出流对象的常用方式 二、输出流FileOutputStream类的应用示例 1.示例 2、实现步骤 今天的总结就到此结束啦,拜拜&#x…

【Web APIs】DOM 文档对象模型 ⑤ ( 获取特殊元素 | 获取 html 元素 | 获取 body 元素 )

文章目录 一、获取特殊元素1、获取 html 元素2、获取 body 元素3、完整代码示例 本博客相关参考文档 : WebAPIs 参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/APIgetElementById 函数参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/API/Document/getE…

I2C总线8位IO扩展器PCF8574

PCF8574用于I2C总线的远程8位I/O扩展器 PCF8574国产有多个厂家有替代产品,图示为其中一款HT8574 1 产品特点 低待机电流消耗:10 uA(最大值) I2C 转并行端口扩展器 漏极开路中断输出 与大多数微控制器兼容 具有大电流驱动能力的闭…

嵌入式系统中的加解密签名

笔者来了解一下嵌入式系统中的加解密 1、背景与名词解释 笔者最近在做安全升级相关的模块,碰到了一些相关的概念和一些应用场景,特来学习记录一下。 1.1 名词解释 对称加密:对称加密是一种加密方法,使用相同的密钥(…

IDEA各种实体类运行爆红,不运行就没事

1.问题描述 如图所示,后端项目的import的各种entity爆红,点击也有导入包的提示,且这种报红几乎遍布了整个工程项目 2.我的解决方案 清空缓存,然后把target文件删掉,重新跑 3.小结 idea项目有时候就是一个核弹&…