stm32 红外通信3 简

本文介绍了如何配置NVIC中断优先级,并详细讲解了EXTI9_5_IRQHandler函数,用于处理GPIOE引脚5的上升沿和下降沿中断,实现远程按键的识别。通过实例展示了EXTI中断配置和中断处理的基本步骤。
摘要由CSDN通过智能技术生成

bsp_exti.c

#include "bsp_exti.h"

 static void NVIC_Configuration(void)  //中断优先级函数
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 配置NVIC为优先级组1 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  //配置NVIC为优先级组1
   
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn ;  //配置中断源:
  /*EXTI0_IRQn/EXTI1_IRQn/ EXTI2_IRQn/EXTI3_IRQn/EXTI4_IRQn/EXTI9_5_IRQn/EXTI15_10_IRQn*/        
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //配置抢占优先级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;   //配置子优先级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //  使能中断通道
  NVIC_Init(&NVIC_InitStructure);                //写入结构体成员
  
}

 void remote_EXTI_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure; //GPIO结构体
	EXTI_InitTypeDef EXTI_InitStructure;  //中断结构体

 	NVIC_Configuration();  //中断优先级函数

   //初始化GPIO
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //开启GPIO口的时钟//开启按键GPIO口的时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  // 哪个引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //配置为浮空输入 
  GPIO_Init(GPIOE, &GPIO_InitStructure);  //写入结构体GPIO成员

   //初始化EXTI
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启复用GPIO口的时钟 //开启按键GPIO口的时钟
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5); //选择EXTI的信号源GPIOE,pin5

  EXTI_InitStructure.EXTI_Line = EXTI_Line5; //选择中断源,引脚哪个就选择哪个
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  //中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //上升沿和下降沿都触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;  //使能中断
  EXTI_Init(&EXTI_InitStructure);  //写入结构体中断成员

	}

remote.c

#include "remote.h"
#include "bsp_exti.h"

extern u32 count_100us;
u32	lt=0;  //记录低电平时间
u32	ht=0;  //记录低电平时间
u8	ind=0; //记录32个数据码
u8 	remotecode[32];  //数组来保存地址码,地址反码,数据码,数据反码

void	EXTI9_5_IRQHandler(void)  
{
	u8	triger;
		
	if(EXTI_GetITStatus(EXTI_Line5) != RESET) 
	{
		//清除中断标志位
		EXTI_ClearITPendingBit(EXTI_Line5); 
		triger=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_5);	//读取端口电平
		//上升沿
		if(triger==1)
		{
			lt=count_100us; //捕获上升沿时间
			count_100us=0;
		}	
		//下降沿
		else
		{
			ht=count_100us;	 //捕获下降沿时间
			count_100us=0;
			

			//=========================解码===========================//
			//判断前导码来了没有
			if(ind==0)
			{
				if((lt<100)&&(lt>80)&&(ht<50)&&(ht>40))  //判断前导码是否正确
				{
					ind++;
				}
			}
				else
			{
         if((lt<8)&&(lt>4)&&(ht<7)&&(ht>3)){remotecode[ind-1]=0;}         //如果低是600us,高是500us,表示0
         else if((lt<8)&&(lt>4)&&(ht<18)&&(ht>14)){remotecode[ind-1]=1;}  //如果低是600us,高是1600us,表示1
         else{ind=0;return;}  //否则解码失败,退出
				ind++;
				if(ind>=33)  //总共有32个高低电平
				{
					ind=0;
					if(remotecode[18]==1&&remotecode[19]==1){LED1_ON;}  //判断数据位是否正确
					else{LED1_OFF;}
				}
			}
		}
	}  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32红外模拟实验是一种使用STM32微控制器进行红外通信的实验。在这个实验中,我们可以通过红外发射器和红外接收器实现通信的传输。 在实验中,首先需要连接STM32微控制器和红外发射器。通过编写程序,将要发送的数据转换为红外信号,并将信号发送到红外发射器,红外发射器会将信号转换为红外光线进行传输。接着,我们需要连接红外接收器和STM32微控制器。红外接收器会接收到红外光线并将其转换为电信号,然后通过STM32微控制器读取并解析这些信号。 通过这个实验,我们可以实现红外遥控的功能,例如控制电视、空调等设备。我们可以编写程序,将需要发送的红外编码写入STM32微控制器,当我们按下红外遥控器上的按钮时,STM32会将红外编码转换为红外信号并发送出去,然后红外接收器会接收到信号并传递给STM32微控制器,从而实现红外遥控的功能。 在实验中,我们还可以通过调整红外发射器和红外接收器之间的距离,来测试和验证红外通信的可靠性。通常情况下,红外通信的传输距离相对较短,所以我们需要将红外发射器和红外接收器放置在较为接近的距离上。 总的来说,STM32红外模拟实验是一种通过STM32微控制器来实现红外通信的实验,通过这个实验我们可以学习和掌握红外通信的原理和应用,并将其应用到各种控制设备的遥控中。这个实验对于深入了解STM32微控制器的应用以及理解红外通信技术是非常有帮助的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值