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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能 -> 正文阅读

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

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.

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:31:28  更:2022-10-22 21:33:32 
 
开发: 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 21:18:41-

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