项目场景:
最近在使用Stm32F103野火指南针开发板开发红外遥控外设得时候,用得是野火得开发板,本来发现应该很简单的事情,官方也很贴切的提供了官方例程。但是居然有问题,无法正常使用。
于是这篇文章应运而生,以下是个人心得,希望对大家有所帮助。
问题描述
我确定自己下载的也没问题的情况下,居然无法使用,这让我又百思不得其解,左右翻看电子原理图引脚无问题,再看程序左右查询发现无问题,这让我怀疑是不是硬件问题。
首先我用手机摄像头查看自己的遥控器是不是有问题,遥控器闪烁可以正常发送红外信号。
单片机方面因为无有示波器,所以只能只用万用表,查看每次红外信号是否有电压变化,查看是有电压变化,0.3V左右,明显硬件无问题,很有可能就是程序问题,但是官方例程怎么会有问题呢!这让我百思不得其解!最后我还是相信自己,仔细去查看每个部分。
官方例程下载链接:
野火【红外遥控_1838】模块 — 野火产品资料下载中心 文档 (embedfire.com)
解决方案:
左右对比程序,无任何问题,那就开始查询电路问题,翻看原理图。
PE5端脚 与 程序定义无冲突。
这就很让人奇怪了,这时候我拿出了万用表将板载的PE5和红外的PE5是否互相连通,这时候发现居然没有互相连通,明显电路图的引脚就有问题了,于是挨个测引脚,最后发现红外接口与板载的PD12互相连通,于是修改程序中的引脚配置,完美解决问题。
官方下载链接,大家需要自行下载:
野火STM32F103指南者开发板 — 野火产品资料下载中心 文档 (embedfire.com)
实物连接图:
修改程序如下(大家可以自己下载官方程序进行对比):
bsp_irda.c
/**
******************************************************************************
* @file bsp_irda.c
* @author fire
* @version V1.0
* @date 2013-xx-xx
* @brief 红外遥控器接口
******************************************************************************
* @attention
*
* 实验平台:野火 F103-指南者 STM32 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :https://fire-stm32.taobao.com
*
******************************************************************************
*/
#include "stdio.h"
#include "./IrDa/bsp_irda.h"
#include "./systick/bsp_SysTick.h"
#include "./led/bsp_led.h"
uint32_t frame_data=0; /* 一帧数据缓存 */
uint8_t frame_cnt=0;
uint8_t frame_flag=0; /* 一帧数据接收完成标志 */
/**
* @brief 配置嵌套向量中断控制器NVIC
* @param 无
* @retval 无
*/
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置P[A|B|C|D|E]11为中断源 */
NVIC_InitStructure.NVIC_IRQChannel = IRDA_EXTI_IRQN;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/* 初始化红外接收头1838用到的IO */
void IrDa_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* config the extiline clock and AFIO clock */
RCC_APB2PeriphClockCmd(IRDA_GPIO_CLK | RCC_APB2Periph_AFIO,ENABLE);
/* config the NVIC */
NVIC_Configuration();
/* EXTI line gpio config */
GPIO_InitStructure.GPIO_Pin = IRDA_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(IRDA_GPIO_PORT, &GPIO_InitStructure);
/* EXTI line mode config */
GPIO_EXTILineConfig(IRDA_GPIO_PORT_SOURCE, IRDA_GPIO_PIN_SOURCE);
EXTI_InitStructure.EXTI_Line = IRDA_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/* 获取高电平的时间 */
uint8_t Get_Pulse_Time(void)
{
uint8_t time = 0;
while( IrDa_DATA_IN() )
{
time ++;
Delay_us(2); // 延时 20us
if(time == 250)
return time; // 超时溢出
}
return time;
}
/*
* 帧数据有4个字节,第一个字节是遥控的ID,第二个字节是第一个字节的反码
* 第三个数据是遥控的真正的键值,第四个字节是第三个字节的反码
*/
uint8_t IrDa_Process(void)
{
uint8_t first_byte, sec_byte, tir_byte, fou_byte;
first_byte = frame_data >> 24;
sec_byte = (frame_data>>16) & 0xff;
tir_byte = frame_data >> 8;
fou_byte = frame_data;
/* 记得清标志位 */
frame_flag = 0;
if( (first_byte==(uint8_t)~sec_byte) && (first_byte==IRDA_ID) )
{
if( tir_byte == (u8)~fou_byte )
return tir_byte;
}
return 0; /* 错误返回 */
}
/*********************************************END OF FILE**********************/
bsp_irda.h
#ifndef __IRDA_H
#define __IRDA_H
#include "stm32f10x.h"
void EXTI_PB11_Config(void);
void IrDa_Init(void);
uint8_t Get_Pulse_Time(void);
uint8_t IrDa_Process(void);
extern uint8_t frame_flag; /* 一帧数据接收完成标志 */
#define IRDA_ID 0
//红外遥控使用的GPIO及时钟
#define IRDA_GPIO_PORT GPIOD
#define IRDA_GPIO_CLK RCC_APB2Periph_GPIOD
#define IRDA_GPIO_PIN GPIO_Pin_12
#define IRDA_GPIO_PORT_SOURCE GPIO_PortSourceGPIOD
#define IRDA_GPIO_PIN_SOURCE GPIO_PinSource12
//中断相关
#define IRDA_EXTI_LINE EXTI_Line12
#define IRDA_EXTI_IRQN EXTI15_10_IRQn
#define IRDA_EXTI_IRQHANDLER_FUN EXTI15_10_IRQHandler
//读取引脚的电平
#define IrDa_DATA_IN() GPIO_ReadInputDataBit(IRDA_GPIO_PORT,IRDA_GPIO_PIN)
#endif /* __IRDA_H */
项目链接:https://pan.baidu.com/s/1M_RLo5Q43f050p0Lkf1xTQ
总结
此处特此声明,没有任何黑野火官方的想法,实事求是我遇到的问题和板子的问题,不黑不吹,实际体验感受,希望大家不要在知识的海洋迷路。
有问题可直接私信,如要打赏一块钱即可。