历史上的今天
返回首页

历史上的今天

今天是:2025年03月29日(星期六)

2019年03月29日 | STM32HAL----红外遥控(NEC)

2019-03-29 来源:eefocus

整理了一个NEC协议的红外程序,NEC协议,物理环境为F103原子战舰V3,使用STM32CubeMX生成初始程序。


定时器配置72分频,9999装载值(10MS)


 


NEC协议:


数据格式: 同步码头 + 地址码 +地址反码 + 按键码 + 按键反码 (LSB先行)


同步码头:9ms低电平 + 4.5ms高电平


连发码 :   9ms低电平 + 2.5ms高电平


逻辑1:      560us  +  1680us


逻辑0:      560us  +  560us


 


程序:


头文件:


#ifndef __Fun_Infrared_H

#define __Fun_Infrared_H

 

 

#include "stm32f1xx_hal.h"

#include "tim.h"

 

 

#define  RangJudge(val,min,max)   (val>min? (val

 

 

typedef struct T4_Infrared

{

        uint32_t  KEY_VALUE;   //记录32位地址以及按键码

uint16_t  TriTime[2];  //记录电平持续时间 0:低电平  1:高电平

uint8_t   DataBit;

uint8_t   FrameStart;

        uint8_t   KEY_Count;

uint8_t   TriPolarity;


}T4_InfraredDev;

 

 

extern T4_InfraredDev  *T4Infra;

 

 

 

 

 

 

void T4InfraInit(void);

 

void TIM4_InfraPeriodHandle(void);

 

void TIM4_InfraCaptureHandle(void);

 

uint8_t  GetInfraredKey(void);


uint8_t  GetInfraredAddr(void);

 

#endif

 

源文件:


#include "Fun_Infrared.h"

 

 

T4_InfraredDev  T4Infra_S, *T4Infra = &T4Infra_S;

 

 

void T4InfraInit(void)

{

        HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_4);

__HAL_TIM_ENABLE_IT(&htim4, TIM_IT_UPDATE);  //使能更新中断


T4Infra->TriPolarity = 0;

T4Infra->FrameStart = 0;

}

 

 

//改变TIM4 CHANNEL4的捕获极性

void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)

{

  uint16_t tmpccer = 0;

 

  tmpccer = TIMx->CCER;

 

  tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC4P);

  tmpccer |= (uint16_t)(TIM_OCPolarity << 12);

 

  TIMx->CCER = tmpccer;

}

 

 

//捕获中断处理函数

void TIM4_InfraPeriodHandle(void)

{

T4Infra->TriPolarity = 0;

        T4Infra->FrameStart = 0;

T4Infra->TriTime[0] = 0;

T4Infra->TriTime[1] = 0;

}

 

 

//捕获中断处理函数

void TIM4_InfraCaptureHandle(void)

{

 

  T4Infra->TriPolarity = !T4Infra->TriPolarity;


  /************************** 切换极性以及捕获电平持续时间 **************************/


     if(!T4Infra->TriPolarity)  //上升沿触发

{

TIM_OC4PolarityConfig(TIM4, TIM_INPUTCHANNELPOLARITY_FALLING);


T4Infra->TriTime[T4Infra->TriPolarity] = \

                        HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4);

}

else  //下降沿触发

{

TIM_OC4PolarityConfig(TIM4, TIM_INPUTCHANNELPOLARITY_RISING);


                         if(T4Infra->FrameStart == 1) 

{

                             T4Infra->TriTime[T4Infra->TriPolarity] = \

                             HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4);

}


                        T4Infra->FrameStart = 1; //开始接收帧    

}


TIM4->CNT = 0; //清除TIM4计数值

 

  /**************************** 判断同步码以及重复码 ***************************/


if(RangJudge(T4Infra->TriTime[0],8500,9500) && \

                   RangJudge(T4Infra->TriTime[1],4000,5000) ) 

{

T4Infra->KEY_VALUE = 0;  //同步码

T4Infra->KEY_Count = 0;  

                         T4Infra->DataBit = 0; 

}

else if(RangJudge(T4Infra->TriTime[0],8500,9500) && \

                        RangJudge(T4Infra->TriTime[1],2000,3000) ) 

{

if(++T4Infra->KEY_Count > 250) T4Infra->KEY_Count = 250;    //连发码

}


  /********************************* 接收数据 *********************************/

if( T4Infra->TriPolarity == 1) 

{

                      if(RangJudge(T4Infra->TriTime[0],450,650) && \

                         RangJudge(T4Infra->TriTime[1],450,650) ) 

{

   T4Infra->KEY_VALUE &= ~(1

}

 

                        else if(RangJudge(T4Infra->TriTime[0],450,650) && \

                              RangJudge(T4Infra->TriTime[1],1450,1750) ) 

{

   T4Infra->KEY_VALUE |= 1<

}

}



}

 

 

//获取按键值

uint8_t  GetInfraredKey(void)

{

   //通过与反码异或,验证按键码的正确性

   if( (uint8_t)( (T4Infra->KEY_VALUE >> 24) ^ (T4Infra->KEY_VALUE >> 16) ) == 0xff  )

   return (uint8_t)(T4Infra->KEY_VALUE>>16);

 

   else  return 0;

}

 

 

//获取地址

uint8_t  GetInfraredAddr(void)

{

   if( (uint8_t)( (T4Infra->KEY_VALUE ) ^ (T4Infra->KEY_VALUE >> 8) ) == 0xff  )

   return (uint8_t)(T4Infra->KEY_VALUE);

 

   else  return 0;

}

 

主函数:


#include "Fun_Infrared.h"

 

int main(void)

{

  HAL_Init();

 

 

  SystemClock_Config();

 

  MX_GPIO_Init();

  MX_TIM4_Init();

  MX_USART1_UART_Init();

 

  T4InfraInit();  //启动TIM4

 

  while (1)

  {

printf("按键次数:%d\r\n",T4Infra->KEY_Count);

                printf("键值:0x%02X\r\n",GetInfraredKey() );

printf("地址:0x%02X\r\n",GetInfraredAddr() );

HAL_Delay(2000);

  }

 

}

 

 

 

//更新中断

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

    if(htim->Instance == TIM4)

{

  TIM4_InfraPeriodHandle();

}

}

 

 

 

//捕获中断

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

{

 

    if(htim->Instance == TIM4)

{

TIM4_InfraCaptureHandle();

}

}

 


实验现象:

推荐阅读

史海拾趣

Delus Corp公司的发展小趣事

Delus Corp公司非常重视人才培养和团队建设。公司积极引进高素质人才,并为员工提供良好的培训和发展机会。公司建立了完善的激励机制和绩效考核体系,激发员工的工作积极性和创造力。同时,公司还注重团队建设和文化建设,营造了一个积极向上、团结协作的工作氛围。这些措施的实施,使得公司拥有一支高素质、专业化的团队,为公司的发展提供了有力的人才保障。

FOX [Fox Electronics]公司的发展小趣事

进入21世纪后,Fox Electronics意识到全球化对于企业发展的重要性。为了更好地服务全球客户,公司开始在全球范围内布局生产基地和销售网络。通过在亚洲、欧洲和北美等地设立分厂和办事处,Fox Electronics不仅缩短了交货周期,还降低了生产成本,提高了市场竞争力。同时,公司还加强了与全球供应链伙伴的合作,通过优化供应链管理,确保产品质量和交货期的稳定性。

普芯达电子(Chipswinner)公司的发展小趣事

普芯达电子自创立之初,就立志成为国产高品质、高性价比的IC产品供应商。在成立初期,公司面临着资金紧张、技术积累不足以及市场竞争激烈等多重挑战。然而,凭借着创始人对集成电路行业的深厚理解和坚定信念,普芯达电子逐步克服了这些困难,通过引进优秀人才、加大研发投入以及不断优化产品质量,逐渐在市场上崭露头角。

BERNSTEIN公司的发展小趣事

在BERNSTEIN公司的发展过程中,家族传承和企业管理一直是一个重要的主题。Hans-Joachim Bernstein作为Hans Bernstein的长子,在塑造公司的成功故事中发挥了重要作用。在他的管理下,“SpezialFabrik für Schaltkontakte”公司发展成为当今在国际上活跃的技术集团。这家家族企业现已进入第三代,Nicole和Achim Bernstein作为新一代领导人,继续传承着家族的优良传统和企业文化,推动着公司的持续发展。

Enovation Controls LLC公司的发展小趣事

随着工业技术的不断发展,BERNSTEIN公司始终保持着对技术创新的热情。在公司的发展史上,它涉足了几乎所有的重要技术发展的阶段,从电子开关到传感器,再到工业机箱等领域,都取得了显著的成就。尤其是在工业安全技术方面,BERNSTEIN公司凭借其卓越的技术实力和产品质量,成为了行业内的佼佼者。

EXCELTA公司的发展小趣事

随着科技的不断进步和市场的不断变化,Excelta始终将技术创新作为公司发展的核心驱动力。公司投入大量资金和资源进行技术研发和产品创新,不断推出具有竞争力的新产品。其中,一款高性能的微型连接器产品凭借其出色的性能和稳定性在市场上取得了巨大成功。此外,Excelta还积极探索新的应用领域和市场机会,为公司的持续发展注入了新的活力。

问答坊 | AI 解惑

晒板子28335

28335电力电子与电力传动专用控制板 …

查看全部问答>

1-wire系统中TM卡的单片机等效替换

1 TM卡简介   TM(Touch Memory)卡是美国Dallas公司的专利产品。它采用单线协议通信,通过瞬间碰触完成数据读写,既具有非接触式IC卡的易操作性,又具有接触式IC 卡的廉价性,是当前性价比最优秀的IC卡之一。它的外形类似于一个钮扣(button) ...…

查看全部问答>

浙江大学RF设计(前端系统)(pdf)

第10个附件是一个超外差高频头的实例,很宝贵的资料…

查看全部问答>

说说模拟设计那点事儿和那几本书

我学习模电有一段时间了,向大家推荐几本自认为的\"宝典\",谈下自己使用它们的感受以及在学习模电过程中的体会,供后来者参考: 1. 拉扎维的《模拟CMOS集成电路设计》,我们研二模电课的教材,汪宁老师把这门课讲得可圈可点。当时没意识到有其他 ...…

查看全部问答>

基于Win32 API函数和多线程技术的串行通信编程.pdf

基于Win32 API函数和多线程技术的串行通信编程.pdf…

查看全部问答>

无法收到PBT_TRANSITION消息

在WinCE6下一个应用程序里,使用RequestPowerNotifications(hPowerNotificationMsgs, POWER_NOTIFY_ALL); 去请求power状态改变的通知。可是从开始菜单进入suspend的时候并没有收到任何power消息,但是按Power Button从suspend状态resume回来的时 ...…

查看全部问答>

RAS拨号监视消息

如何在RAS异步拨号时,得到当前拨号的状态,我写的消息和回调函数都可以在PC机上用,但在CE上都不能用(CE只支持消息),代码如下:消息的、 先注册了消息: const   UINT   WM_RASEVENT   =   ::Regist ...…

查看全部问答>

u-boot 的 配置问题.(从NAND启动)

提示的是 bad crc or nand 在网上查了下,应该是env的问题!麻烦各位有经验的朋友,说一下具体怎么改! 我用的是mini2440,page size应该是2048的,但是u-boot启动输出的还是512~已经进行过CONFIG_了…

查看全部问答>

请教高手:如何在扫描输入完成后,光标自动跳到下一个TEXTBOX

我想让程序在扫描输入完成后,光标自动跳到下一个TEXTBOX 可是我在WINCE上捕捉不到扫描键,也不知道如何区分 输入 是由键盘上输入的还是扫描读入的 哪位高手知道的帮帮我,谢谢 啦 …

查看全部问答>

VxWorks嵌入式国际认证培训班

        为满足各大企业及研发机构对嵌入式操作系统VxWorks人才需求,顺应广大学员学习嵌入式操作系统、获得国际认证证书、增强就业竞争力、取得高薪职位的要求,上海双实科技与上海张江信息技术专修学院继续合作举办VxWorks嵌 ...…

查看全部问答>