D1PRE为1时,APB1总线上的外设和TIM都是1分频。

但当D1PRE不为1时,APB1总线上的外设是1分频,但TIM是2分频。

remote.c

#include "remote.h"//在本文件中开启了定时器1,无需在cubemx中设置
//配置时钟树的时候应把TIM1所挂总线(挂在APB2上)的频率改为200M,输入捕获模式。因为定时器的分频系数在本文件中已经确定为199,即定时器的计数频率为1MHz//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK 阿波罗STM32F7开发板
//红外遥控解码驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/12/30
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved
//  TIM_HandleTypeDef TIM1_Handler;      //定时器1句柄
TIM_IC_InitTypeDef TIM1_CH1Config;  //红外遥控初始化
//设置IO以及TIM1_CH1的输入捕获
//TIM1挂载APB2上
void Remote_Init(void)
{  TIM1_Handler.Instance=TIM1;                          //通用定时器1TIM1_Handler.Init.Prescaler=199;                     //预分频器,1M的计数频率,1us加1.定时器1所挂总线实际上的频率应设置为200MTIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器TIM1_Handler.Init.Period=10000;                      //自动装载值TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_IC_Init(&TIM1_Handler);//初始化TIM1输入捕获参数TIM1_CH1Config.ICPolarity=TIM_ICPOLARITY_RISING;    //上升沿捕获TIM1_CH1Config.ICSelection=TIM_ICSELECTION_DIRECTTI;//映射到TI1上TIM1_CH1Config.ICPrescaler=TIM_ICPSC_DIV1;          //配置输入分频,不分频TIM1_CH1Config.ICFilter=0x03;                       //IC1F=0003 8个定时器时钟周期滤波HAL_TIM_IC_ConfigChannel(&TIM1_Handler,&TIM1_CH1Config,TIM_CHANNEL_1);//配置TIM1通道1HAL_TIM_IC_Start_IT(&TIM1_Handler,TIM_CHANNEL_1);   //开始捕获TIM1的通道1__HAL_TIM_ENABLE_IT(&TIM1_Handler,TIM_IT_UPDATE);   //使能更新中断
}//定时器1底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_IC_Init()调用
//htim:定时器1句柄
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_TIM1_CLK_ENABLE();            //使能TIM1时钟__HAL_RCC_GPIOA_CLK_ENABLE();          //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_8;            //PA8GPIO_Initure.Mode=GPIO_MODE_AF_PP;      //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;     //高速GPIO_Initure.Alternate=GPIO_AF1_TIM1;   //PA8复用为TIM1通道1HAL_GPIO_Init(GPIOA,&GPIO_Initure);HAL_NVIC_SetPriority(TIM1_CC_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);       //开启ITM1中断HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn,1,2); //设置中断优先级,抢占优先级1,子优先级2HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);       //开启ITM1中断
}//遥控器接收状态
//[7]:收到了引导码标志
//[6]:得到了一个按键的所有信息
//[5]:保留
//[4]:标记上升沿是否已经被捕获
//[3:0]:溢出计时器
u8  RmtSta=0;
u16 Dval;       //下降沿时计数器的值
u32 RmtRec=0;  //红外接收到的数据
u8  RmtCnt=0;  //按键按下的次数//定时器1更新(溢出)中断
void TIM1_UP_IRQHandler(void)
{HAL_TIM_IRQHandler(&TIM1_Handler);//定时器共用处理函数
} //定时器1输入捕获中断服务程序
void TIM1_CC_IRQHandler(void)
{   HAL_TIM_IRQHandler(&TIM1_Handler);//定时器共用处理函数
}//定时器更新(溢出)中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM1){if(RmtSta&0x80)//上次有数据被接收到了{ RmtSta&=~0X10;                     //取消上升沿已经被捕获标记if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//标记已经完成一次按键的键值信息采集if((RmtSta&0X0F)<14)RmtSta++;else{RmtSta&=~(1<<7);//清空引导标识RmtSta&=0XF0;  //清空计数器}                                }   }
}//定时器输入捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
{if(htim->Instance==TIM1){if(RDATA)//上升沿捕获{TIM_RESET_CAPTUREPOLARITY(&TIM1_Handler,TIM_CHANNEL_1);   //一定要先清除原来的设置!!TIM_SET_CAPTUREPOLARITY(&TIM1_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//CC1P=1 设置为下降沿捕获__HAL_TIM_SET_COUNTER(&TIM1_Handler,0);  //清空定时器值RmtSta|=0X10;                    //标记上升沿已经被捕获}else //下降沿捕获{Dval=HAL_TIM_ReadCapturedValue(&TIM1_Handler,TIM_CHANNEL_1);//读取CCR1也可以清CC1IF标志位TIM_RESET_CAPTUREPOLARITY(&TIM1_Handler,TIM_CHANNEL_1);   //一定要先清除原来的设置!!TIM_SET_CAPTUREPOLARITY(&TIM1_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获if(RmtSta&0X10)                    //完成一次高电平捕获{if(RmtSta&0X80)//接收到了引导码{if(Dval>300&&Dval<800)           //560为标准值,560us{RmtRec<<=1;  //左移一位.RmtRec|=0;  //接收到0}else if(Dval>1400&&Dval<1800)  //1680为标准值,1680us{RmtRec<<=1;    //左移一位.RmtRec|=1;  //接收到1}else if(Dval>2200&&Dval<2600)  //得到按键键值增加的信息 2500为标准值2.5ms{RmtCnt++;         //按键次数增加1次RmtSta&=0XF0;    //清空计时器}}else if(Dval>4200&&Dval<4700)        //4500为标准值4.5ms{RmtSta|=1<<7;    //标记成功接收到了引导码RmtCnt=0;     //清除按键次数计数器}                         }RmtSta&=~(1<<4);}                                  }
}//处理红外键盘
//返回值:
//   0,没有任何按键按下
//其他,按下的按键键值.
u8 Remote_Scan(void)
{        u8 sta=0;       u8 t1,t2;  if(RmtSta&(1<<6))//得到一个按键的所有信息了{ t1=RmtRec>>24;           //得到地址码t2=(RmtRec>>16)&0xff; //得到地址反码if((t1==(u8)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址{ t1=RmtRec>>8;t2=RmtRec;   if(t1==(u8)~t2)sta=t1;//键值正确}   if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了{RmtSta&=~(1<<6);//清除接收到有效按键标识RmtCnt=0;        //清除按键次数计数器}}  return sta;
}

remote.h

#ifndef __REMOTE_H
#define __REMOTE_H
#include "ytcesys.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK 阿波罗STM32F7开发板
//红外遥控解码驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/12/30
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved
//  #define RDATA   HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)//红外数据输入脚//红外遥控识别码(ID),每款遥控器的该值基本都不一样,但也有一样的.
//我们选用的遥控器识别码为0
#define REMOTE_ID 0                extern u8 RmtCnt;            //按键按下的次数void Remote_Init(void);     //红外传感器接收头引脚初始化
u8 Remote_Scan(void);
#endif

main.c

 Remote_Init();
 while (1){key=Remote_Scan();if(key){
//      LCD_ShowNum(86,130,key,3,16);       //显示键值
//      LCD_ShowNum(86,150,RmtCnt,3,16);    //显示按键次数switch(key){case 0:str="ERROR";break;case 162:str="POWER";break;case 98:str="UP";break;case 2:str="PLAY";break;case 226:str="ALIENTEK";break;case 194:str="RIGHT";break;case 34:str="LEFT";break;case 224:str="VOL-";break;case 168:str="DOWN";break;case 144:str="VOL+";break;case 104:str="1";break;case 152:str="2";break;case 176:str="3";break;case 48:str="4";break;case 24:str="5";break;case 122:str="6";break;case 16:str="7";break;case 56:str="8";break;case 90:str="9";break;case 66:str="0";break;case 82:str="DELETE";break;}
//          LCD_Fill(86,170,116+8*8,170+16,WHITE);    //清楚之前的显示
//          LCD_ShowString(86,170,200,16,16,str);   //显示SYMBOLLED0TOG;Uart_printf(&huart1,"%s",str);Uart_printf(&huart1,"hello");}else delay_ms(10);t++;//后面的可忽略if(t==20){t=0;LED1TOG;}

REMOTE 红外遥控模块相关推荐

  1. 小爱智能音箱红外控制继电器

    小爱智能音箱红外控制继电器 一.实物图 二.物料准备 1.小爱智能音箱万能遥控版(活动价¥99) 2.红外遥控继电器. 关于红外遥控继电器以下提供二种解决方案: 2.1简单省事版 买现成的红外遥控插排 ...

  2. micropython esp8266 红外控制小车

    目录 简述 效果 代码 简述 使用ESP8266+micropython+红外遥控模块+接收头HX1838(NEC编码)实现简单红外遥控小车. 效果 ESP8266 Micropython红外小车 代 ...

  3. 基于红外遥控的arduino遥控小车

    遥控小车是每个人童年的最爱,不仅好奇它的奇妙,更是喜欢它带来的刺激.小编为大家带来几篇博客,来给大家讲讲制作遥控小车的程序. 看大标题可知我们一共有五个方法去制作一款带有遥控功能的小车,小编分开来给大 ...

  4. 【毕业设计】基于超声波与红外的自动调速风扇系统(代码开源) -物联网 嵌入式 stm32

    文章目录 1 简介 1 设计概要 2 系统设计 2.1 系统供电问题 2.2 自动/手动模式的切换 2.3 PWM信号的产生 2.4 单片机内部资源的分配 三.硬件搭建 3.1 单片机最小系统 3.2 ...

  5. 单片机红外通信c语言,用51单片机实现红外通讯源码

    /************************************************************************************** *            ...

  6. 毕业设计 超声波红外自动调速风扇系统

    文章目录 1 简介 1 设计概要 2 系统设计 2.1 系统供电问题 2.2 自动/手动模式的切换 2.3 PWM信号的产生 2.4 单片机内部资源的分配 三.硬件搭建 3.1 单片机最小系统 3.2 ...

  7. 基于红外遥控的门禁系统(红外遥控、步进电机)

    基于红外遥控的门禁系统(红外遥控.步进电机) 闲来无事,用手头STM32做个项目. 成品功能: 功能说明 材料 STM32ZET6开发板 TFT显示屏(战舰有我用的2.7寸的) 红外接收器和遥控器 五 ...

  8. 【C51单片机学习笔记----DS18B20温度传感器LCD1602液晶屏直流电机调速与呼吸灯AD模数转换红外外部中断】

    文章目录 一.DS18B20温度传感器 1.DS18B20温度传感器连接原理图 2.DS18B20温度传感器单总线通信时序 3.DS18B20温度传感器代码模块 二.LCD1602液晶屏 1.LCD1 ...

  9. 实验十:红外遥控简单mp3播放器(2首音乐,只有旋律,播放器雏形)

    OK,今天的实验 我感觉我可以开发mp3了,哈哈 不过,我对音乐了解不多,所以都是简单的设计 功能: 1)红外遥控 2)CH-播放<生日快乐> 3)CH+播放<小星星> 4)C ...

最新文章

  1. asp.net高亮显示搜索关键字的两个方法
  2. 编写Dockerfile增强centos镜像:安装vim 和net-tools
  3. GDCM:Dicom文件重复的PCDE测试程序
  4. 自动化测试框架实践2--STAF
  5. JUnit 5扩展模型的生命周期
  6. C++(STL):05---智能指针之unique_ptr
  7. 用c语言绘制自定义图形,Android使用自定义View绘图
  8. java去除 r_Android apk瘦身最佳实践(一):去除R.class
  9. 【C语言】19-static和extern关键字1-对函数的作用
  10. 主成分分析PCA和经验正交函数分析EOF的原理(通俗易懂的解释)
  11. 用SPSS求均值 方差 标准差小例题
  12. po模型+unittest测试
  13. MySQL运行机制-从入门到京东
  14. python安装和学习-最后推荐winpython
  15. Oracle DBA技术培训
  16. 从游戏中理解Java特性,我悟了!
  17. windows7英文版,变为中文版
  18. solidworks与matlab接口,CAD软件与Matlab_SimMechanics接口问题研究
  19. 弹性云服务器的规格系列,新睿云简析云服务器的配置规格怎么选择?
  20. 头歌作业C语言数学运算练习题

热门文章

  1. TFTLCD液晶显示数码管字体(电脑数码管字体的导入和PCtoLCD软件取模)
  2. 数学建模笔记(五):简单优化模型
  3. 大学物理实验----单摆,实验数据处理。C语言代码实现
  4. 怎样设置rotacast插件_鞋类丨3D打印设计中Grasshopper的应用——用插件Pufferfish生成网格...
  5. 洋葱浏览器Tor Browser for Mac
  6. C++实现单例模式,保证线程安全
  7. 嵌入式开发板CAN通信编程——伺服电机驱动
  8. AD原理图与封装创建
  9. C语言穷举法求解:36块砖,男搬4,女搬3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?
  10. 惠普一开机就自动修复_Win10自动修复无法开机的解决方法(完美解决)