STM32F030F4 读取红外遥控数据

一帧的数据结构 (NEC协议)

 

 数据0和数据1的表示

 

 在接收头收到的信号的相位是相反的

配置外部中断

EXTI_InitTypeDef   EXTI_InitStructure;
GPIO_InitTypeDef   GPIO_InitStructure;
NVIC_InitTypeDef   NVIC_InitStructure;
  
 void EXTI0_Config(void)
{
  /* Enable GPIOA clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  /* Configure PA0 pin as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Enable SYSCFG clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  /* Connect EXTI0 Line to PA0 pin */
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

  /* Configure EXTI0 line */
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //EXTI_Trigger_Falling;// EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  /* Enable and set EXTI0 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

获得高电平脉冲宽度时间

u8 HW_ReceiveTime(void)
{
	u8 t=0;
 
	while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)//???
	{
		t++;
		delay_us(20);//20us为单位
 
		if(t>=250) return t;//????
	}
 
	return t;
}

外部中断处理

void EXTI0_1_IRQHandler()	  
{
	 u8 time=0,startSignal=0,Data=0,Count=0;
	 unsigned long HW_ReceivedData=0;
	 
	 if(EXTI_GetITStatus(EXTI_Line0) != RESET)//?????EXTI??????????,????EXTI_Line???
      {
           	
	 		//if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))  GPIO_SetBits(GPIOA,GPIO_Pin_0);//??LED
			//else  GPIO_ResetBits(GPIOA,GPIO_Pin_0);//?
			while(1)
			{
				
					if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
					{
						 time = HW_ReceiveTime();
						
						  
						 if(time>=250)
						 {
						 	
							startSignal=0;
							HW_ReceivedData=0;
							Count=0;
							 
							break;
						 } 
						 else if(time>=200 && time<250)//引导码 4.5ms
						 {
						 	  startSignal=1;//??????
								
							  HW_ReceivedData=0;
							  Count=0;
							  continue;
						 } 
						 else if(time>=60 && time<90) //电平宽度1.5ms
						 {
							
							 Data=1;//???? 1
						 }
						 else if(time>=10 && time<50)  //电平宽度0.6ms
						 {
							 Data=0;//???? 0
						 }
//						  else
//						{
//							break;
//						
//						}
						 

						 if(startSignal==1)
						  {
							 	HW_ReceivedData<<=1;
								HW_ReceivedData+=Data;//存放data
								Count++;
								if(Count>=32)//满32位取出数
								{
//									for(i=0;i<4;i++)
//									{
//										printf("%x\n",HW_ReceivedData);
//									}
									//printf("0x%lx\n",HW_ReceivedData);
									unsigned char cha[4]= {0};
									
									cha[0] = (HW_ReceivedData & 0xFF000000)>>24;
									cha[1] = (HW_ReceivedData & 0x00FF0000)>>16;
									cha[2] = (HW_ReceivedData & 0x0000FF00)>>8;
									cha[3] = HW_ReceivedData & 0x000000FF;
									if(cha[0]==0x00&&cha[1]==0xFF)//用户码
									{
										if(cha[2]==0x90&&(cha[2]+cha[3])==0xFF)//判断反码
										{
                                               //..... 得到编码数据处理



                                        }
                                    }
                                }		
				    }							
			}
			//    /* Clear the EXTI line 0 pending bit */
		EXTI_ClearITPendingBit(EXTI_Line0);
//          	EXTI_ClearITPendingBit(EXTI_Line0);//???????
          EXTI_ClearFlag(EXTI_Line0);//??????? 
     } 
}

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值