32OLED中断系统&对射式红外计数&旋转编码计数

一.程序调试方式

二.OLED简介

stm32引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下引脚不会输出电平

三. 中断系统

 

EXTI外部中断,TIM定时器,ADC模数转换器,USART串口,SPI通信,I2C通信,RTC实时时钟 

灰色部分是内核里面的中断

NVIC是用于统一分配中断优先及和管理中断的,一个外设可能会占用多个外设通道

NVIC通过每个中断的优先级,分配中断,之后通过右边的一个输出口告诉CPU该处理哪一个中断

值越小,优先级越高

抢占优先级,有一个病人还在看病,而需要紧急的看病的病人直接让其靠边站,等到自己看完病再让旁边等的人看

响应优先级,需要紧急的看病的病人等到,目前正在看的那一个病人看完后再插队去看

EXTI

双边沿就是上升沿和下降沿都可以触发中断,软件触发就是通过一句程序代码触发中断

相同的Pin 不能同时触发,例 PA1,PB1,PC1.........不能同时用

一共支持16引脚中断+4个“蹭网”的

中断响应后信号会传输到CPU

事件响应(不会触发中断)则是触发其他外设的操作,比如触发ADC转换,触发DMA........,属于外设间的联合工作

内核里面的外设都是不需要开启时钟的

四.代码实现

(1)对射式红外计数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
uint16_t Count;
void CountSensor_Init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStructure;//局部变量不要放在可执行语句之后
	EXTI_InitTypeDef EXTI_InitStructure;//声明可能不会出现在块中的可执行语句之后
	NVIC_InitTypeDef NVIC_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能RCC
 	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);

	/*AFIO选择中断引脚*/
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
	
	EXTI_InitStructure.EXTI_Line=EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//指定外部中断线为下降沿触发
	EXTI_Init(&EXTI_InitStructure);
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC为分组2
												//即抢占优先级范围:0~3,响应优先级范围:0~3
												//此分组配置在整个工程中仅需调用一次
												//若有多个中断,可以把此代码放在main函数内,while循环之前
												//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	/*NVIC配置*/
	NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
}
uint16_t get(void)
{
	return Count;
}
/**
  * 函    数:EXTI15_10外部中断函数
  * 参    数:无
  * 返 回 值:无
  * 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
  *           函数名为预留的指定名称,可以从启动文件复制
  *           请确保函数名正确,不能有任何差异,否则中断函数将不能进入
  */
void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line14)==SET)
	{
        /*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
		{
			Count++;
		}
//		Count++;
		EXTI_ClearITPendingBit(EXTI_Line14);//清除外部中断14号线的中断标志位
											//中断标志位必须清除
											//否则中断将连续不断地触发,导致主程序卡死在中断
	}
	
}

中断函数的二层if判断是在中断标志位置1后,判断PB14是否输出0,如果输出为0,那么电源灯亮,此时挡光片移开,count++; 

 (2)旋转编码计数

Encoser.c

#include "stm32f10x.h"                  // Device header
int16_t count;
void Encoder_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
 	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);


	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);

	
	EXTI_InitStructure.EXTI_Line=EXTI_Line0 | EXTI_Line1;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_InitStructure);
	
	

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
												
	NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&NVIC_InitStructure);
	
}
int16_t Get(void)
{
	int16_t Temp;
	Temp = count;
	count = 0;
	return Temp;
	
}
void EXTI0_IRQHandler(void)//正转+1
{
	if(EXTI_GetITStatus(EXTI_Line0)==SET)
	{
		
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
		{
			
			count++;
		}
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
	
	
}
void EXTI1_IRQHandler(void)//反转-1
{
	if(EXTI_GetITStatus(EXTI_Line1)==SET)
	{
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)
		{
			count--;
		}
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
	
}
//我的编码器的A和B与视频教程是相反的!!!

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Encoder.h" 
int16_t NUM;
int main(void)
{
	OLED_Init();
	Encoder_Init();
	OLED_ShowString(1,1,"Num:");
	while(1)
	{
		NUM+=Get();
		OLED_ShowSignedNum(1,5,NUM,3);

		
	}	
}

注:

在中断函数里面,最好不要执行耗时过长的代码;

最好不要在中断函数和主函数调用相同的函数或操作同一个硬件(如果即在主函数调用OLED,又在中断里调用OLED ,会造成主函数内容显示出现问题)

对于外部硬件,并没有在进入中断时,进行现场保护

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/357747.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot3】集成Knife4j、springdoc-openapi作为接口文档

一、什么是springdoc-openapi Springdoc-openapi 是一个用于生成 OpenAPI(之前称为 Swagger)文档的库,专为 Spring Boot 应用程序设计。它可以根据你的 Spring MVC 控制器、REST 控制器和其他 Spring Bean 自动生成 OpenAPI 文档&#xff0c…

Google Chrome 中出现 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误

证书的方式发生了变化,出现了这个新错误,导致我无法浏览该网站。 可以右键属性获取位置 关闭导航器chrome并转到文件夹,找到Local State文件并删除 执行指令结束进程,重新打开浏览器即可 taskkill /im "chrome.exe"…

Unity3d实现简单的战斗

使用u3d实现一个简单的战斗demo,记下学到的知识点,以备后查。 1.判断是否点中指定物体 if (Input.GetMouseButton(0)) {Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out RaycastHit hit)){//坐标转换Vector…

PeakCAN连接到WSL2 Debian

操作步骤 按照以下步骤进行操作: 在Windows下安装PeakCAN驱动并安装,地址是https://www.peak-system.com/PCAN-USB.199.0.html?&L1 在Windows下安装usbipd,地址是https://github.com/dorssel/usbipd-win/releases,最新版是…

我们是如何测试人工智能的(六)推荐系统拆解

推荐系统简介 推荐系统的问题 根据之前学习到的内容,我们已经基本了解到了要如何构建一个二分类模型。我们都知道模型大体可以分成,回归,二分类和多分类。但推荐系统是属于哪一种场景呢,比如我们常见的广告推荐或者内容推荐&…

线性代数---------学习总结

线性代数之行列式 行列式的几条重要的性质 1.某两行某两列交换位置之后,值变号 2.行列式转置,值不变 3.范德蒙德行列式,用不同行的公比做一系列的累乘运算 4.把某一行的行列式加到另一行上,利用他们之间的倍数关系&#xff0…

最小二乘圆柱拟合(高斯牛顿法)

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 本期话题:最小二乘圆柱拟合 相关背景资料 点击前往 圆柱拟合输入和输出要求 输入 8到50个点,全部采样自圆柱上。每个点3个坐标,坐…

云计算底层技术奥秘、磁盘技术揭秘、虚拟化管理、公有云概述

云计算基础 实验图例 虚拟化平台安装 创建虚拟机 1、创建虚拟机 2cpu,4G内存(默认用户名: root 密码: a) 2、验证 ecs 是否支持虚拟化 [rootecs ~]# grep -Po "vmx|svm" /proc/cpuinfovmx... ...[rootecs ~]# lsmod |grep kvm…

Android 13以上版本读写SD卡权限适配

如题&#xff0c;最近工作上处理的问题&#xff0c;把解决方案简单逻列出来&#xff0c;供有需要的朋友参考之 解决方案&#xff1a; 1、配置权限 <uses-permission android:name"android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name&q…

Security ❀ HTTP/HTTPS逐包解析交互过程细节

文章目录 1. TCP三次握手机制2. HTTP Request 请求报文3. HTTP Response 响应报文4. SSL/TLS协议4.1. ClientHello 客户端Hello报文4.2 ServerHello 服务器Hello报文4.3. *ServerKeyExchange 服务公钥交换4.4. ClientKeyExchange 客户端公钥交换4.5. *CertificateVerify 证书验…

Mysql 更新数据

MySQL中使用UPDATE语句更新表中的记录&#xff0c;可以更新特定的行或者同时更新所有的行。基本语法结构如下&#xff1a; UPDATE table_name SET column_name1 value1,column_name2 value2,……, column_namen valuen WHERE(condition); column_name1,column_name2,……,…

Oracle数据库如何对中文的一二三四五六七八九十数进行正序排列排序

引言 在处理包含中文数字的数据库查询时&#xff0c;我们可能会遇到一个看似简单实则充满挑战的问题——如何让Oracle数据库按照阿拉伯数字顺序&#xff08;1, 2, 3, 4, 5, 6…&#xff09;对诸如“一、二、三、四、五、六…”这样的中文数字进行排序。这不仅是一个技术性问题&…

长度最小的子数组[中等]

一、题目 给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的连续子数组[numsl, numsl1, ..., numsr-1, numsr]&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回0。 示例 1&#xff1a; 输入&#xff…

数据结构奇妙旅程之七大排序

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

如何做好阅读笔记搭建个人知识体系?

一、阅读笔记的重要性 阅读笔记在个人知识管理中扮演着重要的角色。通过记录、整理和利用阅读笔记&#xff0c;可以帮助我们更好地梳理个人知识体系&#xff0c;提高阅读效率&#xff0c;并且能够为个人成长提供有力支持。阅读笔记的重要性不言而喻&#xff0c;它是我们通过阅…

芯片替代查询指南:如何在电子设计中选择最佳替代方案

在电子制造与维修的世界里&#xff0c;芯片的选择和替代是一个常见且复杂的过程。选择正确的芯片替代对于确保电路的正常工作以及产品的性能不可或缺。本篇文章将为您提供关于芯片替代查询网站的全面指南。 什么是芯片替代查询&#xff1f; 芯片替代查询是提供芯片替代选项查…

时序数据库 Tdengine 执行命令能够查看执行的sql语句

curl是 访问6041端口&#xff0c;在windows系统里没有linux里的curl命令&#xff0c;需要用别的工具实现。我在cmd里是访问6030端口 第一步 在安装是时序数据库的服务器上也就是数据库服务端 进入命令窗口 执行 taos 第二步 执行 show queries\G;

OpenAI发布新模型!ChatGPT性能重磅提升,API大幅降价,GPT-4 「变懒」被修复

OpenAI 对ChatGPT进行了大更新&#xff1a;推出了新一代的嵌入模型&#xff0c;对GPT-4 Turbo模型进行了更新&#xff0c;并将很快对GPT-3.5 Turbo的API进行大幅降价&#xff0c;GPT-4「变懒」行为也被修复。 接下来二狗就带大家看看ChatGPT的这次详细更新。 推出新的嵌入模型…

PyQt5零基础入门(七)——文本编辑框

单行文本框控件(QLineEdit) QLineEdit是一个小部件&#xff0c;通常用于创建用户界面中的文本输入框。它提供了简单而强大的文本编辑功能&#xff0c;适用于各种需要单行文本输入的应用程序。 from PyQt5.QtWidgets import * import sysclass Window(QWidget):def __init__(s…

RK3568平台开发系列讲解(Linux系统篇)device 资源的获取

🚀返回专栏总目录 文章目录 一、platform_device 结构体二、platform_get_resource() 获取沉淀、分享、成长,让自己和他人都能有所收获!😄 一、platform_device 结构体 struct platform_driver 结构体继承了 struct device_driver 结构体, 因此可以直接访问 struct devi…