资源描述:
《STM32 红外学习程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、/红外遥控初始化//设置IO以及定时器4的输入捕获voidRemote_Init(void){GPIO_InitTypeDefGPIO_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_ICInitTypeDefTIM_ICInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTB时钟RCC_APB1PeriphCloc
2、kCmd(RCC_APB1Periph_TIM4,ENABLE);//TIM4时钟使能GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PB9输入GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//上拉输入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_9);//初始化GPIOB.9TIM_TimeBaseStr
3、ucture.TIM_Period=10000;//设定计数器自动重装值最大10ms溢出TIM_TimeBaseStructure.TIM_Prescaler=(72-1);//预分频器,1M的计数频率,1us加1.TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:TDTS=Tck_timTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式TIM_TimeBaseInit(TIM4,&TIM_Tim
4、eBaseStructure);//根据指定的参数初始化TIMxTIM_ICInitStructure.TIM_Channel=TIM_Channel_4;//选择输入端IC4映射到TI4上TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕获TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置输入分频,
5、不分频TIM_ICInitStructure.TIM_ICFilter=0x03;//IC4F=0011配置输入滤波器8个定时器时钟周期滤波TIM_ICInit(TIM4,&TIM_ICInitStructure);//初始化定时器输入捕获通道TIM_Cmd(TIM4,ENABLE);//使能定时器4NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//先占优先级0级NVIC_InitStr
6、ucture.NVIC_IRQChannelSubPriority=3;//从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_ITConfig(TIM4,TIM_IT_Update
7、TIM_IT_CC4,ENABLE);//允许更新中断,允许CC4IE捕获中断}//遥控器接收状态//[7]:收到了引导码标志//[6]:得到了一个按键的所有信息
8、//[5]:保留//[4]:标记上升沿是否已经被捕获//[3:0]:溢出计时器u8RmtSta=0;u16Dval;//下降沿时计数器的值u32RmtRec=0;//红外接收到的数据u8RmtCnt=0;//按键按下的次数//定时器2中断服务程序voidTIM4_IRQHandler(void){if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET){if(RmtSta&0x80)//上次有数据被接收到了{RmtSta&=~0X10;//取消上升沿已经被捕获标记if((RmtSta&0X0F)==0X00)RmtSt
9、a
10、=1<<6;//标记已经完成一次按键的键值信息采集if((RmtSta&0X