当前位置: 首页 > news >正文

STM32CubeMX 配置串口通信 HAL库

一、STM32CubeMX 配置串口

 

 

 

 

每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

 

二、重写fputc函数

​
#include <stdio.h>#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__*//*******************************************************************@brief  Retargets the C library printf  function to the USART.*@param  None*@retval None******************************************************************/PUTCHAR_PROTOTYPE{HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xFFFF);return ch;}​

三、配置接收中断函数

​
#define RXBUFFERSIZE    1                       /* 缓存大小 */
uint8_t  g_usart_rx_buf[200];  //接收缓冲,最大200个字节
uint16_t g_usart_rx_len;   	   //接收长度
uint8_t g_usart_rx_flag=0;	   //接收完成标志
uint8_t g_rx_buffer[RXBUFFERSIZE];       /* HAL库USART接收Buffer */在串口初始化函数中使能接收中断
/* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{  if(huart->Instance == USART1)     {g_usart_rx_buf[g_usart_rx_len] = g_rx_buffer[0] ;g_usart_rx_len++;if(g_rx_buffer[0]==0x0a){g_usart_rx_flag=1;}HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);}
}​

四、串口空闲中断接收数据

__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//空闲中断
#define USART1_MAX_RECV_LEN		1000				//最大接收缓存字节数
char USART1_RX_BUF[USART1_MAX_RECV_LEN]; 				//接收缓冲,最大USART3_MAX_RECV_LEN个字节
unsigned short USART1_RX_STA=0;   	/* USER CODE BEGIN 1 */
void USART1_IRQHandler(void)
{uint8_t res = 0;//接收中断if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) != RESET){HAL_UART_Receive(&huart1,&res,1,1000);//将数据放入缓冲区if( (USART1_RX_STA&0x7fff) < USART1_MAX_RECV_LEN){USART1_RX_BUF[USART1_RX_STA] = res;USART1_RX_STA++;}__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);}//空闲中断if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET){//一帧数据接收完成//USART1_IdleCallback(USART1_RX_BUF,USART1_RX_STA&0x7fff);USART1_RX_BUF[ USART1_RX_STA &0x7fff] = 0;USART1_RX_STA |= 1 << 15;  __HAL_UART_CLEAR_IDLEFLAG(&huart1);}
}
	if(USART1_RX_STA& 0x8000){printf("%s\r\n",USART1_RX_BUF);USART1_RX_STA=0;}

五、串口乱码原因之一

        乱码一般是配置串口波特率和上位机串口波特率不一致所致,如果两者一致,则说明系统时钟有问题,比如下面的外部晶振不匹配

         开发板上外部时钟的晶振与代码中的外部时钟的晶振不一致,使用cubemx配置时钟时要格外注意,选好芯片之后再看外部晶振是啥,不然随便设置可能乱码

相关文章:

STM32CubeMX 配置串口通信 HAL库

一、STM32CubeMX 配置串口 每个外设生成独立的 ’.c/.h’ 文件 不勾&#xff1a;所有初始化代码都生成在 main.c 勾选&#xff1a;初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。 二、重写fputc函数 ​ #include <stdio.h>#ifdef __GNUC__#def…...

GitHub的未来:在微软领导下保持独立与AI发展的平衡

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

RGB与YUV格式详解

图像处理 文章目录 图像处理前言一、RGB格式二、YUV格式三、RGB与YUV转换四、NV21转换为YUV420p五、YUV旋转 前言 在图像的世界里&#xff0c;一般使用RGB作为存储格式。而在视频的世界里&#xff0c;一般使用YUV作为压缩存储格式。有时候面试官会问&#xff1a;为什么视频使用…...

JS获取当前浏览器名称

在JavaScript中&#xff0c;获取当前浏览器名称的方法并不是一个标准的功能&#xff0c;因为浏览器厂商并没有提供一个直接的API来获取浏览器的名称。但是&#xff0c;你可以通过分析用户代理字符串&#xff08;User-Agent&#xff09;来推断出浏览器的名称。 以下是一个简单的…...

学习计算机网络(五)——ICMP协议

ICMP 协议&#xff08;Internet Control Message Protocol&#xff0c;互联网控制报文协议&#xff09;&#xff0c;主要用于在 IP 网络中传递控制消息和差错报告。 ICMP在IP系统间传递差错和管理报文&#xff0c;是任何IP实现必需和要求的组成部分。 可把ICMP报文分成两类&a…...

request.getRequestURI()与request.getRequestURL()的区别

1.返回值的区别&#xff1a; request.getRequestURL() 返回值是一个StringBuffer类型 request.getRequestURI() 返回值是一个String类型 先看 request.getRequestURL() 返回的是一个具体的地址&#xff0c;访问网页的地址 而 request.getRequestURI() 返回的是一个映射地址&a…...

3154. 到达第 K 级台阶的方案数(24.8.20)

今天发晚了&#xff0c;嘿嘿&#xff0c;玩黑神话玩的 题目 给你有一个 非负 整数 k 。有一个无限长度的台阶&#xff0c;最低 一层编号为 0 。 Alice 有一个整数 jump &#xff0c;一开始值为 0 。Alice 从台阶 1 开始&#xff0c;可以使用 任意 次操作&#xff0c;目标是到达…...

如何使用docker打包后端项目并部署到阿里云k8s集群上

如何使用docker打包后端项目并部署到阿里云k8s集群上 1. 引言 在现代软件开发中,容器化技术已经成为主流,而Kubernetes (K8s) 是管理容器的首选平台之一。本文将详细介绍如何将一个后端项目使用Docker打包,并将其部署到阿里云的Kubernetes集群上。 2. 前置条件 阿里云账号…...

ES6中解构的使用

一、提取几个属性&#xff0c;构造一个新的对象 在JavaScript中&#xff0c;你可以使用对象解构&#xff08;Object Destructuring&#xff09;来提取一个对象中的几个属性&#xff0c;并构造一个新的对象。下面是一个示例&#xff1a; 在这个例子中&#xff0c;name和email属性…...

拖拽式报表设计器优点好 实现流程化办公就靠它!

当前&#xff0c;实现流程化办公是很多企业都想要实现的目标。利用低代码技术平台、拖拽式报表设计器的优势特点&#xff0c;可以为企业降低开发成本、提升办公效率、创造更多市场价值。那么&#xff0c;您知道拖拽式报表设计器的优点是什么吗&#xff1f;通过本文一起了解拖拽…...

Spring项目:文字花园(四)

一.实现登录 传统思路: • 登陆⻚⾯把⽤⼾名密码提交给服务器. • 服务器端验证⽤⼾名密码是否正确, 并返回校验结果给后端 • 如果密码正确, 则在服务器端创建 Session . 通过 Cookie 把 sessionId 返回给浏览器. 问题: 集群环境下⽆法直接使⽤Session. 原因分析: 我们开…...

Web开发:ORM框架之Freesql的入门和技巧使用小结

目录 零、官网链接 一、字段映射表 二、查询 1.freesql独特封装&#xff1a;between关键字 2.分页&#xff08;每页 20 条数据&#xff0c;查询第 1 页&#xff09; 3.Withsql&#xff08;子查询&#xff0c;不建议&#xff09; 3.简单查询、映射查询 4.参数查询、自定义…...

软件工程(4)面向对象方法:面向对象软件工程OOSE与案例实践

OOSE&#xff08;Object-Oriented Software Engineering&#xff0c;面向对象软件工程&#xff09;是一种用于开发软件系统的工程方法论&#xff0c;它强调使用面向对象的技术和方法来设计和实现软件。OOSE 方法是由 Ivar Jacobson 提出的&#xff0c;主要包括以下几个关键方面…...

【数据结构篇】~链表算法题1(含快慢指针的解析)

前言 关于环形指针与快慢指针是算法题中的常客&#xff0c;如果能掌握将是我们的一大助力&#xff01; 1.快慢指针 1 移除链表元素​ https://leetcode.cn/problems/remove-linked-list-elements/description/ 1&#xff09;思路 这道题可以用一个新链表来保存原链表中不…...

洛谷 P1135 奇怪的电梯

链接直达&#xff1a;P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 题目来源 洛谷 题目内容 奇怪的电梯 题目背景 感谢 yummy 提供的一些数据。 题目描述 呵呵&#xff0c;有一天我做了一个梦&#xff0c;梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯&…...

vue使用axios请求后端数据

前后端分离项目的基础&#xff1a; 前后端跨域访问 vite.config.js中加入 // 1.为什么要跨域 //因为浏览器的同源策略,不同站点之间访问需要跨域 //实现跨域的方式&#xff1a;server: {proxy: {// 假设要跨域访问的后端 API 地址以 /api 开头/api: { //表示拦截以/api开头的…...

目标检测 | yolov10 原理和介绍

相关系列&#xff1a; 目标检测 | yolov1 原理和介绍 目标检测 | yolov2/yolo9000 原理和介绍 目标检测 | yolov3 原理和介绍 目标检测 | yolov4 原理和介绍 目标检测 | yolov5 原理和介绍 目标检测 | yolov6 原理和介绍 目标检测 | yolov7 原理和介绍 目标检测 | yolov8 原理和…...

基于Springboot 和Vue 的高校宿舍管理系统源码

网络上很多宿舍管理系统都不完整&#xff0c;大多数缺少数据库文件&#xff0c;所在使用极其不方便&#xff0c;由于本人程序员&#xff0c;根据代码&#xff0c;自己花时间不全了数据库文件&#xff0c;并且可以完美运行&#xff01;&#xff01;&#xff01;&#xff01;&…...

3:2比例的程序员专业显示器,效率提升显著,摸鱼时间又多了

对于我们程序员来说&#xff0c;显示器的重要性不言而喻&#xff0c;作为我们与代码交流的直接工具&#xff0c;他影响着我们的工作效率、舒适度和整体编程体验。我在家用的是自己笔记本的屏幕&#xff0c;简单写写代码还行&#xff0c;涉及到多任务协同或者大代码量开发就有点…...

vue3 cascader省市区三级联动如何指定字段,如何根据id查到对应的名字

如果我们接口数据字段名不是value和code。要加个props :props"{ value:code,label:regionName}"根据id查name需要一个ref和一个change事件<el-cascader :options"areaData" ref"addressCodeRef" change"handleChange" :props"…...

用PyTorch和ECANet18搞定RAF-DB表情分类:从数据集下载到模型部署的保姆级教程

基于ECANet18的RAF-DB表情识别实战&#xff1a;从零构建高精度分类模型 人脸表情识别&#xff08;FER&#xff09;作为计算机视觉领域的重要分支&#xff0c;在情感计算、智能交互等领域展现出巨大潜力。本文将带您完整实现一个基于PyTorch和ECANet18的端到端表情识别系统&…...

ncmdumpGUI:3分钟掌握网易云音乐ncm格式转换的终极方案

ncmdumpGUI&#xff1a;3分钟掌握网易云音乐ncm格式转换的终极方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经在网易云音乐下载了心爱的歌曲&a…...

轻量级爬虫框架slacrawl:基于规则驱动的模块化数据采集实践

1. 项目概述&#xff1a;一个轻量级、模块化的网页爬虫框架最近在做一个需要从多个网站定时抓取结构化数据的小项目&#xff0c;找了一圈现成的工具&#xff0c;要么太重&#xff08;像Scrapy&#xff0c;学起来成本高&#xff09;&#xff0c;要么太死板&#xff08;很多脚本只…...

轻量级监控系统Monikhao:自托管部署与核心架构解析

1. 项目概述&#xff1a;一个轻量级、可自托管的监控解决方案最近在折腾个人服务器和家庭网络监控时&#xff0c;发现了一个挺有意思的项目&#xff1a;khaodius/monikhao。乍一看这个名字&#xff0c;可能会觉得有点陌生&#xff0c;但如果你对自建监控系统有需求&#xff0c;…...

解放你的游戏时间:三月七小助手——星穹铁道自动化终极指南

解放你的游戏时间&#xff1a;三月七小助手——星穹铁道自动化终极指南 【免费下载链接】March7thAssistant 崩坏&#xff1a;星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 还在为《崩坏&#xff1a;星穹铁道》中重复的…...

开源项目容器镜像全流程实践:从命名规范到生产部署

1. 项目概述&#xff1a;从镜像名到开源协作生态的深度解构看到mco-org/mco这个镜像名&#xff0c;很多人的第一反应可能是去 Docker Hub 或 GitHub 上搜索&#xff0c;看看它具体是什么。但今天&#xff0c;我想从一个更本质、更实战的角度来聊聊这个话题。mco-org/mco不是一个…...

基于MCP协议的AI Agent远程SSH安全操作实践指南

1. 项目概述与核心价值最近在折腾AI Agent的开发&#xff0c;发现一个挺有意思的现象&#xff1a;很多开发者都卡在了“如何让AI安全、可控地操作远程服务器”这一步。你可能会想到直接给AI一个SSH私钥&#xff0c;但这无异于把自家大门的钥匙扔给一个还在学习走路的机器人&…...

基于Claude API构建AI代码生成工具:从API封装到工程化实践

1. 项目概述与核心价值最近在开发者社区里&#xff0c;一个名为ashish200729/claude-code-source-code的项目标题引起了不小的讨论。乍一看&#xff0c;这个标题很容易让人产生误解&#xff0c;以为这是某个知名AI模型的源代码被公开了。但作为一名在软件开发和开源领域摸爬滚打…...

Midjourney像素艺术提示词工程:98%新手忽略的4个隐藏权重指令,实测提升风格还原度320%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney像素艺术提示词工程的底层逻辑重构 像素艺术在 Midjourney 中并非天然适配的生成模态&#xff0c;其高精度、低分辨率、强风格约束的特性与扩散模型默认的连续性渲染范式存在根本张力。要实现…...

gwadd:轻量级Git仓库组管理工具,提升多项目开发效率

1. 项目概述&#xff1a;一个被低估的Git仓库管理利器如果你和我一样&#xff0c;日常工作中需要频繁地在多个Git仓库之间穿梭&#xff0c;处理各种依赖、子模块&#xff0c;或者仅仅是同步一堆相关的项目代码&#xff0c;那么你一定对那种重复、繁琐的切换和操作感到头疼。今天…...