本篇博文最后修改时间:2017年04月04日,12:48。


一、简介

本文介绍如何在STM32上使用红外接收头接收红外信号。

其中,红外协议采用为最常见的NEC协议。

二、实验平台

库版本:STM32F10x_StdPeriph_Lib_V3.5.0

编译软件:MDK4.53

硬件平台:STM32开发板(主芯片stm32f103c8t6)

仿真器:JLINK

、版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
1)《STM8L之红外发射》:http://blog.csdn.net/feilusia/article/details/53305956
2、在进行本文步骤前,请先 实现 以下博文:

1)《STM32之系统滴答定时器》 :http://blog.csdn.net/feilusia/article/details/52835711

五、基础知识

1、硬件原理

答:

1)接收管元器件

上图的引脚从左到右依次为:OUT(空闲时为高电平,接收到载波时为低电平)、GND、VCC。

电压范围为2.7V~5.5V。

附淘宝链接:

https://detail.tmall.com/item.htm?spm=a1z10.3-b.w4011-3079905380.37.ZS9LXo&id=14265901312&rn=9fa50b1d19ad40efa6f149c454e32cfa&abbucket=14

2)硬件原理图

如上图,红外接收引脚接到PB3,PB3为JTAG使用引脚,因此在代码中要注意将引脚功能切换回普通IO口。

2、本文中红外接收的流程是如何的?

答:

1)配置红外接收引脚PB3为IO上拉中断方式。

2)当红外接收头接收到红外遥控器发出的载波信号时,PB3被拉低,代码进入中断服务函数,并依次判断时序是否满足:引导码、用户码、用户反码、键码、键码反码、停止位。

如果时序正确,则获得键值。如果时序不正确,则将此数据过滤。

六、实验步骤

注:下面的步骤为主要步骤,并不是所有步骤,编译有错误的地方请自行修改。

1、编写并添加红外接收的驱动

1)编写驱动GUA_Infrared_Receiver.c(存放在“……\HARDWARE”)

//******************************************************************************
//name:             GUA_Infrared_Receiver.c
//introduce:        红外传感器接收驱动
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2016.12.29
//******************************************************************************
#include "stm32f10x.h"
#include "GUA_Infrared_Receiver.h"
#include "GUA_SysTick.h"/*********************宏定义************************/
#define TRUE            0
#define FALSE           1//红外接收引脚
//IO
#define GUA_INFRARED_RECEIVER_PORT               GPIOB
#define GUA_INFRARED_RECEIVER_PIN                GPIO_Pin_3
#define GUA_INFRARED_RECEIVER_RCC                RCC_APB2Periph_GPIOB//中断
#define GUA_INFRARED_RECEIVER_EXTI_LINE          EXTI_Line3
#define GUA_INFRARED_RECEIVER_PORTSOURCE         GPIO_PortSourceGPIOB
#define GUA_INFRARED_RECEIVER_PINSOURCE          GPIO_PinSource3
/*********************外部变量************************/
GUA_U32 gGUA_InfraredReceiver_Data = 0;/*********************内部函数************************/
static void GUA_Infrared_Receiver_IO_Init(void);
static GUA_U16 GUA_Infrared_Receiver_GetHighLevelTime(void);
static GUA_U16 GUA_Infrared_Receiver_GetLowLevelTime(void);//******************************************************************************
//name:             GUA_Infrared_Receiver_IO_Init
//introduce:        红外接收的IO初始化
//parameter:        none
//return:           none
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2016.12.29
//******************************************************************************
static void GUA_Infrared_Receiver_IO_Init(void)
{   //IO结构体GPIO_InitTypeDef GPIO_InitStructure;//失能JTAG和SWD在PB3上的功能使用GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//时钟使能RCC_APB2PeriphClockCmd(GUA_INFRARED_RECEIVER_RCC | RCC_APB2Periph_AFIO, ENABLE);     //红外接收IO配置GPIO_InitStructure.GPIO_Pin = GUA_INFRARED_RECEIVER_PIN;         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GUA_INFRARED_RECEIVER_PORT, &GPIO_InitStructure);
}//******************************************************************************
//name:             GUA_Infrared_Receiver_Exti_Init
//introduce:        红外接收的IO中断初始化
//parameter:        none
//return:           none
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2016.12.29
//******************************************************************************
static void GUA_Infrared_Receiver_Exti_Init(void)
{   EXTI_InitTypeDef EXTI_InitStructure;//中断配置EXTI_ClearITPendingBit(GUA_INFRARED_RECEIVER_EXTI_LINE);GPIO_EXTILineConfig(GUA_INFRARED_RECEIVER_PORTSOURCE, GUA_INFRARED_RECEIVER_PINSOURCE);  EXTI_InitStructure.EXTI_Line = GUA_INFRARED_RECEIVER_EXTI_LINE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}//******************************************************************************
//name:             GUA_Infrared_Receiver_Init
//introduce:        红外接收初始化
//parameter:        none
//return:           none
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2016.12.29
//******************************************************************************
void GUA_Infrared_Receiver_Init(void)
{//初始化IOGUA_Infrared_Receiver_IO_Init();//初始化中断配置GUA_Infrared_Receiver_Exti_Init();
}//******************************************************************************
//name:             GUA_Infrared_Receiver_GetHighLevelTime
//introduce:        红外接收获取高电平维持时间
//parameter:        none
//return:           nNum:返回20us的个数
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2016.12.29
//******************************************************************************
static GUA_U16 GUA_Infrared_Receiver_GetHighLevelTime(void)
{GUA_U16 nGUA_Num = 0;//判断是否一直为高电平while(GPIO_ReadInputDataBit(GUA_INFRARED_RECEIVER_PORT, GUA_INFRARED_RECEIVER_PIN) == Bit_SET){//超时超时溢出if(nGUA_Num >= 250) {return nGUA_Num;}//计延时20us的次数nGUA_Num++;//延时GUA_Delay_Us(17);            }return nGUA_Num;
}//******************************************************************************
//name:             GUA_Infrared_Receiver_GetLowLevelTime
//introduce:        红外接收获取低电平维持时间
//parameter:        none
//return:           nNum:返回20us的个数
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2016.12.29
//******************************************************************************
static GUA_U16 GUA_Infrared_Receiver_GetLowLevelTime(void)
{GUA_U16 nGUA_Num = 0;//判断是否一直为低电平while(GPIO_ReadInputDataBit(GUA_INFRARED_RECEIVER_PORT, GUA_INFRARED_RECEIVER_PIN) == Bit_RESET){//超时超时溢出if(nGUA_Num >= 500) {return nGUA_Num;}//计延时20us的次数nGUA_Num++;//延时GUA_Delay_Us(17);          }return nGUA_Num;
}
//******************************************************************************
//name:             GUA_Infrared_Receiver_Process
//introduce:        红外接收的处理函数
//parameter:        none
//return:           GUA_INFRARED_RECEIVER_OK or GUA_INFRARED_RECEIVER_ERROR
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2016.12.29
//******************************************************************************
GUA_U8 GUA_Infrared_Receiver_Process(void)
{GUA_U16 nGUA_Time_Num = 0;GUA_U8 nGUA_Data = 0;GUA_U8 nGUA_Byte_Num = 0;GUA_U8 nGUA_Bit_Num = 0;   //接收引导码9ms的低电平,过滤无用信号>10ms或<8msnGUA_Time_Num = GUA_Infrared_Receiver_GetLowLevelTime();if((nGUA_Time_Num >= 500) || (nGUA_Time_Num <= 400)){return GUA_INFRARED_RECEIVER_ERROR;} //接收引导码4.5ms的高电平,过滤无用信号>5ms或<4msnGUA_Time_Num = GUA_Infrared_Receiver_GetHighLevelTime();if((nGUA_Time_Num >= 250) || (nGUA_Time_Num <= 200)){return GUA_INFRARED_RECEIVER_ERROR;}   //接收后4字节数据for(nGUA_Byte_Num = 0; nGUA_Byte_Num < 4; nGUA_Byte_Num++){//接收每字节8位数据for(nGUA_Bit_Num = 0; nGUA_Bit_Num < 8; nGUA_Bit_Num++){//接收每bit的前0.56ms的低电平,过滤无用信号>1.2ms或<0.40msnGUA_Time_Num = GUA_Infrared_Receiver_GetLowLevelTime();if((nGUA_Time_Num >= 60) || (nGUA_Time_Num <= 20)){return GUA_INFRARED_RECEIVER_ERROR;} //接收每bit的后高电平时长:高电平数据,1.68ms(1.2ms~2.0ms),低电平数据,0.56ms(0.2ms~1ms),过滤其他无用信号nGUA_Time_Num = GUA_Infrared_Receiver_GetHighLevelTime();if((nGUA_Time_Num >=60) && (nGUA_Time_Num < 100)){nGUA_Data = 1;}           else if((nGUA_Time_Num >=10) && (nGUA_Time_Num < 50)){nGUA_Data = 0;}else{return GUA_INFRARED_RECEIVER_ERROR;}//保存数据gGUA_InfraredReceiver_Data <<= 1;    gGUA_InfraredReceiver_Data |= nGUA_Data;                       }}return GUA_INFRARED_RECEIVER_OK;
}

注意,“GUA_Delay_Us(17);”函数实测为20us左右,我们想要延时的就是20us,因此形参为17。

2)编写驱动头文件GUA_Infrared_Receiver.h(存放在“……\HARDWARE”)

//******************************************************************************
//name:             GUA_Infrared_Receiver.h
//introduce:        红外传感器接收驱动的头文件
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2016.12.29
//******************************************************************************
#ifndef _GUA_INFRARED_RECEIVER_H_
#define _GUA_INFRARED_RECEIVER_H_/*********************宏定义************************/
#ifndef GUA_U8
typedef unsigned char GUA_U8;
#endif    #ifndef GUA_8
typedef signed char GUA_8;
#endif      #ifndef GUA_U16
typedef unsigned short GUA_U16;
#endif #ifndef GUA_16
typedef signed short GUA_16;
#endif         #ifndef GUA_U32
typedef unsigned long GUA_U32;
#endif #ifndef GUA_32
typedef signed long GUA_32;
#endif#ifndef GUA_U64
typedef unsigned long long GUA_U64;
#endif#ifndef GUA_64
typedef signed long long GUA_64;
#endif#define GUA_INFRARED_RECEIVER_OK                  0
#define GUA_INFRARED_RECEIVER_ERROR             1#define GUA_INFRARED_RECEIVER_KEY1             0x00FF00FF
#define GUA_INFRARED_RECEIVER_KEY2              0x00FF01FE
#define GUA_INFRARED_RECEIVER_KEY3              0x00FF02FD
#define GUA_INFRARED_RECEIVER_KEY4              0x00FF03FC/*********************外部变量************************/
extern GUA_U32 gGUA_InfraredReceiver_Data;/*********************外部函数声明************************/
extern void GUA_Infrared_Receiver_Init(void);
extern GUA_U8 GUA_Infrared_Receiver_Process(void);#endif

由于发送端自定义了四个按键,因此香瓜在这里将这四个按键键值写在这里,此处可自行修改。

3)工程中添加GUA_Infrared_Receiver.c

4)在MDK设置中添加驱动源文件路径

2、设置NVIC中断优先级(GUA_NVIC.c的GUA_NVIC_Init中)

   //红外接收GUA_NVIC_Config(NVIC_PriorityGroup_2, EXTI3_IRQn, 2, 2, ENABLE);
3、写中断服务函数(stm32f10x_it.c中)
1)添加头文件
#include "GUA_Infrared_Receiver.h"

2)编写中断服务函数

//******************************************************************************
//name:             EXTI3_IRQHandler
//introduce:        红外接收的处理函数
//parameter:        none
//return:           none
//author:           甜甜的大香瓜
//email:            897503845@qq.com
//QQ group          香瓜单片机之STM8/STM32(164311667)
//changetime:       2016.11.21
//******************************************************************************
void EXTI3_IRQHandler(void)
{//红外if(EXTI_GetITStatus(EXTI_Line3) != RESET){//接收红外数据正确if(GUA_Infrared_Receiver_Process() == GUA_INFRARED_RECEIVER_OK){function = FUNC_INFRARED_RECEIVER_EVENT;   }               //清除标志位  EXTI_ClearITPendingBit(EXTI_Line3);}
}

4、在应用层中调用

1)添加头文件(main.c中)

#include "GUA_Infrared_Receiver.h"

2) 添加驱动初始化代码(main.c的main函数中)

 //红外接收初始化GUA_Infrared_Receiver_Init();

3) 添加测试代码

①写红外接收处理事件(main.c的main函数中)

          //红外接收处理         case FUNC_INFRARED_RECEIVER_EVENT: {//键值处理switch(gGUA_InfraredReceiver_Data){//红外按键1case GUA_INFRARED_RECEIVER_KEY1:{break;}//红外按键2case GUA_INFRARED_RECEIVER_KEY2:{break;}//红外按键3case GUA_INFRARED_RECEIVER_KEY3:{break;}//红外按键4case GUA_INFRARED_RECEIVER_KEY4:{break;}    //其他default:{break;}                                    }//返回空闲状态function = FUNC_IDLE_EVENT;               break;               }

②写红外处理事件宏(main.h中)

//主轮询的宏
#define FUNC_IDLE_EVENT                       0x00    //空闲
#define FUNC_INFRARED_RECEIVER_EVENT                  0x16    //红外接收处理

七、注意事项

暂无。

八、实验结果

仿真并设置断点在红外接收处理事件中,全速运行。

当遥控器发送0x00FF00FF的键值时,代码会停止在断点处,并且gGUA_InfraredReceiver_Data的值为0x00FF00FF。

【STM32】STM32之红外接收相关推荐

  1. STM32 —— STM32 的串口通信

    STM32 -- STM32 的串口通信 STM32的串口通信接口有两种,分别是:UART(通用异步收发器).USART(通用同步异步收发器).而对于大容量 STM32F10x 系列芯片,分别有 3 ...

  2. (Eclipse)(STM32) STM32在Eclipse編程

    因為Keil需要破解才能compile超過32K大小的程式碼,最近在STM32上使用Lua Lib. 所以輕易就超過32K了,萌生想換IDE的想法.之後轉到Ubuntu 應該也能越來越適應. 首先安裝 ...

  3. STM32——stm32 I2C通信代码配置(2)(学习笔记)

    STM32--I2C通信配置 I2C的系统框架 1.通讯引脚 2.时钟控制逻辑 3.数据控制逻辑 4.整体控制逻辑 通信过程 写入过程 读取过程 I2C代码配置 I2C的初始化结构体 几个重要的函数 ...

  4. STM32——STM32简介与创建工程

    文章目录 一.stm32简介 stm32MCU: ARM: 命名规则: 片上资源/外设: 系统结构: 引脚的定义 功能引脚介绍: 最小系统引脚介绍: 电源引脚介绍: 启动配置 最小系统电路 二.软件安 ...

  5. 步进电机c语言源代码 stm32,STM32控制步进电机源代码

    单片机源程序如下: #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "misc. ...

  6. 步进电机c语言源代码 stm32,stm32 42步进电机基本旋转实现内含源代码

    /* 包含头文件 ----------------------------------------------------------------*/ #include "StepMotor ...

  7. c语言定义全局变量stm32,STM32 多文件全局变量简单定义方法

    建立3个文件分别是 MainMap.h     SlaveMap.h    MainMap.h//=================================================== ...

  8. [STM32] STM32 移植 U8g2库

    文章目录 前言 1. 准备 2. 移植步骤 2.1 建立有效的通信 2.2 导入U8g2库 2.3 用例测试 总结 前言 开发平台:Keil + 标准库 硬件平台:STM32F103RCT6 显示器件 ...

  9. php和stm32,stm32单片机的gpi和gpo分别有几种工作方式

    GPI有四种工作方式,分别为:浮空输入.上拉输入.下拉输入.模拟输入:GPO有四种工作方式,分别为:开漏输出.开漏复用功能.推挽输出.推挽复用功能. GPI有四种工作方式,分别为:浮空输入.上拉输入. ...

最新文章

  1. 使用Session服务未开启错误解决方案
  2. DataGridView 单元格自动填充
  3. python进阶:JSON与枚举
  4. 【Groovy】map 集合 ( 根据 Key 获取 map 集合中对应的值 | map.Key 方式 | map.‘Key’ 方式 | map[‘Key’] 方式 | 代码示例 )
  5. 图解用Wireshark进行Http协议分析
  6. Linux下VSFTP配置全攻略
  7. Docker shipyard 试用
  8. HTML 5 各浏览器支持情况
  9. linux编译安装的报错,linux编译安装时常见错误解决办法
  10. Lua4.0 实现#操作,获取table大小
  11. zabbix系列zabbix3.4监控mysql5.7
  12. 开发机至少要有16G内存
  13. 2.1 px30驱动移植-DRM驱动框架简介
  14. WordPress实现前台登录or注册功能
  15. Android下载自带开源图标库教程
  16. 2021年,中国程序员前景一片灰暗,真的是这样吗?
  17. ubuntu清理vscode缓存
  18. 关于人性的一些思考:如何提高员工工作热情与成就感,以及因材施教的心灵培训
  19. C# Revit二次开发基础/核心编程---建筑建模-标高和轴网
  20. 区块链白皮书阅读笔记

热门文章

  1. Codeforces」 Round #782 (Div. 2) A —D
  2. 如何实现微信自定义分享标题、图片、描述等信息
  3. 企业进行高质量数据管理,实施数据治理的关键是什么?
  4. Erlang安装 /开启关闭 /配置开发环境 /运行程序
  5. STM32——GPIO
  6. 全新UI视频打赏系统全开源版本+附教程/实测可用
  7. access令两列运算得到新属性_iOS版更预告 | 新玩法新精灵来袭开启你的全新旅程...
  8. 揭开勒索软件的真面目
  9. python 机器人运动仿真_使用RoboDK对工业机器人与传送带进行动态仿真
  10. h264源码分析[0]