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

news2025/2/5 4:53:41

目录

一.程序调试方式

二.OLED简介

三. 中断系统

四.代码实现

(1)对射式红外计数

 (2)旋转编码计数


一.程序调试方式

二.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 ,会造成主函数内容显示出现问题)

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费版XShell7下载安装

1.下载地址 家庭/学校免费 - NetSarang Websitehttps://www.xshell.com/zh/free-for-home-school/ 不同时期下载,版本会有不同,实时下载即可。 2.安装 Xshell和Xftp都要安装,点击下一步,直至安装完成。 3.邮箱注册,免…

Redis核心技术与实战【学习笔记】 - 16.Redis 缓存异常:缓存和数据库不一致

概述 只要使用 Redis 缓存,就必须面对缓存和数据库的一致性问题。 重要的是,如果数据不一致,那么业务应用从缓存中读取的数据就不是最新数据,这会导致严重的问题。比如说,我们把电商商品的库存信息缓存在 Redis 中&am…

【网站项目】065健康综合咨询问诊平台

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Python入门到精通(七)——Python文件操作

Python文件操作 一、文件的编码 二、文件的读取 1、操作汇总 2、model 常用的三种基础访问模式 三、文件的写入 四、文件的追加 五、综合案例 一、文件的编码 1、什么是编码? 编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。编…

合约短线高胜率策略-扭转乾坤指标使用说明

扭转乾坤指标使用说明 行情判断 双绿线 多趋势双红线 空趋势大绿线 小红线 多震荡大红线 小绿线 空震荡 进场条件 趋势行情进场 多趋势 多信号 底金叉 做多空趋势 空信号 顶死叉 做空 震荡行情进场 多震荡 多信号 底金叉 做多多震荡 空信号 顶死叉 做空空…

带你玩转股票的价值投资,上市公司典型案例分析

一、教程描述 上市企业,一般是新经济的典型代表,它的变化最能折射出新的商业模式及未来的产业机会。无论你是企业管理层、新兴创业者,还是职场精英及在校学生,都可以从上市公司的演变规律中,找到自己的职业晋升路径和…

LNMP环境搭建动态网站

一、环境准备 服务器:openEuler 22.03 Linux IPV4 :192.168.110.144/24 网页服务器:Nginx1.21.0 数据库:MySQL 8.0.36 PHP:8.0.30 1.安装软件 [rootnode3 ~]# yum install php-mysqlnd php php-gd php-fpm php-xml -y…

运维SRE-02 正则表达式、grep

1.特殊符号补充 1.1位置相关的特殊符号 . 当前目录 .. 当前目录的上级目录 ~ 当前用户家目录 / 根目录 cd - 返回上次所在目录1.2熟练掌握 # 注释符号,root命令提示符 | 管道符号.1.3了解其他特殊符号 $ 取值(取出变量的值),普通用户的提示符 ! % ^ & * (){} [] ; ? \…

git使用以及工作中开发流程

Git是当前最先进、最主流的分布式版本控制系统,免费、开源。 主要概念: 基本流程: 命令: git commit -a # 省略了add到暂存区的步骤,直接提交工作区的修改内容到版本库,不包括新增的文件。git fetc…

Python之PySpark简单应用

文章目录 一、介绍1.准备工作2. 创建SparkSession对象:3. 读取数据:4. 数据处理与分析:5. 停止SparkSession: 二、示例1.读取解析csv数据2.解析计算序列数据map\flatmap 三、问题总结1.代码问题2.配置问题 一、介绍 PySpark是Apa…

【Linux-常用命令】Linux 常用命令大全

【Linux-常用命令】Linux 常用命令大全 1)文件管理1.1.目录操作1.2.vim 操作1.3.打包压缩相关命令1.4.Linux 管道1.5.Linux 远程拷贝命令1.6.查看文件目录大小 2)文件权限管理2.1.三种基本权限2.2.更改权限 3)运行程序3.1.命令行运行3.2.后台…

睿尔曼超轻量仿人机械臂—外置按钮盒使用说明

睿尔曼RM系列机械臂的控制方式有很多种,包括:示教器、JSON、API等。在此为大家介绍外置按钮盒的使用方法。 按钮盒接线安装 按钮盒外观如下图所示,有:急停、暂停、开始、继续。四个功能按钮。用户可通过这四个按钮来实现对机械臂运…

FileGDB文件地理数据库的大小和名称限制

FileGDB文件地理数据库的大小和名称限制 官方链接 文件地理数据库的大小和名称限制如下: 文件地理数据库的大小 - 无限制 表或要素类大小 - 1 TB(默认值)、4 GB 或 256 TB(带关键字) 要素类和表的数量 - 2,147,483,6…

公共用例库计划--个人版(六)典型Bug页面设计与开发

1、任务概述 本次计划的核心任务是开发一个,个人版的公共用例库,旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理,并以提高用例的复用率为目标,力求最大限度地减少重复劳动,提升…

数据结构-内部排序

简介 排序(Sorting):将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列 排序算法分为内部排序和外部排序 内部排序:在排序期间数据对象全部存放在内存的排序 外部排序&am…

【c++】取地址及const取地址操作符重载

1.const成员 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改 我们来看看下面的代码 class Date { public:Date(int year, int month,…

2024年美赛数学建模C题思路分析 - 网球的动量

# 1 赛题 问题C:网球的动量 在2023年温布尔登绅士队的决赛中,20岁的西班牙新星卡洛斯阿尔卡拉兹击败了36岁的诺瓦克德约科维奇。这是德约科维奇自2013年以来首次在温布尔登公开赛失利,并结束了他在大满贯赛事中历史上最伟大的球员之一的非凡…

2024年美赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

WordPress SMTP发信避坑指南

前言 Clip_2024-01-31_19-46-18803285 10.5 KB 目前不少主题已经内置了SMTP发信功能,这是因为WordPress自带的mail()函数发信时基本无法发送。 但是在之前(约2021年末)貌似可以通过WordPress自带的函数发信,并且收信方提示由xxx代…

༺༽༾ཊ—Unity之-04-原型模式—ཏ༿༼༻

首先创建一个项目, 在这个初始界面我们需要做一些准备工作, 建基础通用文件夹, 创建一个Plane 重置后 缩放100倍 加一个颜色, 任务1:使用 建造者模式 创建三种 金刚猿猴 零部件 拼接组合 首先资源商店下载 金刚猿猴 模…