【STM32F1】——9轴姿态模块JY901与串口通信(下)
一、简介
本篇主要对调试JY901模块的过程进行总结,实现了以下功能:
1)串口普通收发:使用STM32F103C8T6的USART2实现9轴姿态模块JY901串口数据的读取,并利用USART1发送到串口助手。
2)串口DMA收发:使用STM32F103C8T6的USART2的DMA通道6读取JY901的串口数据,并利用USART1的DMA通道4发送到串口助手。
此处只实现了HEX格式的收发,中间没有对JY901数据进行分类和转换处理,后续可以继续完善。
二、JY901介绍

- 电压:3.3-5V
- 量程:X/Z轴 ±180°, Y轴 ±90°
- 通信方式:IIC、UART(默认9600波特率)
- 型号区别:JY901S(带温补),JY901B(带气压)
- 帧头格式:以角度输出为例,回传数据为11位。格式为:0x55 0x53 RollL RollH PitchL PitchH YawL YawH TL TH SUM
三、串口DMA总结
- 为什么要用DMA:普通的数据接收方式,收发一个字节就处理一次中断请求。在处理复杂任务时或者大量收发数据时,频繁的中断开关显然会增加CPU的负担。
- 什么是DMA:直接存储器访问,RAM和IO设备间一条直接传送数据的通路。
- STM32F1-DMA1控制器相应的通道:注意外设与相应的DMA通道一一对应
- DMA相应的寄存器配置说明:https://blog.csdn.net/weixin_44524484/article/details/105671273
- 注意:通道一但使能,数据就会自动从源地址传输到目标地址
四、JY901的串口DMA
-
接线:
-
程序简介:使用STM32F103C8T6的USART2的DMA通道6读取JY901的串口数据,并利用USART1的DMA通道4发送到串口助手。
-
实现思路:
参考这篇文章的代码进行学习,实现思路如下:
1)配置串口USART1,初始化相应的DMA发送通道4,开启TX DMA发送中断。
2)配置串口USART2,初始化相应的DMA接收通道6,开启RX DMA接收中断。
3)定义USART1和USART2相应的数据缓存变量。
4)定义USATRT1 DMA通道4的发送函数,即指定发送数据的地址(预设的缓存变量)和外设地址(USART1_TX),开启DMA发送通道4,自动发送数据到串口助手。
5)借鉴上文双缓冲区的思想,接受完数据后进入USART2的串口空闲中断服务子函数,先关闭DMA接收中断,将接收到的数据放入缓冲区,切换缓冲区标志,记录当前数据长度,再打开DMA发送中断。利用USART1 DMA通道4发送数据到串口助手。 -
代码解析:
1)定义USART1的缓存变量及标志位:
#define USART1_MAX_TX_LEN 256 // USART1最大发送长度 u8 USART1_TX_BUF[USART1_MAX_TX_LEN]; // 发送缓冲,最大USART2_MAX_TX_LEN字节 u8 USART1_TX_FLAG=0; // USART1发送标志,启动发送时置1
2)配置USART1及相应的DMA发送通道4:
DMA配置最重要的几个配置项是:目标地址、源地址、数据长度、工作模式和数据传输方向。
void UART1_Init(unsigned long baudrate) {//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART2时钟//USART2_TX GPIOA.2初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速率50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.2//USART 初始化设置USART_InitStructure.USART_BaudRate = baudrate; //串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位USART_InitStructure.USART_Parity = USART_Parity_No ; //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Tx; //发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1//中断开启设置USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //开启检测串口空闲状态中断USART_ClearFlag(USART1