【STM32F1】——9轴姿态模块JY901与串口通信(下)
【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.2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO速率50MHz GPIO_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
原文地址:https://blog.csdn.net/weixin_52077466/article/details/143632865
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!