历史上的今天
今天是:2025年01月30日(星期四)
2020年01月30日 | STM32之红外接收
2020-01-30 来源:eefocus
一、简介
本文介绍如何在STM32上使用红外接收头接收红外信号。
其中,红外协议采用为最常见的NEC协议。
二、实验平台
库版本:STM32F10x_StdPeriph_Lib_V3.5.0
编译软件:MDK4.53
硬件平台:STM32开发板(主芯片stm32f103c8t6)
仿真器:JLINK
三、版权声明
四、实验前提
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)
{
//初始化IO
GUA_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
史海拾趣
|
随着X-By-Wire、Telematics、Car-PC等车用信息技术概念逐渐 变为现实,现代汽车已由传统的机械平台,逐渐过渡到集机械、电子 和信息技术于一体的高技术平台,同时也标志着汽车已由功能单一的 交通工具,转化为人们生存的第三信息空间。作为现代电子 ...… 查看全部问答> |
|
PIC单片机KIT2仿真器 PIC KIT2 是一款完全兼容于Microchip公司新推出的PICKIT 2的PIC单片机开发工具,它能够对Microchip 的几乎所有的闪存单片机编程。同时它也能对Microchip的几乎所有的闪存单片机进 ...… 查看全部问答> |
|
[紧急求助]单片机系统在高低温过程中死机,不可自恢复!!!!!!! 我的系统采用了一款philips的80C51单片机P89LV51RD2,其温度范围是0-70度。单片机系统在常温下已 经过至少2周的烤机,没有复位过。在常温测试完成后,进入高低温测试阶段。启用了单片机自带的看门狗,所以没有设置外部的硬件看门狗。 目前的现象是 ...… 查看全部问答> |
|
我现在要实现一个USB驱动,我之前没写过USB驱动,对其不甚了解,请高手指点一二: 用windows系统的USB驱动上开发用户态驱动程序 windowXP系统! 传输第一个字节是端口ID号!其他是传输数据! 具有读写功能 我对\"传输第一个字节是端口ID号\"不 ...… 查看全部问答> |
|
Freescale iMX27 iMX515硬件平台设计—兼职Allegro PCB Layout Freescale iMX27 iMX515 Hardware Design—Allegro PCB Layout Freescale iMX27 iMX515硬件平台设计—兼职Allegro PCB Layout 本人现从事(嵌入式ARM)电子硬件设计开发工作。工作时间较为自由。现利用业余时间 兼职Allegro PCB Layout,或者代 ...… 查看全部问答> |




