STM32_红外接收解码(外部中断)
1.硬件
硬件:Nucleo-F103RBTx、红外接收管
注意事项:市面上红外接收管型号很多,引脚排序方式也不同,需注意引脚的排列方式,硬件不要接错了。
硬件连接:红外接收管与Nucleo-f103开发板用杜邦线按照下表进行连接
2.软件
CubeMX配置:
PA8配置为外部中断模式,上/下沿方式触发,配置上拉电阻,使能中断,默认优先级。
代码编写:
根据正点原子库函数改写。
(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.操作
连接串口助手,红外遥控器对着红外接收管任意按键,当检测到有信号输入,单片机对信号解码并串口打印出来。