STM32学习笔记之—红外通信

STM32学习笔记之—红外通信132

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

##


概述

首先大家不要觉得红外通信很难,知道原理的话其实也就那么回事儿,而本文讲解的重点不是原理性的内容(原理性的这类比较底层的知识往往比较复杂,交个那些大佬慢慢研究吧),本文主要是教大家如何使用红外通信,希望大家看了本教程之后能够进行简单的红外通信,做做简单的DIY。_


##


简单的原理

红外通信是一线式通信,也就是只需要一根线就能够通讯,GND接地,VDD接电源,最后一个根接芯片的IO口。具体的使用接线过程图如下图所示:

STM32学习笔记之—红外通信

####你需要知道的是:

  • 红外信息是由不同的红外高低电平脉冲组合而成的

  • 当红外接收头捕获到红外信号后,通讯线会表现为不同的高低电平

  • 芯片的一个IO管脚连接到这根通讯线,通过查询的方式读出这根线上面的高低电平信息

  • 芯片按照根据统一的通讯协议将接收到的高低信号转化为键值(一串数字)

  • 不同的信号具有不同的键值,根据不同的键值就能够区分不同的红外信息

(这只是简单的工作原理,不懂也没关系,不影响后面的编程)


##


程序讲解

程序知道原理之后是比较容易理解的,我将从三个部分讲解主要的代码

###配置阶段
代码

void hwjs_init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	/* 开启GPIO时钟及管脚复用时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;											//---红外接收配置的管脚为PA15这个管脚,具体可以根据自己需要进行配置
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	/* 设置外部中断的模式 */ 
	EXTI_ClearITPendingBit(EXTI_Line15);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);	//选择GPIO管脚用作外部中断线路
	EXTI_InitStructure.EXTI_Line=EXTI_Line15;
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_InitStructure); 
	/* 设置NVIC参数 */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;			//打开EXTI15的全局中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//抢占优先级为0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;				//响应优先级为1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;						//使能
	NVIC_Init(&NVIC_InitStructure);
}

Jetbrains全家桶1年46,售后保障稳定

代码说明

以上是配置过程的代码部分,将A15配置为输入模式,同时打开中断
配置好后中断函数为EXTI15_10_IRQHandler()


###中断函数

代码

void EXTI15_10_IRQHandler(void)	  //红外遥控外部中断
{
	u8 Tim=0,Ok=0,Data,Num=0;
   while(1)
   {
	  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)==1)
		{
			 Tim=HW_jssj();//获得此次高电平时间
			 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
			 }
			 if(Ok==1)
			 {
					hw_jsm<<=1;
					hw_jsm+=Data;

				if(Num>=32)
				{
					hw_jsbz=1;
				  break;
				}
			 }
			 Num++;
		}
   }
   EXTI_ClearITPendingBit(EXTI_Line15);	
}

代码说明

  • HW_jssj()为获得高电平持续时间的函数(具体代码见附录)
  • 当收到信号后,通过不停地查询判断将接收到的信号解析到”hw_jsm”里面同时将标志位”hw_jsbz”置”1″
  • hw_jsbz”置”1″表示成功解析到一个完整地红外信号

###主函数

代码

int main()
{	
  hwjs_init();										//红外接口初始化
	while(1)
	{
		if(hw_jsbz==1)								//如果红外接收到数据了
		{
			if(hw_jsm==0x00FFA25D)			//---当接收到0x00FFA25D这个键值的红外信号时
			{
				/*程序1*/	
			}
			else if(hw_jsm==0x00FF30CF)	//---当接收到0x00FF30CF这个键值的红外信号时
			{
				/*程序2*/
			}	
			hw_jsbz=0;									//清零
			hw_jsm=0;										//接收码清零(存放红外编码数据的地方)
		}			
	}			
}

代码说明

  • 进行初始化操作
  • 当接收到红外信号后就判断红外信号的键值。
  • 根据键值选择去执行哪一段程序。
  • 执行完之后就继续等待。

##


你可能会遇到的问题以及建议解决方法

附录的程序不能够运行?

本程序是Keil4的代码,检查Keil是否激活成功教程,路径是否含有中文字符等。

代码不能够下载到芯片里面?

本程序使用的芯片是STM32F103C8T6,打开配置串口(“Option for Target’Target1’“或者按快捷键”Alt+F7”)
选择正确的芯片类型
选择正确的烧录工具
选正确的Flash的大小
检查烧录的连线以及供电(一般不会出现这个问题)


如果大家还有什么疑问或者我讲的有什么不对的地方欢迎在评论区留言,一起交流讨论_

附录:

源代码链接:https://pan.baidu.com/s/1jwkEQHB1-QH2mOf3xwYj4A 密码:yh0n

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219970.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • shell 文件 数字比较

    shell 文件 数字比较

    2022年3月11日
    37
  • html页面缩小导航栏隐藏,html – 导航栏缩放问题[通俗易懂]

    html页面缩小导航栏隐藏,html – 导航栏缩放问题[通俗易懂]我有一个问题,我的导航栏似乎与CSS中的.container缩放.现在,我是一个新手,但我已经尝试搞乱CSS中的值,但无济于事.这是HTML和CSS的代码:*{margin:0px;padding:0px;}body{font-family:verdana;background-image:url(images/bg2.jpg);max-width:100%;max-height:…

    2022年5月28日
    68
  • docker开放2375端口,并添加安全传输层协议(TLS)和CA认证

    docker开放2375端口,并添加安全传输层协议(TLS)和CA认证为了更便捷地打包和部署,服务器需要开放2375端口才能连接docker,但如果开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵、挖矿、CPU飙升这些情况都有发生,任何知道你IP的人,都可以管理这台主机上的容器和镜像,真的可怕。为了解决安全问题,只要使用安全传输层协议(TLS)进行传输并使用CA认证即可。制作证书及秘钥我们需要使用OpenSSL制作CA机构证书、服务端证书和客户端证书,以下操作均在安装Docker的Linux服务器上进行。创建一个目录用于存储生成的证书和秘钥mkdir

    2022年6月3日
    177
  • linux环境变量的配置_centos设置环境变量

    linux环境变量的配置_centos设置环境变量前言在自定义安装软件的时候,经常需要配置环境变量,下面进行详细解析&nbsp;环境变量配置文件|用户|配置文件||:|:||系统环境|/ect/profil

    2022年7月31日
    15
  • origin作图图例老是消失_origin画的图不见了

    origin作图图例老是消失_origin画的图不见了记录origin画图遇到的问题及其软件bug解决画图问题如何快速绘制框架画图问题如何快速绘制框架本例子以origin2021版本问题的提出:导入数据之后没有上框和右框(如图)目的:入Excel数据之后直接有上框和右框(也就是能不能设置这么一个模板),如图:解决方法方法一点击图片,找到我红色框的地方,点击即可(据说这种方法在2020版本及其以上即可支持)效果图:方法二:点击查看–显示–框架效果图:PS:美中不足的是,该方法不可以撤销…

    2022年9月21日
    2
  • 几个不知道算不算经典的游戏

    几个不知道算不算经典的游戏=600)window.open(http://www.gamestop.com/common/images/lbox/645357b.jpg);”src=”http://www.gamestop.com/common/images/lbox/645357b.jpg”onload=”if(this.width>600)this.width=600;”twffan=”done”

    2022年6月5日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号