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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)