OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9077|回复: 5

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

[复制链接]

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2012-5-14 10:20:30 | 显示全部楼层 |阅读模式
原子哥的板,实测可以超过10米的接收范围,其它的不说了,直接上程序:

硬件初始化部分


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;
}
}
}












正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-14 10:46:23 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2011-11-21
在线时间
0 小时
发表于 2012-5-14 13:04:44 | 显示全部楼层
好么,顶一个!
回复 支持 反对

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2012-8-11
在线时间
32 小时
发表于 2012-11-14 21:36:05 | 显示全部楼层
来学习的
回复 支持 反对

使用道具 举报

24

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2012-8-29
在线时间
3 小时
发表于 2012-11-15 16:10:35 | 显示全部楼层
不错。谢谢分享!
我白天是个程序员,晚上就是个有抱负的演员。住在天朝的魔都,有条同名的狗......
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2018-12-12
在线时间
1 小时
发表于 2018-12-12 09:22:07 | 显示全部楼层
谢谢!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 13:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表