5.STM32_红外接收解码(外部中断)

STM32_红外接收解码(外部中断)

1.硬件

硬件:Nucleo-F103RBTx、红外接收管
注意事项:市面上红外接收管型号很多,引脚排序方式也不同,需注意引脚的排列方式,硬件不要接错了。
5.STM32_红外接收解码(外部中断)
硬件连接:红外接收管与Nucleo-f103开发板用杜邦线按照下表进行连接
5.STM32_红外接收解码(外部中断)

2.软件

CubeMX配置
PA8配置为外部中断模式,上/下沿方式触发,配置上拉电阻,使能中断,默认优先级。
5.STM32_红外接收解码(外部中断)
5.STM32_红外接收解码(外部中断)
5.STM32_红外接收解码(外部中断)
代码编写
根据正点原子库函数改写。

(1).hw.h

#ifndef _HW_H
#define _HW_H

#include "main.h"

//定义全局变量
extern uint32_t hw_code;
extern uint8_t  hw_flag;

void delay_us(uint32_t us);
uint8_t HW_time(void);

#endif

(2).hw.c

#include "hw.h"

uint32_t hw_code;	  //定义一个32位数据变量,保存接收码
uint8_t  hw_flag;  //定义一个8位数据的变量,用于指示接收标志


//微秒级延时函数,系统时钟频率位64MHz
void delay_us(uint32_t us)
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 6000000 * us);
    while (delay--)
	{
		;
	}
}

//判断是否接收到有效红外信号(高电平持续时间,将记录的时间保存在t中返回,其中一次大约20us)
uint8_t HW_time()
{
	uint8_t t=0;
	while(HAL_GPIO_ReadPin(HW1_GPIO_Port,HW1_Pin)==1)//高电平
	{
		t++;
		delay_us(20);
		if(t>=250) 
			return t;//超时溢出
	}
	return t;
}

//红外遥控外部中断服务函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	uint8_t Tim=0,Ok=0,Data,Num=0;
   while(1)
   {
	   	if(HAL_GPIO_ReadPin(HW1_GPIO_Port,HW1_Pin)==1)
			{
			  Tim=HW_time();//获得此次高电平时间
				
			  if(Tim>=250) 
					break;//不是有用的信号
				
			  if(Tim>=200 && Tim<250)
			  {
			 	  Ok=1;//收到起始信号
			  }
			  else if(Tim>=60 && Tim<90)
			  {
			 	  Data=1;//收到数据 1
			  }
			  else if(Tim>=10 && Tim<50)
			  {
			  	Data=0;//收到数据 0
			  }
				else
					break;

			  if(Ok==1)
			  {
			 	  hw_code<<=1;
				  hw_code+=Data;

				  if(Num>=32)
				  {
					  hw_flag=1;
				  	break;
				  }
			  }
			  Num++;
			}
   }
}

(3).main.c

while (1)
  {
  /* USER CODE BEGIN 3 */
		if(hw_flag==1)	 //如果红外接收到有效信号
		{
			hw_flag=0;	   //清除接收标志
			printf("红外接收码 %0.8X\r\n",hw_code);	//打印
			hw_code=0;		 //接收码清零
		}		
		HAL_Delay(10);
  }
  /* USER CODE END 3 */

如何实现串口发送功能此处省略。

3.操作

5.STM32_红外接收解码(外部中断)
连接串口助手,红外遥控器对着红外接收管任意按键,当检测到有信号输入,单片机对信号解码并串口打印出来。

上一篇:I420(YUV420)格式转RGB24


下一篇:外设驱动库开发笔记25:FM25xxx FRAM存储器驱动