基于STM32的红外遥控和解码遥控程序解析

发布者:sjp5035022最新更新时间:2016-09-02 来源: 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高。如下图:

11

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

12

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

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

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

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

1、Remote_Init();

13

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

2、TIM4_IRQHandler();

14

15

 

16

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

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))是否成立),然后通过移位读取之前在捕获中断中存进去的数据,再进行原码和反码的对比。这里不多说了。。

17

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

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

关键字:STM32  红外遥控  解码遥控 引用地址:基于STM32的红外遥控和解码遥控程序解析

上一篇:基于STM32平台的CoAP Server方案
下一篇:使用STM32完成智能电机保护器设计方案

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

STM32使用内部晶振记录
在不使用外部晶振的时候,引脚悬空。也可按照网上方法,接地或者重映射。 使用内部晶振软件配置方法。内部晶振名称为HSI, 外部晶振名称为HSE. 1. 进入SystemInit 2. 在system_stm32f10x.c中,把//#define SYSCLK_FREQ_72MHz 72000000一句注释掉 3.此时不再做任何设置,运行频率为8M。可在仿真时查看 如需更高频率,需要倍频操作,推荐使用寄存器方式操作,操作寄存器为 RCC_CFGR. 设置倍频系数:PLLMUL位时需先关闭 PLL使能,再设置。 在void SystemInit (void)中具体程序如: 修改完频率之后,delay_ms
[单片机]
<font color='red'>STM32</font>使用内部晶振记录
STM32 F7如何满足嵌入式系统更高处理性能需求
  意法半导体(ST)日前宣布推出业界首款基于ARM最新Cortex-M7内核的STM32 F7系列微控制器,其性能远超ST之前的32位STM32F4微控制器,通过无缝升级路径可将处理性能和DSP性能提高一倍。   “作为STM32微控制器产品家族的高端产品,STM32 F7使内存和外存的性能达到一个新的水平,给开发人员带来新的创新机会,保证他们不需要再根据存储器性能调整代码。”ST微控制器市场总监Daniel Colonna表示,“而之所以能够在业内率先推出基于Cortex-M7的产品,首先得益于ST与ARM密切的合作关系。其次,ST也与第三方客户保持着广泛的合作,确保他们能够及时得到ARM最新的技术支持并推出新产品。强大的
[电源管理]
<font color='red'>STM32</font> F7如何满足嵌入式系统更高处理性能需求
STM32之NVIC
STM32(Cortex-M3) 中NVIC(嵌套向量中断控制)的理解 一、STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作 亚优先级 或 副优先级 ,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行 抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有低副优先级中断正
[单片机]
STM32_RTC晶振不起振的原因及解决方法
STM32的RTC晶振经常出现不起振的问题,这已经是“业界共识”了。。。很多人在各种电子论坛上求助类似于“求高手指点!RTC晶振不起振怎么办”的问题,而其答案基本可以概括为“这次高手帮不了你了” 更有阴谋论者提出让人啼笑皆非的解释——STM32的RTC晶振不起振是ST与晶振厂商串通后故意搞出来的,目的是提高某晶振厂商高端晶振的销量。。。 最近做的几块板子也用到了STM32的RTC,前后两版一共做了大概6片,幸运的是并未遇到晶振不起振的现象。而我采用的是3毛钱一个的普通晶振,并未选用传说中低负载高精度晶振。。。后来在另外一片实验性质的板子上首次遇到了晶振不起振的问题,而且做了2片都不起振,这才让我意识到这个问题的严重性。
[单片机]
Stm32 RTC介绍相关笔记
1.由于最近一段时间要进行期末考试,所以很久没有动32了,从现在开始,可以再开始学了 2.RTC(REAL TIME CLOCK) 1.作为Stm32内部的实时时钟,可以看做一个独立的定时器,在代码的配置下,可以作为时钟日历的功能 2.注意:RTC的配置过程十分敏感,因为对于RTC的配置过程中,是在后备区域进行,由于系统在自动复位以后,自动会禁止后备寄存器和RTC(写保护),所以在配置的过程中要进行对写保护的撤销 3.RTC简图 4.配置重点: 因为RTC配置需要对后备区域进行配置,配置的时候要判断是否寄存器完成和同步,也要取消对备份区的写保护 1.初始化过程 #include del
[单片机]
<font color='red'>Stm32</font> RTC介绍相关笔记
基于STM32-蜂鸣器
1.蜂鸣器 蜂鸣器是一种发声设备,被广泛用于计算机、打印机、复印机、报警器、电子玩具等。后面介绍定时器是会给大家说说利用蜂鸣器实现歌曲演奏。蜂鸣器分为有源蜂鸣器和无源蜂鸣器。那么什么是有源,什么是无源呢?这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供 2~5Khz 左右的方波驱动才能发声。 2.硬件介绍 这里使用STM32F103实现无源蜂鸣器的交替发声,下图是硬件设计图。首先,STM32F1 的单个 IO 最大可以提供 25mA 电流(数据手册查看),而蜂鸣器的驱动电流是 30mA 。这里使用一个NPN三极管(S8050)扩
[单片机]
基于STM32-蜂鸣器
STM32】DMA基本原理、寄存器、库函数(2)
05 DMA中断状态寄存器(DMA_ISR) 作用:可以获取DMA传输的状态标志。 注意:此寄存器为只读寄存器,所以在这些位被置位后只能通过其他的操作来清除。 06 DMA中断标志清除寄存器(DMA_IFCR) 作用:通过往寄存器内写1来清除DMA_ISR被置位的位。 DMA通道配置过程 下面是配置DMA通道x的过程(x代表通道号): 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标; 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址; 在DMA_CNDTRx寄存器中设置要传输的数据量
[单片机]
STM32开发者社区:从这里开启你的STM32之旅!小白和PRO都友好
当面对STM32Cube生态系统这样一个庞大而丰富的开发世界时,工程师难免会产生疑问,从哪里开始才好? ST的许多合作伙伴和客户都希望有更多的产品能够利用STM32Cube开发环境。开发人员很享受开发环境的图形用户界面和工具的易用性,如STM32CubeMX、免费的STM32CubeIDE以及许多软件包、驱动程序和中间件,这些都有助于更快地将产品推向市场。随着越来越多的企业选择ST的产品,越来越多的工程师在ST的生态系统中迈出了第一步。为了降低开发人员的进入门槛,ST推出了STM32开发者社区。开发者社区如何为开发团队提供帮助,ST如何将STM32生态系统整合在一起?让我们详细聊聊。 STM32开发者社区 为开
[单片机]
<font color='red'>STM32</font>开发者社区:从这里开启你的<font color='red'>STM32</font>之旅!小白和PRO都友好
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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