自学内容网 自学内容网

【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介绍

  1. 电压:3.3-5V
  2. 量程:X/Z轴 ±180°, Y轴 ±90°
  3. 通信方式:IIC、UART(默认9600波特率)
  4. 型号区别:JY901S(带温补),JY901B(带气压)
  5. 帧头格式:以角度输出为例,回传数据为11位。格式为:0x55 0x53 RollL RollH PitchL PitchH YawL YawH TL TH SUM

三、串口DMA总结

  1. 为什么要用DMA:普通的数据接收方式,收发一个字节就处理一次中断请求。在处理复杂任务时或者大量收发数据时,频繁的中断开关显然会增加CPU的负担。
  2. 什么是DMA:直接存储器访问,RAM和IO设备间一条直接传送数据的通路。
  3. STM32F1-DMA1控制器相应的通道:注意外设与相应的DMA通道一一对应
    在这里插入图片描述
  4. DMA相应的寄存器配置说明https://blog.csdn.net/weixin_44524484/article/details/105671273
  5. 注意:通道一但使能,数据就会自动从源地址传输到目标地址

四、JY901的串口DMA

  1. 接线
    1

  2. 程序简介:使用STM32F103C8T6的USART2的DMA通道6读取JY901的串口数据,并利用USART1的DMA通道4发送到串口助手。

  3. 实现思路

    参考这篇文章的代码进行学习,实现思路如下:

    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发送数据到串口助手。

  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)!