【stm32-3】对射式红外传感器计次旋转编码器计数

1.对射式红外传感器计次 

void EXTI_DeInit(void);        //把EXTI配置都清除,恢复到上电默认状态
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct//指向EXTI_InitTypeDef结构体的指针,其中包含了EXTI外设的基本信息);        //初始化
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);        //
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);        //软件触发外部中断
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);        //获取中断标志位是否被置1
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);        //清除中断标志位

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);        //配置优先级分组:抢占优先级和响应优先级
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct//指向NVIC_InitTypeDef结构体的指针,该设备中含有NVIC外设的信息);        //根据NVIC_InitStruct中指定的参数初始化NVIC外设

(1)main.c

#include "Device/Include/stm32f10x.h"   // Device header
#include "Delay.h"
#include "OLED.h"
#include "countsensor.h"
int main(void)
{
	OLED_Init();
	countsensor_Init();
	OLED_ShowString(1,1,"Count:");

	while(1)
	{
		OLED_ShowNum(1,7,countsensor_Get(),5);
	}
}

(2)countsensor.c

#include "Device/Include/stm32f10x.h"   // Device header
uint16_t countsensor_count;
void countsensor_Init()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_InitTypeDef GPIO_Initstructure;
	GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_Initstructure.GPIO_Pin=GPIO_Pin_14;
	GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_Initstructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//AFIO:选择要用做外部中断线源的GPIO端口:指定要配置的外部中断线
	EXTI_InitTypeDef EXTI_Initstructure;
	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_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_Initstructure;
	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 countsensor_Get(void)
{
	return countsensor_count;
}
void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line14)==SET)	//用于判断在该中断函数上的中断是否发生,若发生,标志位置1.
	{
		countsensor_count++;
		EXTI_ClearITPendingBit(EXTI_Line14);	//清除中断标志位,防止单片机检测到中断标志,重复进入中断
	}
}

 (3)countsensor.h

#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H

void countsensor_Init(void);
uint16_t countsensor_Get(void);
//中断函数不需要调用,自动执行
#endif

 2.旋转编码器计数

(1)main.c

#include "Device/Include/stm32f10x.h"   // Device header
#include "Delay.h"
#include "OLED.h"
#include "encoder.h"
int16_t Num;
int main(void)
{
	OLED_Init();
	encode_Init();
	OLED_ShowString(1,1,"Num:");
	while(1)
	{
		Num+=encoder_Get();
		OLED_ShowSignedNum(1,5,Num,5);
	}
}

(2)encoder.c

#include "Device/Include/stm32f10x.h"   // Device header
int16_t encodercount;
void encode_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_InitTypeDef GPIO_Initstructure;
	GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_Initstructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_Initstructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);	//函数不能|,|后是两个数操作之后的值
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
	//AFIO:选择要用做外部中断线源的GPIO端口:指定要配置的外部中断线
	
	EXTI_InitTypeDef EXTI_Initstructure;
	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);
	//指向EXTI_InitTypeDef结构体的指针,其中包含了EXTI外设的基本信息   初始化
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_Initstructure;
	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_InitTypeDef结构体的指针,该设备中含有NVIC外设的信息
	//根据NVIC_InitStruct中指定的参数初始化NVIC外设
	NVIC_Initstructure.NVIC_IRQChannel=EXTI1_IRQn;
	NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_Initstructure.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&NVIC_Initstructure);
	
}
int16_t encoder_Get(void)
{
	int16_t temp;
	temp=encodercount;
	encodercount=0;
	return temp;
}
void EXTI0_IRQHandler(void)		//????????????
{
	if(EXTI_GetITStatus(EXTI_Line0)==SET)	//用于判断在该中断函数上的中断是否发生,若发生,标志位置1.
	{
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
		{
			encodercount--;
		}
		EXTI_ClearITPendingBit(EXTI_Line0);	//清除中断标志位
	}
}
void EXTI1_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line1)==SET)	//中断标志位置1(SET),程序会跳到中断函数
	{
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)
		{
			encodercount++;
		}
		EXTI_ClearITPendingBit(EXTI_Line1);	//清除中断标志位
	}
}

(3)encoder.h

#ifndef __ENCODER_H
#define __ENCODER_H

void encode_Init(void);
int16_t encoder_Get(void);

#endif

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

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

相关文章

Java的java.util.concurrent.ExecutorService简介

在Java并发编程的璀璨星空中,ExecutorService无疑是那颗最耀眼的明星。它不仅是Java并发编程的核心组件之一,更是构建高并发、高性能应用的秘密武器。今天,我们就来一场说走就走的探索之旅,揭开它的神秘面纱! &#x1…

spring ioc 容器加载过程 refresh() 方法详解

IOC 加载过程 从 new ClassPathXmlApplicationContext开始 ApplicationContext context new ClassPathXmlApplicationContext("classpath:application.xml");ClassPathXmlApplicationContext类构造方法 public ClassPathXmlApplicationContext(String[] configLo…

知识图谱在提升大语言模型性能中的应用:减少幻觉与增强推理的综述

幻觉现象指的是模型在生成文本时可能会产生一些听起来合理但实际上并不准确或相关的输出,这主要是由于模型在训练数据中存在知识盲区所致。 为了解决这一问题,研究人员采取了多种策略,其中包括利用知识图谱作为外部信息源。知识图谱通过将信息…

电子取证平航杯的复现

闻早起部分: 一、闻早起的windows10电脑 (1).“闻早起”所使用的笔记本电脑使用何种加密程式? 1.在EFI文件中找到加密程式 (2) 教徒“闻早起”所使用的笔记本电脑中安装了一款还原软件,其版本…

测试人员必用的10个Chrome扩展插件

背景:谷歌Chrome浏览器是全球所有测试人员最受欢迎和必备的浏览器之一,Chrome浏览器为我们提供了许多扩展的选择,可以让我们高效和省时地完成工作。以下为作者观点: 1. Testsigma Recorder Testsigma Recorder用于记录与网络应用…

嵌入式Linux学习第二天

今天学习linuxC编程。首先要熟悉linux下编写c程序的过程。 编写程序Hello World! 首先创建存放程序的文件夹,如下图所示: 接下来在创建一个文件夹来保存这节要编写的代码。指令:mkdir 3.1 接下来我们要设置VIM编辑器的一些配置&#xff0…

【简单介绍下Debian常用命令】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

AI部署指南

部署指南 建议大家尽可能的自己去部署,如果实在懒得搞,可以找我来帮你部署,详情参考 服务器代部署说明。 由于时间仓促,文档可能尚未详尽,我将在后续逐步补充详细的说明文档。 架构草图 项目依赖 必选依赖 MySQ…

DS二叉搜索树

前言 我们在数据结构初阶专栏已经对二叉树进行了介绍并用C语言做了实现,但是当时没有对二叉搜树进行介绍,而是把他放到数据结构进阶构专栏的第一期来介绍,原因是后面的map和set(红黑树)是基于搜索树的,这里…

Java-(乘法表之后)增强for循环

这里我们先做个了解,之后我会在数组中进行详细介绍Java5引入了一种主要用于数组或集合的增强型for循环Java增强型for循环语法格式如下 For(声明语句:表达式){ //代码语句 } 声明语句:声明新的局部变量,该变量的类型…

Windows中安装的PostgreSQL 数据库如何重启

1. 使用Windows服务管理器 打开“运行”对话框(按WinR键)。输入services.msc并按回车,这将打开服务列表。在服务列表中找到PostgreSQL服务。它通常命名为“PostgreSQL”后面跟着版本号和实例名称,例如“PostgreSQL 13 - mydb”。…

【云原生】Pod 的生命周期(一)

【云原生】Pod 的生命周期(一)【云原生】Pod 的生命周期(二) Pod 的生命周期(一) 1.Pod 生命期2.Pod 阶段3.容器状态3.1 Waiting (等待)3.2 Running(运行中)3…

后缀表达式

什么是后缀表达式? 在计算机科学和数学领域,表达式求值是一项基本且频繁的任务。我们熟知的中缀表达式(如 7 15 ∗ 1 4 ∗ 1)直观易读,但在计算机处理时却需要复杂的栈或递归算法来解析。相比之下,后缀表…

深度学习中的优化算法:选择现有的还是自创?

深度学习中的优化算法 深度学习中的优化算法:选择现有的还是自创?现有优化算法的优势**优点包括**: 开发新的优化算法的考虑**开发新算法的原因**:**开发新算法的风险**: 实用建议结论 深度学习中的优化算法&#xff1…

RabbitMQ 是如何做延迟消息的 ?——Java全栈知识(15)

RabbitMQ 是如何做延迟消息的 ? 1、什么是死信? 当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter): 消费者使用 basic.reject 或 basic.nack 声明消费失败,并且消息的 reque…

5-在Linux上部署各类软件

1. MySQL 数据库安装部署 1.1 MySQL 5.7 版本在 CentOS 系统安装 注意:安装操作需要 root 权限 MySQL 的安装我们可以通过前面学习的 yum 命令进行。 1.1.1 安装 配置 yum 仓库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql…

rk3588局域网推流

最近无意间看见在网上有使用MediaMtx插件配合ffmpeg在Windows来进行推流,然后在使用其他软件进行拉流显示数据图像的,既然windows都可以使用 ,我想linux应该也可以,正好手上也有一块RK3588的开发板,就测试了一下&#…

iOS ------ JSONModel源码

一,JSONModel的基本使用 1,基本使用方法 - (instancetype)initWithDictionary:(NSDictionary *)dict error:(NSError **)err; - (instancetype)initWithData:(NSData *)data error:(NSError **)error; - (instancetype)initWithString:(NSString *)str…

Linux网络-部署YUM仓库及NFS共享服务

目录 一.YUM仓库服务 1.YUM概述 1.1.YUM(Yellow dog Updater Modified) 2.准备安装源 2.1.软件仓库的提供方式 2.2.RPM软件包的来源 2.3.构建CentOS 7 软件仓库 2.4.在软件仓库中加入非官方RPM包组 3.一键安装软件包的工具: 好处&a…

申请Sectigo证书流程详解

Sectigo(前身为Comodo CA),是目前主流SSL证书的一种,目前全球范围内应用度也非常广泛,是目前众多品牌中市场份额最大的一个品牌了,在全球证书市场份额占比约为40%。 其超高的市场份额占比主要还是基于其超…
最新文章