最近项目开发要求用到近距离红外通信,需要实现两个红外设备的数据传输。于是开发完成后,简单对过程进行一个记录。

一、关于IRDA红外串口通信

IrDA是红外数据组织(Infrared Data Association)的简称。IrDA制定了一系列的红外通信标准,支持异步,半双工的同步系统,传输速率为2400bps到115200bps,传输范围1m。
       和其他无线电磁波传输方式相比,红外线传输有方向性,一般不支持移动,且极容易收到墙壁的阻碍,收发双方必须相互对准才能进行通信,但是它的安全性更好。


二、STM32对IRDA的支持及配置

接口硬件电路

由于使用的是STM32F7系列单片机,它自身是支持IRDA通信协议的,因此,在通过STM32CubeMx配置的时候,我们只需要在工作模式上选择IDRA模式即可。


       串口波特率设置为115200。

这里由于我考虑接收处理方便,采用的串口DMA+空闲中断的方式实现红外数据的接收,因此在配置的时候,还需要配置串口DMA。


       生成代码后,实现关键部分的数据接收发送处理,最后烧写代码。我本身有一个红外的数据发送设备(大家测试的时候,也可以通过串口线,一头接串口调试助手,一头接红外头),这里单片机是作为接收端在使用。

三、验证测试

当两个红外头对准后,终端发送数据,单片机正常接收发送过来的一帧数据,且发送数据和接收数据一致。

四、代码

初始化配置

void MX_USART6_IRDA_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_USART6_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF8_USART6;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);hirda6.Instance = USART6;hirda6.Init.BaudRate = 115200;hirda6.Init.WordLength = IRDA_WORDLENGTH_8B;hirda6.Init.Parity = IRDA_PARITY_NONE;hirda6.Init.Mode = IRDA_MODE_TX_RX;hirda6.Init.Prescaler = 10;hirda6.Init.PowerMode = IRDA_POWERMODE_NORMAL;if (HAL_IRDA_Init(&hirda6) != HAL_OK){}/* USART6_RX Init */hdma_usart6_rx.Instance = DMA2_Stream1;hdma_usart6_rx.Init.Channel = DMA_CHANNEL_5;hdma_usart6_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_usart6_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart6_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart6_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart6_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart6_rx.Init.Mode = DMA_NORMAL;hdma_usart6_rx.Init.Priority = DMA_PRIORITY_LOW;hdma_usart6_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;if (HAL_DMA_Init(&hdma_usart6_rx) != HAL_OK){}__HAL_LINKDMA(&hirda6,hdmarx,hdma_usart6_rx);HAL_IRDA_Receive_DMA(&hirda6,usart6_dat.rx_buf,USART_MAX_LEN);/* USART6 interrupt Init */HAL_NVIC_SetPriority(USART6_IRQn, 6, 2);HAL_NVIC_EnableIRQ(USART6_IRQn);__HAL_UART_ENABLE_IT(&hirda6,UART_IT_IDLE); __HAL_UART_CLEAR_IDLEFLAG(&hirda6);
}

数据接收

void USART6_IRQHandler(void)
{uint8_t i=0;BaseType_t xHigherPriorityTaskWoken; if(Get_DCahceSta())SCB_CleanInvalidateDCache();if((__HAL_UART_GET_FLAG(&hirda6,UART_FLAG_IDLE)!=RESET))                 {__HAL_UART_CLEAR_IDLEFLAG(&hirda6);HAL_IRDA_DMAStop(&hirda6);usart6_dat.len = USART_MAX_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart6_rx); if(usart6_dat.len>0){xEventGroupSetBitsFromISR(UsartEventGourpHandler,USART_EVENT3_IRDA,&xHigherPriorityTaskWoken);}__HAL_DMA_SET_COUNTER(&hdma_usart6_rx,USART_MAX_LEN);            HAL_IRDA_Receive_DMA(&hirda6,usart6_dat.rx_buf,USART_MAX_LEN);}HAL_IRDA_IRQHandler(&hirda6);
}

基于STM32的TFDU4101红外通信IRDA+串口DMA方式相关推荐

  1. K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示

    K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 对应程序: 四.部分代码说明 1.接线引脚定义 ...

  2. 基于STM32的CAN总线通信学习笔记

    转自:https://blog.csdn.net/ludaoyi88/article/details/53350077 基于STM32的CAN总线通信学习笔记 本文主要简单介绍CAN总线的相关概念,以 ...

  3. K_A14_001 基于STM32等单片机驱动MPU6050模块 串口与OLED0.96双显示

    K_A14_001 基于STM32等单片机驱动MPU6050模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接线引 ...

  4. K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示

    K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 UART对应程序: IIC对应程序: 四.部分 ...

  5. 嵌入式作业STM32采用串口DMA方式发送数据

    目录 前言 要求 一.DMA的基本介绍 DMA的基本定义 DMA的主要特征 STM32F411x系列芯片DMA控制器 二.通过CubeMX配置项目 1.创建项目 2.选择芯片STM32F103C8T6 ...

  6. STM32F103C8T6核心开发板下,采用串口DMA方式向上位机连续发送数据的实例详解

    STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 文章目录 STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 前言 一.DMA应用初步 ...

  7. 基于STM32的万能红外遥控器

    本博客介绍一种基于STM32的可学习和存储已有红外发射设备的万能红外遥控器的设计思路. 一.首先需要了解设计一款这功能的遥控器需要什么硬件设备支持. 1.3.3V,5V电源模块,用作给系统模块供电和单 ...

  8. 【嵌入式基础】串口中断通信VS串口DMA通信

    目录 目录 前言 一.串口通信 1. 通信方式 2.通信速率 3.串口通信的三种工作方式 二.串口中断通信 1.串口中断特点 2.CubeMX配置初始化串口中断相关外设 3.串口中断程序分析 4.实验 ...

  9. STM32采用串口DMA方式实现发送数据

    文章目录 一.实验工具 二.DMA介绍 三.配置工程 1.新建工程 2.引脚配置 3.设置RCC 4.设置串口 5.DMA设置 6.时钟源设置 7.项目文件设置 8.创建代码 四.Keil中修改代码 ...

最新文章

  1. barmanager 不显示_广州13.3寸广告液晶显示屏品牌排行榜
  2. R语言使用ggplot2包的快速可视化函数qplot绘制散点图(分类变量分组配色、连续值程度配色)实战
  3. c# 线程,同步,锁
  4. OpenGL程序管道,可分离程序和着色器子例程的基本用法
  5. 硬核!原型和原型链详解
  6. Git 存储过程探究_无赖皮肤-ChinaUnix博客
  7. 字段定义_SAP 物料主数据增强自定义字段
  8. python求解LeetCode习题Find Peak Element in Given num_list
  9. 链表:从尾到头打印链表
  10. 2021年美赛成绩公布与美赛查询!美赛官网已更新
  11. 此页上的ActiveX控件和本页上的其他部分的交互可能不安全的解决办法
  12. poj 1113 Wall 凸包
  13. 即使被拖库,也可以保证密码不泄露(一种安全的加密方案)
  14. 《大象:thinking in uml 》(第二版) 3章 UML核心元素 4-7节 边界、业务实体、包、分析类
  15. 【Django】admin的save_modle方法重写-20220803
  16. redis恢复阿里云rdb文件
  17. 专访天联世纪总裁朱威廉:暴利网游遭遇拐点
  18. 5种方法快速定位对方IP
  19. Vue中使用find函数
  20. C语言 | windows.h实现彩色圣诞树

热门文章

  1. 安装mysql黑屏电脑卡死_电脑卡屏死机是怎么回事?
  2. JAVA结合AE(Adobe After Effects)实现类似于传影(视频DIY)的核心功能,程序也可以是艺术。
  3. LabVIEW编程LabVIEW控制研华PCI-1756例程与相关资料
  4. 智能电销机器人对企业的营销助力
  5. iOS 16 修改第三方库实现监听 SwiftUI 中 sheet 弹出视图的下滑关闭动作
  6. 基于python的selenium两种文件上传方式
  7. 【转载】CRC32校验算法C语言版(查表法)
  8. Python 将png图片转为bmp
  9. 【Linux】基础特性与常见系统管理命令详解1
  10. html怎么把字做成动画效果,如何使用HTML5 css3实现粒子效果文字动画特效(附完整代码)...