STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能

您所在的位置:网站首页 空闲的的意思 STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能

STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能

2024-07-11 11:01:00| 来源: 网络整理| 查看: 265

STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能

0 实验背景

本实验的目的是实现串口的双向转发,即向串口1写入数据后,串口2及时输出串口1收到的数据;向串口2写入数据后,串口1及时输出串口2收到的数据。

1 实验硬件平台

本实验基于STM32G070RBT6单片机实验,查询参考手册《RM0454 STM32G0x0 advanced Arm-based 32-bit MCUs》可知,该单片机具有接收缓存非空和空闲中断功能,为了保持程序的通用性,特地查阅了stm32f10x系列单片机的参考手册《RM0008》,可以STM32F10X单片机同样具有这两个中断,即本实验可以轻松应用与stm32f10x系列单片机。

图  1‑1 《RM0454 STM32G0x0 advanced Arm-based 32-bit MCUs》中串口中断表

图  1‑2 《RM0008 STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®-based 32-bit MCUs》中串口中断表

2 实验软件平台

本次实验的软件平台为STM32CubeIDE 1.7.0.

创建工程时选择STM32G070RB单片机。

使用CubeIDE集成的CubeMX配置工具配置引脚,本次使用原则上使用两个串口可以实现串口转发功能。

本次实验使用串口1和串口3做转发实验,串口1,PA10为接收引脚,PA9为发送引脚;串口3,PD9为接收引脚,PD8为发送引脚。

引脚配置如下图:

图  1‑3 串口转发引脚配置

3 实现原理 3.1 接收原理

整个接收过程发生在后台系统中,即中断函数中。

在发生接收缓存非空时(RXNE)进入中断函数将数据保存到缓存中,接收长度加一,同时启用串口空闲中断。

当空闲中断发生时,标记本组接收完成,组变量自增一并取余保持环形缓存的循环使用。

3.2 转发原理

转发过程发生在前台系统中,即while(1)循环中,通过不断检查缓存使用标记实现。

如果判断已经接收完成,则调用其他串口发送,等发送完成后清除数据长度,增加判断的组号变量。

4 工程创建与串口配置

使用stm32CubeIDE选择stm32g070rb单片机创建基础功能,使用串口1和串口3,注意使能串口后注意串口硬件是否和预期一致,如过不一致需要修改。

两个串口均使用默认配置,即波特率115200,8,n,1;

图  2‑1 串口默认配置

在NVIC配置中勾选使用中断。

在NVIC的Code generation中不勾选 Generate IRQ handler,即不让CubeMx自动生成中断函数,我们自己编写串口中断函数。

5 编写串口接收缓存结构体

定义两个宏,一个定义单个数组缓存的大小,一个定义数组个数。

// 定义接收缓存的最大长度为 256

#define RING_BUFF_MAX_LENGTH (256)    

// 定义缓存个数

#define RING_BUFF_MAX_BUFF_COUT (3)   

数据接收缓存数据结构定义:RING_BUFF数据结构有三个成员,第一个是unsigned char类型的数组,用于存放接收到的数据;第二个是unsigned shot int 类型的数据变量,用于记录接收到的数据长度;第三个是用于标记该缓存是否接受到数据的标识符,0,表示未使用或正在接收中;大于零的其他值表示接收完成。

// 缓存 结构体

struct RING_BUFF

{

   // 数据接收缓存数组

   uint8_t buff[RING_BUFF_MAX_LENGTH];

   // 接收到的数据长度

   uint16_t length ;

   // 缓存使用标记,0,为使用或正在接收中;大于零的其他值, 接收完成;

   uint16_t usedFlag;

};

定义接受缓存:

本实验中使用量环形缓存队列的编程想法,对串口1和串口3分别定义三组接受缓存,当第1组接受完成时,自动自己接收完成标记,有新数据时自动记录到下一组缓存中;读取时也是同样,先读取第一组标记位,有数据时用相应的串口做转发,读取完成后清除标记位,接着读取下一个缓存的标记。

因此,除了定义接收缓存为,还需要一个全局变量用于标记当前使用的缓存组号。

// 串口1 缓存组好记录

uint8_t jlinkRxBuffArrNum = 0;

// 串口3 缓存组好记录

uint8_t rs232RxBuffArrNum = 0;

6 串口中断函数编写

 

7 数据接收完成查询与转发功能编写

这里为了简化,创建了两个freeRTOS的task,效果等同于无操作系统下的while(1)循环。

 

8 通信测试

一个发送ABCDEFG,一个发送987654321.



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭