【软件STM32cubeIDE下H73xx配置串口uart1+中断接收/DMA收发+HAL库+简单数据解析-基础样例】
#【软件STM32cubeIDE下H73xx配置串口uart1+中断接收/DMA收发+HAL库+简单数据解析-基础样例】
- 1、前言
- 2、实验器件
- 3-1、普通收发+中断接收实验
- 第一步:代码调试-基本配置
- (1)基本配置
- (3)时钟配置
- (4)保存后,就可以生成代码
- 第二步:加入prinf打印
- (1)不重复造轮子:打印相关连接
- (2)加入代码片段,注意第四步要放到main里运行
- (3)代码测试
- 第三步:加入接收代码
- (1)加入初始化配置
- (2)加入回调函数部分
- (3)加入到中断内
- 第四步:实验验证
- 3-2、DMA收发实验
- 第一步:加入DMA初始化
- 第二步:加入DMA相关数组
- 第三步:加入回调函数
- 第四步:加入到中断函数内
- 第四步:简单数据解析功能
- (1)加入接收部分代码
- (2)加入处理部分代码
- (3)测试代码
- 4、代码连接
- 5、注意细节
- (1)总是多个字符,或者多个其它字符。
- (2)复制函数的使用。
- (3)逻辑调试与测试。
- (4)十进制的1与十六进制0x31。
- (5)不同串口工具,有些信息不显示。
- (6)数据解析注意
- (7)初始化顺序不对,不运行
- (8)回调函数写的有问题,只返回一个字符
- (9)在网上找到样例,进行测试,没有成功
- 总结
1、前言
最近有段时间没有调试STM32了,想着H743调试串口1,也不能老师吃灰,也遇到了问题,即使最简单的功能,一些细节也是非常重要的,保持初学者之心,是非常重要的,同时也算做记录,对于初学者会有帮助,另外因为之前做过很多相关实验,遇到问题基本轻车熟路了,体现了记录的好处。
2、实验器件
软件环境:STM32cubeIDE 1.8.0
硬件环境:STM32H743xx(正点原子阿波罗开发板)
下载模块:ST-link下载器 (下载器)
串口模块:串口转换器 (可用开发板上232模块代替)
3-1、普通收发+中断接收实验
第一步:代码调试-基本配置
(1)基本配置
新建stm32项目,先配置(下载口)和(时钟口),如下图,
###q (2)uart1以及DMA相关配置
uart1配置稍微复杂点,但是配置串口多了,熟悉了,其实也就知道了,分为几个步骤。
(0)先锁定自己需要引脚,记得F4默认是FA9,FA10,但是H7不是,我们想使用特定引脚的话,需要选择引脚,然后再选择uart1
(1)配置异步通信与开启中断使能,这个时候uart1锁定的引脚就会变成绿色,没选好之前,是黄色的。
这里需要注意的是,在自己实际操作生成代码时,发现并没有生成中断函数,所以最好在中断上再点下。
(2)配置DMA,这部分直接添加就好,都是默认的也不需要改什么。
(3)配置串口的波特率相关设置,改成你需要的波特率,一般也只改波特率,其它不用动。
(3)时钟配置
也就是外部时钟配置,之前F4用的是168M,F1是72M,H7一般是480M,配置如下。
(4)保存后,就可以生成代码
建议先保存,然后生成代码,否则直接生成代码,可能导致软件崩掉,之前遇到过。
在这里插入图片描述
第二步:加入prinf打印
(1)不重复造轮子:打印相关连接
具体打印方式,之前就写过,所以不要重复造轮子,之前看文章,将代码复制过来。
文章连接:# 关于软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一
(2)加入代码片段,注意第四步要放到main里运行
另外注意自己测试发现,不能使用如下定义的方式。
//>>第三步:定义输出函数printf
#define printf(...) HAL_UART_Transmit_DMA((UART_HandleTypeDef * )&huart3, (uint8_t *)u_buf,\sprintf((char *)u_buf,__VA_ARGS__));
需要使用以下方式,并且需要加入换行符号 \n
printf(“\r\n star \r\n\r\n”); //起来之后输出一条语句
printf(“\r\n star \r\n\r\n”); //起来之后输出一条语句
printf(“\r\n star \r\n\r\n”); //起来之后输出一条语句
//>>第一步:添加库
#include "string.h"
#include "stdint.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes */
//>>第二步:定义数组
uint8_t u_buf[64];/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//>>第三步:定义输出函数printf
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
//STM32cubeIDE下
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1,0x200);return ch;
}//keil下 //没在keil下尝试过 一直使用软件stm32cubeIDE没有取keil验证
//UART_HandleTypeDef huart1; //UART句柄
int fputc(int ch,FILE *f)
{HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);return ch;
}/* USER CODE END PTD *///>>第四步:打印输出printf("\r\n star \r\n\r\n"); //起来之后输出一条语句HAL_Delay(1000);
(3)代码测试
随便输出些什么,进行打印测试,在网上找个串口上位机工具,然后连接后串口转USB工具,对应引脚,就可以进行测了。
第四步代码放在主函数,这里没有截图上位机串口数据,打印可以放置的位置指示下,下图已经做完实验的一个截图,开始中断时还没有加入printf,这点请熟知,有疑问可以看代码或评论。
第三步:加入接收代码
(1)加入初始化配置
具体代码见下边连接,这里放置图片展示代码内容。
(2)加入回调函数部分
触发发送与接收,都会回调函数,我们这次就简单些,收到什么就发送什么。
uint8_t aRxBuffer[1];
void UART_RxCpltCallback(UART_HandleTypeDef *huart)
{static uint32_t rxIndex = 0;if(huart->Instance == USART1){HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 1,0xFFFF);HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);}}
(3)加入到中断内
这点还是挺重要,在中断函数内加入回调函数,不加入相应功能无法实现。
第四步:实验验证
(1)发送
(2)中断接收
3-2、DMA收发实验
因为上述步骤,相关配置已经完成了,我们不需要,再重新配置,直接使用即可。
第一步:加入DMA初始化
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//开启空闲中断/*.虽然我们使用的CubeMx来配置DMA,* 但只是配置DMA模式为串口到内存,* 所以还需要在程序中进一步指定:* DMA具体搬运到内存的哪一个位置中,* 我们建立一个数组用以存放DMA搬运的串口数据,* 并使用HAL_UART_Receive_DMA()函数来配置*/HAL_UART_Receive_DMA(&huart1, (uint8_t*)UART1_ReceBuf, UART1_Buf_LEN);
第二步:加入DMA相关数组
/* USER CODE BEGIN PTD */
//>>第二步:定义数组
uint8_t u_buf[64];
#define UART1_Buf_LEN 100uint8_t UART1_SendBuf[UART1_Buf_LEN];uint8_t UART1_ReceBuf[UART1_Buf_LEN];
/* USER CODE END PTD */
第三步:加入回调函数
/* USER CODE BEGIN PFP */uint8_t aRxBuffer[1];
//void UART_RxCpltCallback(UART_HandleTypeDef *huart)
//{
// static uint32_t rxIndex = 0;
//
// if(huart->Instance == USART1)
// {
//
// HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 1,0xFFFF);
// HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);
//
// }
//
//
//
//}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)//发送完成回调函数
{}//采用DMA空闲串口中断模式 貌似不会回调到这里
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接收完成回调函数
{}
/* USER CODE END 0 */uint8_t UART1_ReceBuf_deal_with_data[5];
void USAR_UART_IDLECallback(UART_HandleTypeDef *huart)
{//(1)HAL_UART_DMAStop(&huart1); //停止本次DMA传输 需要使用DMA发送则需要关掉 如果使用的阻塞方式HAL_UART_Transmit发送请使用本行
HAL_UART_Transmit(&huart1,(uint8_t*)UART1_ReceBuf,3,0x200);//阻塞方式发送 使用时需要关闭DMA模式 阻塞发送没有问题,收啥 发啥
//数据头正确了再赋值
if(UART1_ReceBuf[0]==0x31 && UART1_ReceBuf[1]==0x32)
{// 目标 源地址 数据量memcpy(&UART1_ReceBuf_deal_with_data,&UART1_ReceBuf,3);}memset(UART1_ReceBuf,0,UART1_Buf_LEN); //清零接收缓冲区// data_length = 0;
HAL_UART_Receive_DMA(&huart1, (uint8_t*)UART1_ReceBuf, UART1_Buf_LEN); //重启开始DMA传输 每次255字节数据}void USER_UART_IRQHandler(UART_HandleTypeDef *huart)
{if( huart->Instance == USART1){if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) //判断是否是空闲中断{__HAL_UART_CLEAR_IDLEFLAG(&huart1); //清楚空闲中断标志(否则会一直不断进入中断)USAR_UART_IDLECallback(huart); //调用中断处理函数}}
}/* USER CODE END PFP */
第四步:加入到中断函数内
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 *//* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 */USER_UART_IRQHandler(&huart1);/* USER CODE END USART1_IRQn 1 */
}
第四步:简单数据解析功能
(1)加入接收部分代码
我们收到什么数据,就发出什么数据,因为在回调函数里,不能再用DMA发送了,但可以堵塞发出。
(2)加入处理部分代码
我们将数据收到后,如果数据对了,我们只是将数据复制一份,处理不在回调内做,以免拖慢回调。
(3)测试代码
这里这里发放出成功接收并解析代码,处理后发送出来,就是如果接收到数据“123”,那么返回数据“ABC”。
4、代码连接
(1)中断接收
代码链接:https://download.csdn.net/download/qq_22146161/88500425
(2)DMA收发
代码链接:https://download.csdn.net/download/qq_22146161/88500428
5、注意细节
(1)总是多个字符,或者多个其它字符。
实际测试中发现,总会多个0x0D数字,不知道哪里来的,多次检查后,发现其实之前有发送,因为进入空闲中断后,停止了造成这种奇特现象。
原因点如下:发现有奇怪数据时候,一定看看有没其它地方输出。
(2)复制函数的使用。
调试解析时候,我甚至将收到数据打印出来了,但是就是无法触发发送,才发现复制函数数组赋值那块弄错了,还是需要注意的。
(3)逻辑调试与测试。
在我们不清楚的情况,或者要测试逻辑时候,可以让其将数据打印出来了,帮助我们定位错的原因。如下图,我们不知道收到什么是数据时候,可以让其直接发回来,帮助我们判断,甚至,复制完数据后,成没成功,也可以打印出来。
(4)十进制的1与十六进制0x31。
我这里代码有时候说“123”,有时候又说0x31,0x32,0x33,其实这是他们进制表示不同,一个是十进制,一个是十六进制,比如,十进制的1等同于十六进制0x31,跟ascii码对照表有关系。
(5)不同串口工具,有些信息不显示。
不同上位机串口工具,在使用的时候有差异的,如果不切换到16进制进行显示,我也不会发现十六进制的0x0D,后来发现这个其实是换行符‘\n’。
(6)数据解析注意
开始自己看之前的文章的时候,没主要,就发了数据“12”,发现不回,检查后,才知道,数据为12的时候,只复制,不在while进行发送,这点给忘了。
如下错误,为只输入了“12”
(7)初始化顺序不对,不运行
需要将DMA初始化,放在uart前
(8)回调函数写的有问题,只返回一个字符
(9)在网上找到样例,进行测试,没有成功
总结
再次调试相同东西,再简单东西,也有细节值得记录吧~~~。
相关文章:

【软件STM32cubeIDE下H73xx配置串口uart1+中断接收/DMA收发+HAL库+简单数据解析-基础样例】
#【软件STM32cubeIDE下H73xx配置串口uart1中断接收/DMA收发HAL库简单数据解析-基础样例】 1、前言2、实验器件3-1、普通收发中断接收实验第一步:代码调试-基本配置(1)基本配置(3)时钟配置(4)保存…...

jdk8和jdk9中接口的新特性
jdk8之前:声明抽象方法,修饰为public abstract。 jdk8:添加声明静态方法,默认方法。 jdk9:添加声明私有方法 jdk8: ①接口中声明的静态方法只能被接口来调用,不能使用其实现类进行调用 静态方法的声明&…...

1-爬虫-requests模块快速使用,携带请求参数,url 编码和解码,携带请求头,发送post请求,携带cookie,响应对象, 高级用法
1 爬虫介绍 2 requests模块快速使用 3 携带请求参数 4 url 编码和解码 4 携带请求头 5 发送post请求 6 携带cookie 7 响应对象 8 高级用法 1 爬虫介绍 # 爬虫是什么?-网页蜘蛛,网络机器人,spider-在互联网中 通过 程序 自动的抓取数据 的过程…...

java商城免费搭建 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城
1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…...

【TS篇一】TypeScript介绍、使用场景、环境搭建、类和接口
文章目录 一、TypeScript 介绍1. TypeScript 是什么1.2 静态类型和动态类型1.3 Why TypeScript1.4 TypeScript 使用场景1.5 TypeScript 不仅仅用于开发 Angular 应用1.6 前置知识 二、如何学习 TypeScript2.1 相关链接 三、起步3.1 搭建 TypeScript 开发环境3.2 编辑器的选择3.…...

Tuna: Instruction Tuning using Feedback from Large Language Models
本文是LLM系列文章,针对《Tuna: Instruction Tuning using Feedback from Large Language Models》的翻译。 Tuna:使用来自大型语言模型的反馈的指令调优 摘要1 引言2 方法3 实验4 相关工作5 结论局限性 摘要 使用更强大的LLM(如Instruction GPT和GPT-…...

uni-app 应对微信小程序最新隐私协议接口要求的处理方法
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一,问题起因 最新在开发小程序的时候,调用微信小程序来获取用户信息的时候经常报错一个问题 fail api scope is not declared in the privacy agreement,api更具公告…...

PostgreSQL 进阶 - 使用foreign key,使用 subqueries 插入,inner joins,outer joins
1. 使用foreign key 创建 table CREATE TABLE orders( order_id SERIAL PRIMARY KEY, purchase_total NUMERIC, timestamp TIMESTAMPTZ, customer_id INT REFERENCES customers(customer_id) ON DELETE CASCADE);“order_id”:作为主键的自增序列,使用 …...

【Python 千题 —— 基础篇】地板除计算
题目描述 题目描述 编写一个程序,接受用户输入的两个数字,然后计算这两个数字的地板除(整除)结果,并输出结果。 输入描述 输入两个数字,用回车隔开两个数字。 输出描述 程序将计算这两个数字的地板除…...

【随手记】np.random.choice()函数
np.random.choice() 是 NumPy 中的一个随机抽样函数,用于从给定的一维数组中随机抽取指定数量或指定概率的元素。该函数可以用于构建模拟实验、生成随机数据集、数据抽样等应用场景。 np.random.choice(a, sizeNone, replaceTrue, pNone) 的参数如下: …...

2003-2022年地级市-财政收支明细数据(企业、个人所得税、科学、教育、医疗等)
2003-2022年地级市-财政收支明细数据(企业、个人所得税、科学、教育、医疗等) 1、时间:2003-2022年 2、指标:行政区划代码、年份、地区、一般公共预算收入、一般公共预算-税收收入、一般公共预算-税收收入-增值税收入、一般公共…...

影响服务器正常使用的有哪些因素
对于网站优化来说,网站服务器的优化绝对是基础。不管是用户还是搜索引擎对于网站的打开速度都是没有太多耐心的, 所以网站优化的就是要保证网站服务器稳定,网站正常且快速的打开 1.用户体验较差 现在越来越强调用户体验,设想一下…...

NLP学习笔记:使用 Python 进行NLTK
一、说明 本文和接下来的几篇文章将介绍 Python NLTK 库。NLTK — 自然语言工具包 — NLTK 是一个强大的开源库,用于 NLP 的研究和开发。它内置了 50 多个文本语料库和词汇资源。它支持文本标记化、词性标记、词干提取、词形还原、命名实体提取、分割、分类、语义推…...

突破性技术!开源多模态模型—MiniGPT-5
多模态生成一直是OpenAI、微软、百度等科技巨头的重要研究领域,但如何实现连贯的文本和相关图像是一个棘手的难题。 为了突破技术瓶颈,加州大学圣克鲁斯分校研发了MiniGPT-5模型,并提出了全新技术概念“Generative Vokens ",…...

IntelliJ IDEA快捷键sout不生效
1.刚下载完idea编辑器时,可能idea里的快捷键打印不生效。这时你打开settings 2.点击settings–>Live Templates–>找到Java这个选项,点击展开 3.找到sout 4.点击全选,保存退出就可以了 5.最后大功告成!...

用C++QT实现一个modbus rtu通讯程序框架
下面是一个简单的Modbus RTU通讯程序框架的示例,使用C和QT来实现: #include <QCoreApplication> #include <QSerialPort> #include <QModbusDataUnit> #include <QModbusRtuSerialMaster>int main(int argc, char *argv[]) {QC…...

Python如何设置下载第三方软件包的国内镜像站服务器的地址
使用pip下载第三方python软件包时,如果下载的速度太慢,说明是从国外的服务器上下载的。需要进行一个设置,让pip从国内的镜像站服务器下载。 1. 新建一个纯文本文件,Windows下名字叫做pip.ini;Linux下名字叫做pip.cnf…...

ChatGLM3-6B详细安装过程记录(Linux)
先附上GitHub官方地址: https://github.com/THUDM/ChatGLM3https://github.com/THUDM/ChatGLM3 目录 一、预览 1. 基于 Gradio 的网页版 demo...

python的类
python中的类用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 一、object是python的默认类,有很多方法,python3默认所有的类都继承object,定义类的时候类名后面加不加括号&#x…...

前端 用HTML,CSS, JS 写一个简易的音乐播放器
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Music Player</title><style>/* 样式可自行修改 */.container {width: 600px;margin: 0 auto;}h2 {text-align: center;}.controls {displ…...

自定义QChartView实现鼠标放在图表时,显示鼠标位置坐标值(x,y)
前言:因为需要一次性从文件中加载大量数据到图表中显示,所以打算使用qchartviewqscrollarea,当横坐标数据超出默认设定的显示范围之后,重新设置chartview的宽度和scrollarea内容区域(scrollAreaWidgetContents)的宽度,…...

antv/g6 交互与事件及自定义Behavior
监听和绑定事件 在 G6 中,提供了直接的单机事件、还有监听时机的方法。可以监听画布、节点、边、以及各函数被调用的时机等: 1. 绑定事件 要绑定事件,首先需要获得图表实例(Graph 实例),然后使用 on 方法…...

MongoDB根据时间范围查询
MongoDB 查询语句示例 1. 根据时间范围查询 db.getCollection(orders).find({"enabled":true,"$or": [{"endTime": {"$gt":ISODate("2023-10-18T14:45:17.69870008:00")}}, {"endTime": null}], "startTim…...

大数据Doris(十五):Doris表的字段类型
文章目录 Doris表的字段类型 一、TINYINT数据类型 二、SMALLINT数据类型 三、INT数据类型...

文本批量处理,一键转换HTML文件编码,释放您的繁琐工作!
亲爱的用户,您是否曾经为需要手动转换HTML文件编码而耗费大量时间和精力而感到困扰?现在,我们为您提供了一款强大的文本批量处理工具!让您一键将HTML文件编码进行转换,轻松释放您的繁琐工作! 首先…...

硬件工程师到底可以从哪些方面提升自己?
大家好,这里是大话硬件。 最近在大话硬件群里,聊得比较多的就是讨论怎么提升自己的能力,怎么拿到更高的工资。我想,这可能并不是只在大话硬件群才有的话题,其实在每一位工作的人心里应该都在想的两个问题。 因此,这篇文章简单分享一下,作为一名硬件工程师,可以在做哪…...

论文辅助笔记:t2vec models.py
1 EncoderDecoder 1.1 _init_ class EncoderDecoder(nn.Module):def __init__(self, vocab_size, embedding_size,hidden_size, num_layers, dropout, bidirectional):super(EncoderDecoder, self).__init__()self.vocab_size vocab_size #词汇表大小self.embedding_size e…...

R语言如何写一个爬虫代码模版
R语言爬虫是利用R语言中的网络爬虫包,如XML、RCurl、rvest等,批量自动将网页的内容抓取下来。在进行R语言爬虫之前,需要了解HTML、XML、JSON等网页语言,因为正是通过这些语言我们才能在网页中提取数据。 在爬虫过程中,…...

鸿运主动安全云平台任意文件下载漏洞复习
简介 深圳市强鸿电子有限公司鸿运主动安全监控云平台网页存在任意文件下载漏洞,攻击者可通过此漏洞下载网站配置文件等获得登录账号密码 漏洞复现 FOFA语法:body"./open/webApi.html" 获取网站数据库配置文件 POC:/808gps/Mobile…...

CMake基础【学习笔记(八)】
声明此博客为转载 CMake基础 文章目录 CMake基础一、准备知识1.1 C的编译过程1.2 静态链接库和动态链接库1.3 为什么需要CMake1.3.1 g 命令行编译1.3.2 CMake简介 二、CMake基础知识2.1 安装2.2 第一个CMake例子2.3 语法基础2.3.1 指定版本2.3.2 设置项目2.3.3 添加可执行文件…...