【STM32入门】4.2对射红外传感器计次

1.接线方式

主要是编写传感器的驱动、配合OLED,每遮挡对射红外传感器,OLED屏幕的计数就加一。

2.驱动编写 

首先新建.c文件和.h文件,命名为CountSensor

国际惯例,.c文件内要包含stm32.h头文件,然后编写 CountSensor_Init()函数,即传感器计数函数。一步一步来,首先函数体内部要首先使能时钟,没有时钟不工作。总体的函数内部需要配置的东西有:

1.配置RCC时钟;

2.配置GPIO,端口配置为输入模式;

3.配置AFIO,选择GPIO链接到EXTI;

4.配置EXTI,选择边沿触发方式和触发的响应方式;

5.配置NVIC,配置中断优先级。

2.1时钟使能

void CountSensor_Init(void)
//第一步配置RCC,没有时钟不行;第二部配置GPIO,配置端口为输入模式;第三步配置AFIO,选择我们的GPIO链接到EXTI//第四步配置EXTI,选择边沿的触发方式,和触发的响应方式。第五步,配置NVIC,配置中断优先级。
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB的时钟,因为传感器引脚接在了GPIOBRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//AFIO时钟开启

2.2定义GPIO参数 

GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//EXTI输入,推荐配置是浮空,上拉或下拉GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz ;GPIO_Init(GPIOB, &GPIO_InitStructure);

首先定义GPIO参数结构体,GPIO_Mode选择上拉输入;使能第14号管脚,因为传感器的信号端接的是GPIOB_14;速度万年50MHz,最后调用GPIO_Init(GPIOB,&结构体名称)初始化GPIO14.

2.3配置AFIO,选择GPIO引脚

AFIO外设没有专门分配的库函数,它的库函数跟GPIO在同一个文件中,在GPIO.h中的第350行开始。使用函数:GPIO_EXTILineConfig()函数,选择指定的GPIO引脚链接EXTI,如果不知道这个函数怎么用,右键然后看它的定义,如下图所示:

函数上面的注释中@brief是函数功能简介,这里说的很清楚,本函数是选择GPIO管脚链接到EXTI 。函数的第一个参数是GPIO源,就是GPIO哪个片区,是GPIOA还是GPIOB;第二个参数是具体的管脚号。我们这个例子是用GPIOB_14,所以函数的调用形式为:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);

2.4.配置EXTI

首先要用结构体定义EXTI参数,具体包括EXTI_Line,配置中断线;EXTI_LineCmd,开启或关闭中断;EXTI_Mode,选择中断模式;EXTI_Trigger,触发方式选择。总体就是这么几个地方要配置,最后调用EXTI_Init()函数,初始化EXTI。总体代码如下:

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_Rising;//触发中断方式,是下降沿还是上升沿EXTI_Init(&EXTI_InitStructure);

2.5.配置NVIC 

回顾上一篇讲的内容,NVIC的作用是管理中断,更具体地是管理中断的优先级。

首先要配置优先级分组,优先级分组有6种方式,这里选择第二种。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先集分组定义

接下来使用结构体定义NVIC的参数,包括 NVIC_IRQChannel:指定NVIC通道;NVIC_IRQChannelCmd使能或关闭;NVIC_IRQChannelPreemptionPriority抢占优先级;NVIC_IRQChannelSubPriority响应优先级。最后调用NVIC_Init函数初始化NVIC。

NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//指定NVIC的通道NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);

 3.定义读数函数

函数的返回值是变量CountSensor_Count

uint16_t CountSensor_Get(void)
{return CountSensor_Count;}

4.定义中断函数

void EXTI15_10_IRQHandler(void)//中断函数的名字
{if (EXTI_GetITStatus(EXTI_Line14) == SET){CountSensor_Count++;EXTI_ClearITPendingBit(EXTI_Line14);}
}

5.主函数

#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);}
}

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

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

相关文章

在Linux上安装配置Nginx高性能Web服务器

1 前言 Nginx是一个高性能的开源Web服务器,同时也可以作为反向代理服务器、负载均衡器、HTTP缓存以及作为一个邮件代理服务器。它以其出色的性能和灵活性而闻名,被广泛用于处理高流量的网站和应用程序。本文将介绍在Linux环境中安装Nginx的步骤&#xf…

CSS新手入门笔记整理:CSS3选择器

属性选择器 属性选择器,指的是通过“元素的属性”来选择元素的一种方式。 语法 元素[attr^"xxx"]{} 元素[attr$"xxx"]{} 元素[attr*"xxx"]{} 选择器 说明 E[attr^"xxx"] 选择元素E,其中E元素的attr属性是…

new一个对象

1.自己直接调用 function Person(name, age) {this.name name;this.age age;}let a1 new Person("小明", 20);let a2 new Person("小菜", 25);console.log(a1); 打印的对象: 2.自己模拟一个 function Person(name, age) {this.name name;this.age a…

[Linux] LVS负载均衡群集——DR模式

一、 DR模式的特点 直接路由: 在LVS_DR模式下,负载均衡器不修改数据包的IP地址,只修改目的MAC地址。这使得数据包可以直接路由到后端实际服务器上,而不需要返回到负载均衡器。 高性能: 由于数据包在传输过程中不需要回…

本地运行大语言模型并可视化(Ollama+big-AGI方案)

目前有两种方案支持本地部署,两种方案都是基于llamacpp。其中 Ollama 目前只支持 Mac,LM Studio目前支持 Mac 和 Windows。 LM Studio:https://lmstudio.ai/ Ollama:https://ollama.ai/download 本文以 Ollama 为例 step1 首先下…

唯一分解定理

唯一分解定理 1.内容 任何一个大于1的整数n都可以分解成若干个质数的连乘积,如果不计各个质数的顺序,那么这种分解是惟一的,即若n>1,则有 n ∏ p i j n\prod{p^j_i} n∏pij​这里的 p i p_i pi​是质数。 可以进行简单证明…

STM32_启动流程详解

目录标题 前言 启动流程概述复位中断函数详解SystemInit函数详解 __main函数详解 附录 stm32单片机的存储器映像中断向量表的映射 前言 最近在学习IAP远程OTA升级单片机固件程序,发现自己对单片机的启动流程还不是那么了解,就总结整理一下吧。 启动流程…

QT实现四则运算计算器

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setMaximumSize(240,300);this->setMinimumSize(240,300);this->setWindowTitle("计算器&…

node.js mongoose简述

目录 官方文档 mongoose Schema Model Query document 关系 官方文档 Mongoose v8.0.3: Getting Started mongoose Mongoose 是一个 Node.js 环境下 MongoDB 的对象建模工具。它提供了一种在应用程序中与 MongoDB 数据库进行交互的方式,使得开发者能够使用…

NoSQL 数据库有哪些典型应用?

前面的内容介绍了数据库读写分离和分库分表相关知识,都是针对关系型数据库的,即通常说的 RDBMS。除了关系型数据库,NoSQL 在项目开发中也有着越来越重要的作用,与此同时,NoSQL 相关的内容也是面试的常客。今天我们一起…

计算机网络技术的应用探讨

一、计算机网络技术的概念与主要功能 计算机网络技术指的是将计算机与传输介质连接在 一起,并根据规定的网络协议进行数据通信,从而实现 数据资源共享的一种技术。计算机网络技术的主要功能 包括以下三点。第一,计算机网络技术具有通信功能&a…

如何进行软件测试和测试驱动开发(TDD)?

1. 软件测试概述 1.1 什么是软件测试? 软件测试是一种评估系统的过程,目的是发现潜在的错误或缺陷。通过对软件进行测试,开发者和测试人员可以确定软件是否符合预期的需求、功能是否正常运行,以及系统是否足够稳定和可靠。 1.2…

函数难题:排列

给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。 现在,请你按照字典序将所有的排列方法输出。 输入格式 共一行,包含一个整数 n。 输出格式 按字典序输出所有排列方案,每个方案占一行。 数据范围 …

【Linux】驱动

驱动 驱动程序过程 系统调用 用户空间 内核空间 添加驱动和调用驱动 驱动程序是如何调用设备硬件 驱动 在计算机领域,驱动(Driver)是一种软件,它充当硬件设备与操作系统之间的桥梁,允许它们进行通信和协同工作。驱动程…

[已解决】uniapp内置插件,editor富文本报错(附quill.min.js、image-resize.min.js文件)

在使用uni-app运行内置插件editor时,无法输入内容,控制台报错 原因:查看官网得知,需动态引入quill.min.js、image-resize.min.js文件 解决方法: 1.下载quill.min.js、image-resize.min.js到项目static/eidtor文件中 链…

云原生之深入解析Kubernetes Operator的最佳实践和最常见的问题分析

一、Kubernetes Operator 简介 Kubernetes Operator 是通过连接主 API 并 watch 时间的一组进程,一般会 watch 有限的资源类型。当相关 watch 的 event 触发的时候,operator 做出响应并执行具体的动作。这可能仅限于与主 API 交互,但通常会涉…

从零开始搭建Go语言开发环境

https://www.liwenzhou.com/posts/Go/install_go_dev/ “go 命令现在默认在模块感知模式下构建包,即使没有 go.mod 存在也是如此。 “您可以将 GO111MODULE 设置为 auto,仅当当前目录或任何父目录中存在 go.mod 文件时,才能启用模块感知模式…

Linux下FFmepg使用

1.命令行录一段wav,PCM数据 ffmpeg -f alsa -i hw:0,0 xxx.wav//录制 ffplay out.wav//播放ffmpeg -f alsa -i hw:0,0 -ar 16000 -channels 1 -f s16le 1.pcm ffplay -ar 16000 -channels 1 -f s16le 1.pcm -ar freq 设置音频采样率 -ac channels 设置通道 缺省为1 2.将pcm…

uniapp组件map地图组件使用

在uniapp中&#xff0c;可以使用uni-app官方提供的map组件来实现地图功能。下面是一个简单的使用示例&#xff1a; 在页面中引入map组件&#xff0c;在template中添加以下代码&#xff1a; <template><view><!-- map组件 --><map :longitude"longi…

03 动态渲染数据

概述 One of the most used terms and reactive elements used when constructing Vue components is data properties. These manifest themselves within the data() function of a Vue instance: 数据属性是构建 Vue 组件时最常用的术语和反应式元素之一。这些属性体现在 …