基于STM32的红外遥控重点解析

发布者:祝福的4号最新更新时间:2017-09-22 来源: eefocus关键字:STM32  红外遥控 手机看文章 扫描二维码
随时随地手机看文章

本文有两个内容:一、红外遥控协议的的讲解;二、解码程序解析(参考正点原子的代码)
红外的介绍、优点、缺点就不给大家说了,进入正题
一、红外遥控协议的的讲解
红外遥控的编码目前广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5 Protocol的PPM(脉冲位置调制)
本文将以NEC协议实现红外遥控。
NEC协议的特征:
1、8位地址和8位指令长度;
2、地址和命令两次传输;(确保可靠性)
3、PWM脉冲宽度调制,以发射红外载波的占空比代表“0”和“1”;
4、载波频率为38KHz
5、位时间为1.125ms和2.25ms
NEC码位的定义:一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。而遥控接收头在收到脉冲时为低电平,在没有收到脉冲时为高电平,因此,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。如下图:


NEC遥控指令的数据格式为:同步码头(引导码)+地址码+地址反码+控制码+控制反码。同步码是由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均为8位数据格式。按照高位在前低位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。下图是我们按下按键2时,从红外接收头端测到的波形:


在图中可以看到,在100ms之后,我们还收到了几个脉冲,这是NEC码规定的连发码(由9ms低电平+2.5ms高电平+0.56ms低电平和97.94ms高电平组成),如果在一帧数据发送完后,按键仍没有松开,则发送重复码(连发码),可以通过统计连发码的次数来标记按键按下的长短/次数。


二、解码程序解析(参考正点原子的代码)

在正点原子的代码中是利用定时器的输入捕获功能来实现遥控解码的,下面解析一下关键代码:

在该实验remote.h文件中,定义了3个函数:Remote_Init();、TIM4_IRQHandler();、Remote_Scan();。

1、Remote_Init();


这里要注意中断优先级,定时器4的两个中断,溢出(更新)中断,捕获事件中断的优先级是一样的。意思就是,他两谁也不能打断谁,例如A在执行时,B就不会产生中断。这里很重要,很重要,很重要!

2、TIM4_IRQHandler();




注意上图中画红框的状态标识,下面解析一下此中断服务函数(该终端服务函数中有两个中断,溢出中断和捕获中断):

1、先看捕获中断,Rmtsta刚开始时为0,当发生一次上升沿捕获时(RDATA对应的引脚得到一个高电平),先把捕获事件配置为下降沿捕获,然后Rmtsta=0x10,标记了上升沿已经被捕获;

2、当有下降沿到来时,将CCR1寄存器的值赋给Dval变量,并再将捕获事件配置为上升沿捕获;补充:像这样上升沿捕获和下降沿捕获交替使用,是为了捕获到高电平持续时间。

3、注意:只有当接收头收到了引导码后,才进行解码。故先判断Dval的值是不是在4200us~4700us之间,如果在,就将Rmtsta|=1<<7,将Rmtsta的最高位置1,标记成功接收到了引导码;

4、当Rmtsta的最高位被置为1后,即满足了if(Rmtsta&0x80),就可以判断Dval的值在下面3钟范围内了:300~800(560us)、1400~1800(1680us)、2200~2600(2500us)。从而得到0或者1或者RmtCnt++。实现了解码。

4、以上3条,其中的高电平持续时间都在10ms之内,意思就是还没到10ms就产生了捕获中断(上升沿和下降沿),因为优先级相同的原因,这时是无法产生溢出中断的。只有当你到10ms了,还没有产生上升沿捕获或下降沿捕获,就会产生溢出中断;

5、那什么情况下10ms都没有产生捕获呢,那就是上文中的连发码,那个97.94ms的高电平,远大于了10ms,故会产生溢出中断。在溢出中断里会标记已经完成一次完整的键值信息采集(RmtSta|=1<<6),正点原子在溢出中断中给设的连发码时间为130ms,超过130ms视为是松开按键了(因为松开按键就不会有脉冲,也就是高电平,看上文)。


此外,处理红外键盘的程序就很简单了,先判断是不是得到所有一个键的所有信息了(根据上一条,判断if(RmtSta&(1<<6))是否成立),然后通过移位读取之前在捕获中断中存进去的数据,再进行原码和反码的对比。这里不多说了。。


注意:遥控器发过来的码都是编好的,比如想破解遥控器编码,可以拿示波器去测接收端的码。(这个我没试过~~)

整个程序思路不难,就是对遥控器发过来的码进行解码,这里主要是两个中断的理解。。


关键字:STM32  红外遥控 引用地址:基于STM32的红外遥控重点解析

上一篇:基于STM32的OV7670摄像头总结
下一篇:基于STM32的触摸屏学习笔记

推荐阅读最新更新时间:2024-03-16 15:37

一步一步实现STM32-FOTA系列教程之FLASH静态区读写
前言 在上一篇文章《一步一步实现STM32-FOTA系列教程之STM32-FLASH分区说明》中,对STM32的FLASH进行了人为了分区,分成了 Bootloader分区、主分区、备份分区和静态区四个区域。其中静态区是用来存放系统一些参数信息的,该分区的内容可以通过编程进行读写,如果不人为的破坏该分区,分区里面的信息会一直保存,掉电不丢失,也就是所谓的FLASH模拟EEPROM的功能。 这篇文章就来说说如何在程序中进行FLASH静态区的读写操作,以方便后续的使用。 FLASH静态区使用 我们在FLASH中给静态区分配了32KB大小的空间,即从0x0803 8000 ~ 0x0804 0000 一共 32 * 1024 字节。
[单片机]
STM32的便携式手机蓝牙考勤机系统设计
摘要:在研究各种考勤系统的基础上,提出了一种手机蓝牙实现考勤的方法。该系统采用STM32F103RBT6微处理器作为核心,利用蓝牙模块搜索手机蓝牙设备与本地数据库进行匹配,通过语音播报和液晶显示两种方式给出考勤结果。该设计可以改变传统的被动式考勤方式,且成本低、操作简便。 引言 目前,大部分考勤系统还是磁卡考勤系统,这类系统不仅签到速度慢,而且终端设备和磁卡也造成一定成本和浪费;指纹考勤、人脸识别考勤、视网膜考勤等新一代考勤技术虽然大大地提高了考勤效率和准确率,但是这类考勤机的费用较高、操作比较麻烦。以上几种都是采用被动式的考勤机制,科技的发展和生活节奏的加快为被动式考勤方式带来了新的挑战,手机蓝牙考勤机就是针对以上考勤机的缺
[单片机]
<font color='red'>STM32</font>的便携式手机蓝牙考勤机系统设计
stm32定时器输入捕获pwm
花了两天时间终于把stm32f103的定时器输入捕获弄懂了,这里以TIM3的通道ch1为例,要实现输入捕获需要配置一下寄存器,TIMx_ARR,TIMx_PSC,TIMx_CCMR1,TIMx_CCER,TIMx_DIER,TIMx_CR1,TIMx_CCR1.这里抓取了一些收据手册中寄存器描述的图 下面一一介绍: TIMx_ARR寄存器为自动重装载的值 TIMx_CR1这里了只要用到它的第0位即使能位。 TIMx_CCMR可以配置对应通道映射到那个IC,TI。 这里我们是第一通道故只需配置低8位,cc1s为配置ch1映射到那个TI,IC1PSC为配置是否分频,1c1f为配置是否滤波。 TIMx_psc寄存器 T
[单片机]
STM32之JScope调试
J-Scope是SEGGER公司推出的,可以在目标MCU运行时,实时分析数据并图形化显示的软件。我们一起来了解一下J-Scope吧。 我们在前四篇的文档中介绍了MCU向调试终端输出信息的方法。今天就介绍一个更炫更酷、可以图形化显示数据的调试法宝—JScope。 J-Scope是SEGGER公司推出的,可以在目标MCU运行时,实时分析数据并图形化显示的软件。它不需要像SWO那样需要MCU上面额外的引脚,而是使用标准的调试接口。J-Link驱动4.90之后的版本都有这个软件哦。 J-Scope可以像示波器一样显示多个变量的值,通过读取一个ELF文件,允许选择一定数量的变量可视化,如图 1所示。你可以简单的将目标MCU连接到
[单片机]
<font color='red'>STM32</font>之JScope调试
STM32单片机的原理详解 STM32时钟系统的配置方法
1.概述 时钟 是单片机的脉搏,是单片机的驱动源,使用任何一个外设都必须打开相应的时钟。这样的好处是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。 每个时钟 ti ck,系统都会处理一步数据,这样才能让工作不出现紊乱。 2.原理 首先,任何外设都需要时钟, 51单片机 , STM32 ,430等等,因为 寄存器 是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。 51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以用了,而这个时钟是默认开启的,比如有一个水库,水库有很多个门,这些门默认是开启的,所以每个门都会出水,我们需要哪个门的水的时候可以直接用,
[单片机]
<font color='red'>STM32</font>单片机的原理详解 <font color='red'>STM32</font>时钟系统的配置方法
stm32用ucos还是linux
  常见的嵌入式操作系统有两种:用MMU的和不用MMU的。 用MMU的是Windows、 MacOS 、Linux、 Android,不用MMU的是FreeRTOS VxWorks ucOS。 CPU有两种:带MMU的和不带MMU的,带MMU的有Cortex-A系列ARM9、 ARM11系列,不带MMU的有Cortex-M系列。 stm32用ucos还是linux STM32是M系列,不带MMU控制器,不可能运行Linux,当然, STM32能够跑μClinux,但是严格来说,μClinux是不算Linux的。所以对于很多网友有疑问的stm32用ucos还是linux这个问题,我们就知道答案了,stm32是用
[单片机]
一步步写STM32 OS【三】PendSV与堆栈操作
一、什么是PendSV PendSV是可悬起异常,如果我们把它配置最低优先级,那么如果同时有多个异常被触发,它会在其他异常执行完毕后再执行,而且任何异常都可以中断它。更详细的内容在《Cortex-M3 权威指南》里有介绍,下面我摘抄了一段。 OS 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动 作。悬起 PendSV 的方法是:手工往 NVIC的 PendSV悬起寄存器中写 1。悬起后,如果优先级不够 高,则将缓期等待执行。 PendSV的典型使用场合是在上下文切换时(在不同任务之间切换)。例如,一个系统中有两个就绪的任务,上下文切换被触发的场合可以是: 1、执行一个系统调用 2、系统滴答定时器(SYSTIC
[单片机]
一步步写<font color='red'>STM32</font> OS【三】PendSV与堆栈操作
STM32如何收发float类型数据?
在之前文章里提到了共用体用来传输浮点数的用法,但那篇笔记中没有详细介绍,这篇笔记我们一起来看一看具体实例。 实际应用中,我们可能需要两个设备通过串口传输浮点数据: 本篇笔记为了方便演示,使用串口助手模拟其中一个设备,本篇笔记内容如下: 我们创建一个用于管理float类型数据的共用体: unionfloat_data { floatf_data; uint8_tbyte ; }; 数据的流向如: 本次使用串口助手模拟发送设备,省略了第一步,主要看第②、③步。 创建两个共用体变量,用于发送与接收: unionfloat_datarx_float_data,tx_float_data; 收发相关代码: 左
[单片机]
<font color='red'>STM32</font>如何收发float类型数据?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved