STM32输入捕获,实现红外解码,支持长按

发布者:码上奇迹最新更新时间:2016-10-10 来源: eefocus关键字:STM32  输入捕获  红外解码 手机看文章 扫描二维码
随时随地手机看文章

初始化代码:
 
static void RCC_Configuration( void );
static void GPIO_Configuration( void );
static void NVIC_Configuration( void );
 
void InputCaptureInit( void )
{
TIM_ICInitTypeDef  TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
 
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
 
TIM_TimeBaseInitStructure.TIM_Period        = 0xffff;   // 16位计数
TIM_TimeBaseInitStructure.TIM_Prescaler     = 72*2-1;   // 144分频 2us
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;        // 不分割
TIM_TimeBaseInitStructure.TIM_CounterMode   = TIM_CounterMode_Up; // 上升计数
TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStructure );
TIM_ITConfig( TIM2, TIM_IT_Update, DISABLE );
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
 
TIM_ICInitStructure.TIM_Channel     = TIM_Channel_2; // 选择通道2
TIM_ICInitStructure.TIM_ICPolarity  = TIM_ICPolarity_Falling; // 下降沿触发
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICFilter    = 0x0;
TIM_ICInit( TIM2, &TIM_ICInitStructure );
TIM_ITConfig( TIM2, TIM_IT_CC2, DISABLE );
TIM_ClearFlag( TIM2, TIM_FLAG_CC2 );
 
TIM_Cmd( TIM2, ENABLE );
TIM_ITConfig( TIM2, TIM_IT_CC2 | TIM_IT_Update, ENABLE );
}
 
// 使能TIM2和GPIOA的时钟
static void RCC_Configuration( void )
{
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
}
 
// 设置PA1
static void GPIO_Configuration( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
 
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
 
// 设置NVIC
 
static void NVIC_Configuration( void )
{
NVIC_InitTypeDef NVIC_InitStructure;
 
/* Enable the TIM2 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel       = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority       = 10;
NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
 
解码部分:遥控的键值存放在IR_Key变量中
extern volatile INT32U IR_Key;
void TIM2_IRQHandler( void )
{
static INT16U IR_LastPluse = 0;
static INT8U IR_Sta = 0;
static INT32U IR_Code = 0;
static INT8U IR_PluseCnt = 0;
static INT8U IR_Up = 0;
INT16U IR_ThisPluse;
INT16U IR_PluseSub;


if ( TIM_GetITStatus( TIM2, TIM_IT_CC2 ) == SET )
{
TIM_ClearFlag( TIM2, TIM_IT_CC2 );
IR_Up = 0;
IR_ThisPluse = TIM_GetCapture2( TIM2 );

if ( IR_ThisPluse > IR_LastPluse )
{
IR_PluseSub = IR_ThisPluse - IR_LastPluse;
}
else {
IR_PluseSub = 0xffff - IR_LastPluse + IR_ThisPluse;
}

IR_LastPluse = IR_ThisPluse;
IR_PluseCnt++;

if ( IR_PluseCnt == 2 )
{
if (( IR_PluseSub > 5000 ) && ( IR_PluseSub < 8000 ))
{
IR_Sta = 0x01;
}
}
else if ( IR_Sta & 0x01 ) // 如果引导成功,开始接码
{
if (( IR_PluseSub < 450 ) || ( IR_PluseSub > 1300 ))
{
IR_Sta = 0;
IR_PluseCnt = 0;
IR_Code = 0;
}
else
{
IR_Code <<= 1;
if (( IR_PluseSub > 900 ) && ( IR_PluseSub < 1300 ))
{
IR_Code |= 0x01;
}
if ( IR_PluseCnt == 34 )
{
IR_Key = IR_Code;
IR_Sta = 0x02;
printf( "IR Down is : 0x%8x\n\n", IR_Key );
}
}
}
else if ( IR_Sta & 0x02 )
{
switch ( IR_PluseCnt )
{
case 35:
{
if ( ( IR_PluseSub < 4500 ) || ( IR_PluseSub > 7000 ) )
{
IR_PluseCnt--;
}
break;
}
case 36:
{
IR_PluseCnt = 34;
if ( ( IR_PluseSub > 45000) && ( IR_PluseSub < 60000 ) )
{
IR_Key = IR_Code;
printf( "IR continue is : 0x%8x\n\n", IR_Key );
}
break;
}
}
}
}

if ( TIM_GetITStatus( TIM2, TIM_IT_Update ) == SET )
{
TIM_ClearFlag( TIM2, TIM_IT_Update );
if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_1 ) == SET )
{
IR_Up++;
if ( IR_Up >= 2 )
{
IR_Code = 0;
IR_Sta = 0;
IR_PluseCnt = 0;
}
}
}
}
关键字:STM32  输入捕获  红外解码 引用地址:STM32输入捕获,实现红外解码,支持长按

上一篇:关于STM32的ADC/DAC问题集锦
下一篇:STM32 RCC实验MCO脚输出时钟波形

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

基于DSP和STM32的电液伺服控制器设计
引言 伺服控制系统大部分都采用传统的硬件结构,控制算法比较固定,而且也无法实现不同工况下的高性能控制算法,难以满足现代工业的需求。现阶段迫切需要研制一种智能型、具有高可靠性、控制性能更加优秀的电液伺服系统。基于DSP与STM32的智能型伺服控制器具有软硬件结合程度更加紧密、系统的智能化程度更高、可实现多种控制策略的优势。本系统从实际的需求出发,结合精确数字PID控制算法和Fuzzy控制算法自身的优势,组合成Fuzzy—PID控制算法,根据偏差的大小范围选择合适的控制算法进行调节。 本设计将两款工控芯片——TI公司的浮点型DSPTMS320F28335和ST公司的ARM7升级版STM32F103RET6引入智能电液伺服系统,设计
[单片机]
基于DSP和<font color='red'>STM32</font>的电液伺服控制器设计
STM32菜鸟成长记录---系统滴答定时器(systick)应用
1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。滴答中断?这里来简单地解释一下。操作系统进行运转的时候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。只要不把它在S
[单片机]
<font color='red'>STM32</font>菜鸟成长记录---系统滴答定时器(systick)应用
关于STM32串口首字符出现乱码的问题
出现的问题:在使用sscom32串口调试助手,首字符出现乱码“tarttarttarttarttarttart” 原因:波特率过高 解决办法:将波特率设置的低一点,通常9600即可 现象:乱码为波特率较高; 正常显示波特率较低 函数代码如下: int main(void) { USART1_Init(); printf( Start ); } #include usart1.h void USART1_Init(void) { USART1_GPIO_Config(); USART1_Structure_Config(); USART_Cmd(USART1, ENABLE); }
[单片机]
关于<font color='red'>STM32</font>串口首字符出现乱码的问题
STM32定时器之定时时间
STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。 时钟源问题: 名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在 APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作
[单片机]
STM32 + GCC + J-Link :开源的力量
发现Keil自带的编译器有时候优化有问题,跑得跟没优化时完全不一样。以前使用GCC,现在自然而然想再次使用GCC。 搭配1:Keil+GCC+Ulink2 这类的介绍也较多,主要是一个链接脚本、启动代码、IDE选项配置的问题,大家可以google一下,个人觉得搭配一般般。 搭配2:emIDE+JLink 纯粹的Opensource血统,这个EMIDE已经带了GCC,只需要一个JLink,然后构建好工程就可以debug了,如果发展迅猛,估计Keil也会扛不住了。
[单片机]
Stm32的Flash模拟EEPROM与BOOT基本了解
闪存模块存储器组织 按照不同容量,存储器组织成32个1K字节/页(小容量),128个1K字节/页(中容量),256个2K字节/页(大容量)的主存储器和一些信息块等 下面这张图是大容量产品的Flash内部图: 主要分为三个部分:主存储器、信息块和闪存存储器接口寄存器; 主存储器:也就是我们常说的储存量的大小,比如:stm32ZET6的flash有512K,说的就是这块的容量;该部分用来存放代码和数据常数(如const类型的数据)。对于大容量产品,其被划分为256页,每页2K字节。注意,小容量和中容量产品则每页只有1K字节。从上图可以看出主存储器的起始地址就是0X08000000;起始地址时说的是stm32通用地址空间的绝对地
[单片机]
<font color='red'>Stm32</font>的Flash模拟EEPROM与BOOT基本了解
STM32使用PWM控制LED呼吸灯效果
实验的STM32型号: STM32F103C8T6 48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2_CH4 *TIMER使用默认的TIM2_CH4 *PWM的控制使用了动态的占空比来达到呼吸效果 下面给出代码: #include stm32f10x.h void RCC_cfg(void); void GPIO_cfg(void); void TIMER_cfg(void); void PWM_cfg(void); int led_fx=1; int led_dt=0;
[单片机]
STM32 HAL固件库编程的文件构架
  对于我这种以前只接触过51和AVR单片机编程的小菜来说,现在开始学习STM32的编程,对于函数的功能以及C语言的语法都还好理解,难的是它提供的那一套硬件抽象层(HAL)驱动是怎么和其他的东东搭配在一起组成一个又一个的工程。   首先上两张从ST官方提供的HAL固件库文档截图 从这两张图的话,能对它的构架看出个一二,下面稍稍具体一点分析   HAL固件库编程,它的文件组织大致分三个部分     - HAL驱动     - CMSIS驱动     - 用户编写程序 而假如你使用的是ST官网的开发板,那么你还有一套现成的驱动可供使用,板级支持包(BSP),那么正好向我一样,但是,我不太喜欢使用这个东西,能自己写还是自己写的好。
[单片机]
<font color='red'>STM32</font> HAL固件库编程的文件构架
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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