【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_Hvoid 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_Hvoid encode_Init(void);
int16_t encoder_Get(void);#endif

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

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

相关文章

Word页脚设置“第X页共X页”的方法【域实现】

Word页脚设置“第X页共X页”的方法【域实现】 在设置Word页码格式的要求中,有时需要设置为“第X页共X页”这种格式,使用Word中的域功能可实现,同时,在某些情况下,可能还需要减去封面的页码,接下来为具体步…

算法提高之金明的预算方案

算法提高之金明的预算方案 核心思想&#xff1a;有依赖的背包dp 分组背包 状态表示f[i,j]: 考虑前i个组&#xff0c;总体积不超过j的方案状态计算&#xff1a;f(i,j)max(f(i−1,j),f(i−1,j−vkwk)) 遍历每种取附件的方案 #include <iostream>#include <cstring&…

i.MX 6ULL 裸机 IAR 环境安装

一. IAR 的安装请自行搜索 二. 使用最新版本的 IAR&#xff0c;需要修改 SDK 1. 在 SDK 的 core_ca7.h 加上 #include "intrinsics.h" /* IAR Intrinsics */ 2. debug 时需要修改每个工程下的 ddr_init.jlinkscript&#xff0c;参考链接 Solved: How to conn…

spring alibaba中的seata分布式事务

Seata AT 模式设计思路 一阶段&#xff1a;业务数据和回滚日志记录在同一个本地事务中提交&#xff0c;释放本地锁和连接资源。 核心在于对业务sql进行解决解析&#xff0c;转换成undolog&#xff0c;并同时入库存 二阶段&#xff1a; 提交异步化&#xff0c;非常快速地完成…

五月节放假作业讲解

目录 作业1&#xff1a; 问题&#xff1a; 结果如下 作业2&#xff1a; 结果: 作业1&#xff1a; 初始化数组 问题&#xff1a; 如果让数组初始化非0数会有问题 有同学就问了&#xff0c;我明明已经初始化定义过了&#xff0c;为啥还有0呀 其实这种初始化只会改变第一个…

蓝桥杯-网络安全比赛(7)基础知识 HTTP、TTL、IP数据包、MSS、MTU、ARP、LLMNR、MDNS、NBNS。

1. IP中TTL值能够给我提供什么信息&#xff1f;2. IP头部中标志、13位偏移、32位源IP地址、目标IP、IP数据包格式&#xff0c;有多少字节3. IP头部中的16位标识是什么&#xff1f;4. MSS 和MTU分别有多大&#xff1f;5. 怎么获取路由IP信息&#xff1f;PING、NSLOOKUP、TRACERT…

RAG进阶(二): RAG 融合(rag fusion)

在上一篇博客中&#xff0c;我们学习了多重查询(Multi Query)技术&#xff0c;Multi Query的基本思想是当用户输入查询语句(自然语言)时&#xff0c;我们让大模型(LLM)基于用户的问题再生成多个查询语句&#xff0c;这些生成的查询语句是对用户查询语句的补充&#xff0c;它们是…

Mybatis逆向工程笔记小结

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.实现方案 2.1. mybatis-generator生成 2.1.1. 环境说明 2.1.2. 数…

为什么IB损失要在100epochs后再用?

在给定的代码中&#xff0c;参数start_ib_epoch用于控制从第几轮开始使用IB&#xff08;Instance-Balanced&#xff09;损失函数进行训练。具体来说&#xff0c;如果start_ib_epoch的值大于等于100&#xff0c;那么在训练的前100轮中将使用普通的交叉熵损失函数&#xff08;CE&…

【强训笔记】day7

NO.1 思路&#xff1a;双指针模拟&#xff0c;begin表示最长数字字符串最后一个字符&#xff0c;而len表示数字字符串的长度&#xff0c;i用来遍历&#xff0c;如果为数字&#xff0c;那么定义j变量继续遍历&#xff0c;直到不为数字&#xff0c;i-j如果大于len&#xff0c;就…

博客系统项目测试报告

文章目录 一.报告概要二.测试环境三.手工测试用例四.编写测试用例五.自动化测试Selenium测试项目主要特点 一.报告概要 项目概要 本项目是一个全功能的个人博客系统&#xff0c;旨在提供一个用户友好、功能全面的平台&#xff0c;允许用户注册、登录、浏览博客、查看详细内容、…

周刊是聪明人筛选优质知识的聪明手段!

这是一个信息过载的时代&#xff0c;也是一个信息匮乏的时代。 这种矛盾的现象在 Python 编程语言上的表现非常明显。 它是常年高居编程语言排行榜的最流行语言之一&#xff0c;在国外发展得如火如荼&#xff0c;开发者、项目、文章、播客、会议活动等相关信息如海如潮。 但…

#9松桑前端后花园周刊-React19beta、TS5.5beta、Node22.1.0、const滥用、jsDelivr、douyin-vue

行业动态 Mozilla 提供 Firefox 的 ARM64 Linux二进制文件 此前一直由发行版开发者或其他第三方提供&#xff0c;目前Mozilla提供了nightly版本&#xff0c;正式版仍需要全面测试后再推出。 发布 React 19 Beta 此测试版用于为 React 19 做准备的库。React团队概述React 19…

leetCode76. 最小覆盖子串

leetCode76. 最小覆盖子串 题目思路 代码 // 双指针 哈希表 // 这里cnt维护过程&#xff1a;先找到能够匹配T字符串的滑动窗口&#xff0c;然后这个cnt就固定了&#xff0c;因为i向前移动的同时&#xff0c;j也会维护着向前 // 就是当又出现能够满足T字符串的时候&#xff0…

Chrome浏览器安装React工具

一、如果网络能访问Google商店&#xff0c;直接安装官方插件即可 二、网络不能访问Google商店&#xff0c;使用安装包进行安装 1、下载react工具包 链接&#xff1a;https://pan.baidu.com/s/1qAeqxSafOiNV4CG3FVVtTQ 提取码&#xff1a;vgwj 2、chrome浏览器安装react工具…

【JavaScript】运算符

算术运算符 1. 加法运算符&#xff08;&#xff09; 加法运算符用于将两个值相加。如果两个操作数都是数字&#xff0c;则它们将被加在一起。如果其中一个操作数是字符串&#xff0c;则另一个操作数将被转换为字符串&#xff0c;然后执行字符串连接。 运算子不同&#xff0c…

基于ESP32和ESP8266的物联网开发过程(一)

给大家演示一个小工具&#xff0c;通过Wifi去连接ESP32或者ESP8266出来的一个热点。连接到这个热点之后&#xff0c;可以输密码&#xff0c;也可以不输密码。这里我设置的是不输密码直接进来&#xff0c;我这个是ESP8266。 进来之后直接点配置Wifi&#xff0c;然后可以看到ESP8…

sem_wait 和 sem_post

在给出的 Sem 类中&#xff0c;sem_wait 和 sem_post 是 POSIX 信号量&#xff08;semaphores&#xff09;的操作函数&#xff0c;用于控制对共享资源的访问。 sem_wait(&_sem); sem_wait 函数的作用是等待&#xff08;或称为“P”操作&#xff0c;源于荷兰语 "Prob…

【简单介绍下7-Zip】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

快速入门!学习鸿蒙App开发的终极指南!

鸿蒙&#xff08;HarmonyOS&#xff09;是华为推出的一款分布式操作系统&#xff0c;旨在为不同设备提供统一的操作体验。鸿蒙App开发可以让应用程序在多个设备上实现流畅运行。本文将介绍鸿蒙App开发的终极指南&#xff0c;帮助您快速入门。 开发环境搭建 鸿蒙App开发过程需要…