IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 软件STM32cubeIDE下使用STM32F4xx配置uart1和uart5数据互相透传-基础样例 -> 正文阅读

[嵌入式]软件STM32cubeIDE下使用STM32F4xx配置uart1和uart5数据互相透传-基础样例

概述

最近,使用串口透传,这项方式,想想挺简单,但是实际做起来,还是有些细节的,想的是时候都挺简单,但是真正动手坐还是要一步一步打好基础。

环境

软件环境:STM32cubeIDE 1.7.0
硬件环境:正点原子探索者开发板-STM32F407ZGT6
HAL库版本:stm32cube_fw_f4_v1262
下载器:j-link
串口转换器:2个TTL转USB转换器

透传基本了解

简单说,从一个串口收到什么数据,就搬运到另一串口上去。那可能有人就问了,为什么不知道将两个端直接连接,非要倒换一道呢,这个和实践应用有关系,实际上硬件固定后,一般不会动了,很多这种硬件后,不能手动改动,所以让软件来做。

实验步骤

>>>(1)初步建立工程

1)了解硬件连接

我们要使用串口,是需要先知道硬件连接,串口可以映射不同引脚上去,本次实验如下。

---PB6--usart1_TX
---PB7--usart1_RX
----------------------
---PC12--uart5_TX
---PD2---uart5_RX

2)基本配置

RCC配置
在这里插入图片描述
SYS配置
在这里插入图片描述

3)串口uart1和uart5的DMA配置

(1)uart5中断配置
在这里插入图片描述
(2)uart5的DMA设置
在这里插入图片描述
(3)uart5的波特率设置
在这里插入图片描述
(4)uart1设置引脚,先固定,然后再选择。
在这里插入图片描述
(5)usart1中断配置
在这里插入图片描述
(6)usart1的DMA配置
在这里插入图片描述
(7)usart1的波特率配置
在这里插入图片描述

4)时钟配置

在这里插入图片描述

5)加入uart1和uart5的DMA输出代码

保存后,直接编译,生成代码。我们在主函数while里加入两个串口DMA输出。
在这里插入图片描述
代码片段

  while (1)
  {
	  HAL_UART_Transmit_DMA(&huart5,(uint8_t*)"123",3);
	  HAL_UART_Transmit_DMA(&huart1,(uint8_t*)"456",3);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	  HAL_Delay(1000);
  }

6)硬件连接,进行测试

基本上,到上一步软件部分就完事了,我们连上串口转换器,测试打印输出。
一般没什么问题,就如下图所示。
在这里插入图片描述

>>>(2)加入回调函数

1)接收初始化

由此我们完成初步测试,那么可以下一步,加入回调,处理接收部分,之前文章有写,这里就不多啰嗦了。
(1)定义接收数组
在这里插入图片描述
(2)加入初始化函数

在这里插入图片描述

2)回调函数

void USAR_UART_IDLECallback(UART_HandleTypeDef *huart)
{

	 if(  huart->Instance == UART5)
	  {
		 //hal库下,确定接收字符长度
		 g_nNum_uart5=  UART5_Buf_LEN - __HAL_DMA_GET_COUNTER(&hdma_uart5_rx);
		 //HAL_UART_Transmit_DMA(&huart1,(uint8_t*)UART5_ReceBuf,g_nNum_uart5);
		 memcpy(&UART5_SendBuf_data,&UART5_ReceBuf,g_nNum_uart5);
		 //HAL_Delay(1);
		  HAL_UART_DMAStop(&huart5);                    //停止本次DMA传输 需要使用DMA发送则需要关掉  如果使用的阻塞方式HAL_UART_Transmit发送请使用本行
		 HAL_UART_Transmit(&huart1,(uint8_t*)UART5_ReceBuf,g_nNum_uart5,1);//阻塞方式发送 使用时需要关闭DMA模式 >>>不建议在中断回调里直接发
		 memset(UART5_ReceBuf,0,UART5_Buf_LEN);                                            //清零接收缓冲区
		 HAL_UART_Receive_DMA(&huart5, (uint8_t*)UART5_ReceBuf, UART5_Buf_LEN);

	  }else if(  huart->Instance == USART1)
	  {

		  //hal库下,确定接收字符长度
		  g_nNum_uart1=  UART1_Buf_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);;
		  //HAL_UART_Transmit_DMA(&huart5,(uint8_t*)UART1_ReceBuf,g_nNum_uart1);
		  memcpy(&UART1_SendBuf_data,&UART1_ReceBuf,g_nNum_uart1);
		  //HAL_Delay(1);
		   HAL_UART_DMAStop(&huart1);                    //停止本次DMA传输 需要使用DMA发送则需要关掉  如果使用的阻塞方式HAL_UART_Transmit发送请使用本行
		  HAL_UART_Transmit(&huart5,(uint8_t*)UART1_ReceBuf,g_nNum_uart1,10);//阻塞方式发送 使用时需要关闭DMA模式 阻塞发送没有问题,收啥 发啥
		  memset(UART1_ReceBuf,0,UART1_Buf_LEN);                                            //清零接收缓冲区
		  HAL_UART_Receive_DMA(&huart1, (uint8_t*)UART1_ReceBuf, UART1_Buf_LEN);
	  }
}


void USER_UART_IRQHandler(UART_HandleTypeDef *huart)
{
    if(  huart->Instance == UART5)
    {
    	  if(RESET != __HAL_UART_GET_FLAG(&huart5, UART_FLAG_IDLE))   //判断是否是空闲中断
    	         {
    	             __HAL_UART_CLEAR_IDLEFLAG(&huart5);                     //清标志位
    	             USAR_UART_IDLECallback(huart);                          //调用中断处理函数
    	         }
    }
    else
    if(huart->Instance == USART1)
    {
  	  if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))   //判断是否是空闲中断
  	         {
  	             __HAL_UART_CLEAR_IDLEFLAG(&huart1);                     //清标志位
  	             USAR_UART_IDLECallback(huart);                          //调用中断处理函数
  	         }
    }
}

3)回调函数加入中断函数中。

在stm32f4xx_it.c文件中加入中断函数中,这点别忘了。
(1)uart5的
在这里插入图片描述(2)usart1的
在这里插入图片描述

4)实际测试

使用两个串口直接这个时候是比较方便的,只有一个的话可以将另一头TX和RX短接。
如下是单向传输测试。
在这里插入图片描述

代码连接

代码连接:https://download.csdn.net/download/qq_22146161/86753184

细节说明

1)实际应用与测试

如果,你自己使用的话,一个是要分场景,另一个,最好实际测试使用下。
原本回到函数里,最好不要坐多余的事情,另外再次调试时,尝试在回调函数里,直接将数据使用DMA发走,发现还是不行。

但是非DMA可以使用。
但是感觉在回掉函数里,使用阻塞方式发数据,不太好,想放在while里,结果数据有问题,暂时先这样吧。

2)实际对传测试

使用两个转换器的好处就是可以对传,这个自己用的时候,还是需要实测下。
在这里插入图片描述

3)了解真实数据

实际测试时,我想尽量压缩时间,这样传递的速度可以更快么,但是自己设置波特率时9600的,我们也需要知道这个物理边界,我使用的测试的数据,有个包37个字节,另一个包数据更长些。
使用逻辑分析仪很清楚看到这些。
(1)一个包
在这里插入图片描述
(2)一个更长点的包。
在这里插入图片描述
所以我在设置测试时,使用50ms一个周期循环发。

在这里插入图片描述

总结

记录,总结。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:50:48  更:2022-10-17 12:53:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:23:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码