stm32f4_奇怪的bug_串口数据错乱,一个串口收到另一个串口的数据

news/2024/10/18 12:30:07/

1、开发环境简介

芯片型号:stm32f407igt6

官方库函数:HAL库

2、bug现象描述和原因推测

使用了2个串口,一个是串口5-波特率115200,一个是串口4-波特率9600,但是串口4时不时会收到上一次发给串口5的数据。不是同一个串口,而且波特率都不一样,为什么呢?

原因推测:

a.应用层面代码错误,接收缓存共用了内存空间?

b.串口配置有误触发的内部混乱?

3、排除推测a

检查代码,各用各的缓存,没写错。

而且串口4是因为进入了接收中断,所以才收到数据,而这个中断标志位是stm32f4产生的。

串口4在实际没有收到数据的情况下,中断被触发了,并且收到了另一个串口,串口5的数据。

4、更改接收IO口的配置解决

4.1、HAL库手册提供的配置方式

完完全全按照要求配的,不行。

 

4.2、接收IO口上拉改为无上下拉

接收IO口上拉改为无上下拉,串口4就正常了。

因为是时不时出现,考虑可能只是降低bug复现概率,所以运行了一晚上,都是正常的,大概两万次吧,一次都没出现了,但是:

  • 官方要求是是要配置上拉的;
  • 从原理上说,串口空闲高电平,接收是应该上拉;
  • 还碰巧找到另一个人也遇到类似的问题,也是一个串口收到另一个串口数据,但是他是改成上拉之后解决的。

5、附串口配置代码

5.1、HAL库内部调用的MspInit

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{GPIO_InitTypeDef GPIO_InitStruct;if(huart->Instance==HC05_USARTx){/* 串口外设时钟使能 */HC05_USARTx_RCC_CLK_ENABLE();	/* GPIO外设时钟使能 */HC05_USARTx_GPIO_ClK_ENABLE();					GPIO_InitStruct.Pin = HC05_USARTx_Tx_PIN;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF8_UART4;HAL_GPIO_Init(HC05_USARTx_PORT, &GPIO_InitStruct);GPIO_InitStruct.Pin = HC05_USARTx_Rx_PIN;	GPIO_InitStruct.Pull = GPIO_NOPULL;		//成功//GPIO_InitStruct.Pull = GPIO_PULLUP;	//失败HAL_GPIO_Init(HC05_USARTx_PORT, &GPIO_InitStruct); 	/* USART1_IRQn interrupt configuration */HAL_NVIC_SetPriority(HC05_USART_IRQn, 1,0);HAL_NVIC_EnableIRQ(HC05_USART_IRQn);		}
}

5.2、外部的串口初始化函数

void HC05_USARTx_Init(void)
{	husartx_HC05.Instance = HC05_USARTx;husartx_HC05.Init.BaudRate = HC05_USARTx_BAUDRATE;husartx_HC05.Init.WordLength = UART_WORDLENGTH_8B;husartx_HC05.Init.StopBits = UART_STOPBITS_1;husartx_HC05.Init.Parity = UART_PARITY_NONE;		husartx_HC05.Init.Mode = UART_MODE_TX_RX;husartx_HC05.Init.HwFlowCtl = UART_HWCONTROL_NONE;husartx_HC05.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&husartx_HC05);/* 配置串口中断并使能,需要放在HAL_UART_Init函数后执行修改才有效 *///__HAL_UART_CLEAR_FLAG(&husartx_HC05,USART_FLAG_IDLE); // 清除空闲中断标志__HAL_UART_ENABLE_IT(&husartx_HC05,UART_IT_IDLE);     // 使能空闲中断		__HAL_UART_ENABLE_IT(&husartx_HC05,UART_IT_RXNE);		//使能接收中断
}

看起来是解决了,但是不理解为什么,欢迎留言讨论。


http://www.ppmy.cn/news/1103763.html

相关文章

C语言经典100例题(45)--学习使用register定义变量的方法

目录 题目 问题分析 代码 运行结果 题目 学习使用register定义变量的方法 问题分析 register是做声明的,为了提高效率。 register变量不能做取地址运算符&操作。 声明变量具有register储类型就要求编译器把变量存储在寄存器中,而不是像其他变量…

ResNet 09

一、发展 1989年,Yann LeCun提出了一种用反向传导进行更新的卷积神经网络,称为LeNet。 1998年,Yann LeCun提出了一种用反向传导进行更新的卷积神经网络,称为LeNet-5 AlexNet是2012年ISLVRC 2012(ImageNet Large Sca…

Unity 之 Material (材质)渲染3D对象的重要组件

文章目录 介绍一些代码例子 介绍 在Unity中,Material(材质)是一种用于渲染3D对象的重要组件。Material定义了对象的外观,包括其颜色、纹理、光照属性和反射等。以下是关于Material的详细介绍: 创建Material&#xff1…

易优cms小程序插件升级到2.1版本

eyou小程序升级到2.1,主要新增一键获取手机号,统一返回格式等 升级内容: (1)对全部接口的返回格式做统一化设置 (2)新增一键获取手机号功能 (3)新增footprint足迹接口 &…

mp4视频太大怎么发送?这样压缩视频就对了

随着科技的发展,视频格式多种多样,其中mp4格式因为其通用性而广受欢迎。然而,有时候我们会遇到一个问题:mp4视频文件太大,导致发送变得困难。那么,如何解决这个问题呢?下面就给大家分享几个实用…

深入浅出PyTorch函数torch.rand与torch.randn

torch.rand 和 torch.randn 都是PyTorch中用于生成随机张量的函数,但它们生成随机数的方式有所不同。 一、torch.rand torch.rand 生成在区间 [0, 1) 内均匀分布的随机数。 size 参数是一个表示所需张量形状的元组或整数。可以生成任何形状的随机张量。 二、torch.…

数据结构理论知识

稀疏数组 二维数组转稀疏数组的思路 遍历原始二维数组,得到有效数据的个数sum 根据sum可以创建稀疏数组 sparseArr[sum1][3] 稀疏数组行不定 列固定3列row col val 将二维数组有效数据存储到稀疏数组 稀疏数组转原始的二维数组的思路 先读取稀疏数组第一行&am…

在自定义数据集上实现OpenAI CLIP

在2021年1月,OpenAI宣布了两个新模型:DALL-E和CLIP,它们都是以某种方式连接文本和图像的多模态模型。CLIP全称是Contrastive Language–Image Pre-training,一种基于对比文本-图像对的预训练方法。为什么要介绍CLIP呢?因为现在大火…