GPIO输入-外电检测

前言

(1)本系列是基于STM32的项目笔记,内容涵盖了STM32各种外设的使用,由浅入深。

(2)小编使用的单片机是STM32F105RCT6,项目笔记基于小编的实际项目,但是博客中的内容适用于各种单片机开发的同学学习和使用。

学习目标

  1. 外电检测电路原理的分析。
  2. 外电检测程序代码的开发,掌握GPIO口输入模式的配置。
  3. 实验效果:外电连接LED1亮,外电断开 LED1灭。

外电检测硬件原理图

原理分析

外电的状态是通过PB1端口来检测的。 那分别分析PB1 在没有外电输入和有外电输入的状态。

(1)外电断开

PB1 通过下拉电阻R55 接地,PB1输入低电平。

(2)外电输入端口连接5V供电

R55/(R54+R55) = VR55(A点) / 5V (VR54+R55)

PB1的电压值为:VR55 =5*200 /(100+200) = 3.33V,高电平。

程序实现–外电状态检测

外电检测GPIO的初始化

端口定义: 外电检测的端口是PB1
// AC Check Pin
#define CHECK_ACSTATE_PORT       GPIOB
#define CHECK_ACSTATE_PIN           GPIO_Pin_1

PB1的初始化GPIO的初始化:

void hal_GpioConfig_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE); 	GPIO_InitStructure.GPIO_Pin = CHECK_ACSTATE_PIN;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //浮空输入GPIO_Init(CHECK_ACSTATE_PORT, &GPIO_InitStructure);	AcState = (en_AcLinkSta)hal_GPIO_GetACState();  /// 
} 

上拉,下拉,悬空方式的选择:

选择浮空输入模式

typedef enum
{ GPIO_Mode_AIN = 0x0,//模拟输入GPIO_Mode_IN_FLOATING = 0x04,//浮空输入GPIO_Mode_IPD = 0x28,//上拉输入GPIO_Mode_IPU = 0x48,//下拉输入GPIO_Mode_Out_OD = 0x14,//通用开漏输出GPIO_Mode_Out_PP = 0x10,//通用推挽输出GPIO_Mode_AF_OD = 0x1C,//复用开漏输出GPIO_Mode_AF_PP = 0x18//复用推挽输出
}GPIOMode_TypeDef;

如果GPIO模式选择: 上拉输入, 则在外电掉电的状态下 PB1 也是高电平。

GPIO模式选择上拉输入时,Rdo不存在,此时电路中只有其他3个电阻,不论外电连接或断开,PB1均被上拉电阻拉高,为高电平。

如果GPIO模式选择: 下拉输入, 则在外电连接的状态下 PB1的电平会变小。

GPIO模式选择下拉输入时,Rup不存在,此时电路中只有其他3个电阻,R55 和RDO 并联之后整体的阻值变小, R54不变。根据串联电路分压, PB1的电压会变小。

常用的GPIO输入库函数

GPIO 常用输入函数
//读取单个输入端口的数据
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取单个输入端口的数据
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读取单个输入端口的数据
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取单个输入端口的数据
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

定义外电状态枚举类型变量

typedef enum
{STA_AC_BREAK = 0,STA_AC_LINK,
}en_AcLinkSta;

外电检测函数

// 获取PB1端口状态(高低电平)
static unsigned char hal_GPIO_GetACState(void)
{return (GPIO_ReadInputDataBit(CHECK_ACSTATE_PORT,  CHECK_ACSTATE_PIN ));		
}
void delay_1msTest(void)
{unsigned int i=0;i = 72000;while(i--);   
}外电检测函数任务
返回值   外电的状态
en_AcLinkSta hal_Gpio_AcStateCheck(void)
{en_AcLinkSta state;static unsigned char times = 0;	//静态延时计数state = (en_AcLinkSta)hal_GPIO_GetACState();//记录第一次检测到的外电状态delay_1msTest();if(state == AcState){如果本次获取的状态和上次一样,则清零延时计数times	= 0;}else if(state != AcState){///如果状态有变化times	++; //计数增加if(times > 20){如果不一样的状态计数超过20次  则更新 AcState 状态。times = 0;AcState = state;}}return AcState;///
}
///

hal_GPIO.h代码

#ifndef ____HAL_GPIO_H_
#define ____HAL_GPIO_H_// AC Check Pin
#define CHECK_ACSTATE_PORT       GPIOB
#define CHECK_ACSTATE_PIN        GPIO_Pin_1typedef enum
{STA_AC_BREAK = 0,STA_AC_LINK,
}en_AcLinkSta;void hal_GpioConfig_init(void);
en_AcLinkSta hal_Gpio_AcStateCheck(void);#endif
//

hal_GPIO.c代码

#include "stm32F10x.h"
#include "hal_GPIO.H"static unsigned char hal_GPIO_GetACState(void);static en_AcLinkSta AcState;// 外电的状态静态全局变量/GPIO 初始化函数
void hal_GpioConfig_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE); 	GPIO_InitStructure.GPIO_Pin = CHECK_ACSTATE_PIN;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //浮空输入GPIO_Init(CHECK_ACSTATE_PORT, &GPIO_InitStructure);	AcState = (en_AcLinkSta)hal_GPIO_GetACState();  ///上电获取外电的状态   
}// 获取PB1端口状态(高低电平)
static unsigned char hal_GPIO_GetACState(void)
{return (GPIO_ReadInputDataBit(CHECK_ACSTATE_PORT, GPIO_Pin_1));		
}
void delay_1msTest(void)
{unsigned int i=0;i = 7200;while(i--);   
}en_AcLinkSta hal_Gpio_AcStateCheck(void)
{en_AcLinkSta state;static unsigned char times = 0;	//静态延时计数state = (en_AcLinkSta)hal_GPIO_GetACState();delay_1msTest();if(state == AcState){如果本次获取的状态和上次一样,则清零延时计数times	= 0;}else if(state != AcState){///如果状态有变化times	++; //计数增加if(times > 20){如果不—样的状态计数超过20次 则更新 Acstate 状态。times = 0;AcState = state;}}return AcState;///
}
///

修改main函数

#include "stm32f10x.h"
#include "hal_timer.h"
#include "hal_led.h"
#include "hal_gpio.h"int main(void)
{hal_LedInit();hal_GpioConfig_init();
//	hal_timerInit();while (1){		if(hal_Gpio_AcStateCheck() == STA_AC_BREAK){GPIO_ResetBits(LED7_PORT,LED7_PIN);}else{	GPIO_SetBits(LED7_PORT,LED7_PIN);			}}
}

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

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

相关文章

数据结构-链表

吐槽一下: 在我第一次看到链表这个东西的时候,我觉得数据结构好难啊,怎么这么难理解啊,这是什么玩意啊,结果慢慢的我才发现,链表是除了顺序表最简单的一个数据结构了;我以为我学完了链表&#x…

登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)

会话技术方案选择和对比 一、背景说明二、会话技术之 Cookie1、为什么说cookie是客户端会话技术2、cookie的优点和缺点 三、会话技术之 Session1、为什么说Session是服务端会话技术2、session的优点和缺点 四、令牌技术JWT1、JWT 的原理2、JWT的优点和缺点 一、背景说明 在开发…

科大讯飞笔试编程第二题(处理Scanner不能先输入数字再输入字符串问题)

问题: 在使用scanner的时候如果先读取一个数字,在读取一行带有空格的字符串,势必会出错或者字符串读不到 public static void main(String[] args) {Scanner scanner new Scanner(System.in);int x scanner.nextInt();String s scanner.n…

【C++杂货铺】探索vector的底层实现

文章目录 一、STL1.1 什么是STL?1.2 STL的版本1.3 STL的六大组件 二、vector的介绍及使用2.1 vector的介绍2.2 vector的使用2.2.1 vector的定义2.2.2 vector iterator2.2.3 vector空间增长问题2.2.4 vector增删查改 2.3 vector\<char\> 可以替代 string 嘛&#xff1f; …

指针-C语言(初阶)

目录 一、什么是指针 二、指针和指针类型 2.1 指针-整数 2.2 指针的解引用 三、野指针 3.1 野指针形成原因 3.2 如何规避野指针 四、指针运算 4.1 指针-整数 4.2 指针-指针 4.3 指针的关系运算 五、指针和数组 六、二级指针 七、指针数组 一、什么是指针 指针是内存中一个…

【八股】2023秋招八股复习笔记4(MySQL Redis等)

文章目录 目录1、MySQLmysql索引实现mysql索引优化mysql索引失效的情况mysql 千万数据优化mysql 事务隔离级别 & 实现原理mysql MVCC版本链&#xff08;undo log&#xff09;mysql数据同步机制 & 主从复制 &#xff08;binlog&#xff09;mysql 日志&数据恢复&…

5G NR:RACH流程-- Msg1之生成PRACH Preamble

随机接入流程中的Msg1&#xff0c;即在PRACH信道上发送random access preamble。涉及到两个问题&#xff1a; 一个是如何产生preamble&#xff1f;一个是如何选择正确的PRACH时频资源发送所选的preamble? 一、PRACH Preamble是什么 PRACH Preamble从数学上来讲是一个长度为…

MyBatis与Spring的集成整合加优化分页功能

目录 一.为什么要将MyBatis和Spring整合&#xff1f;&#xff1f;&#xff1f; 二.配置环境 2.1 pom文件 2.2 xml文件 三.演示举例 四.Aop整合pageHelper 分页插件 今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.为什么要将MyBatis和Spring整合&#xff1f…

自动驾驶感知传感器标定安装说明

1. 概述 本标定程序为整合现开发的高速车所有标定模块,可实现相机内参标定和激光、相机、前向毫米波 至车辆后轴中心标定,标定参数串联传递并提供可视化工具验证各个模块标定精度。整体标定流程如下,标定顺序为下图前标0-->1-->2-->3,相同编号标定顺序没有强制要求…

【业务功能篇83】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-应用层实战

五、ElasticSearch应用 1.ES 的Java API两种方式 Elasticsearch 的API 分为 REST Client API&#xff08;http请求形式&#xff09;以及 transportClient API两种。相比来说transportClient API效率更高&#xff0c;transportClient 是通过Elasticsearch内部RPC的形式进行请求…

共享内存 windows和linux

服务端&#xff0c;即写入端 #include <iostream> #include <string.h> #define BUF_SIZE 1024 #ifdef _WIN32 #include <windows.h> #define SHARENAME L"shareMemory" HANDLE g_MapFIle; LPVOID g_baseBuffer; #else #define SHARENAME "sh…

使用通信顺序进程(CSP)模型的 Go 语言通道

在并发编程中&#xff0c;许多编程语言采用共享内存/状态模型。然而&#xff0c;Go 通过实现 通信顺序进程&#xff08;CSP&#xff09;模型来区别于众多。在CSP中&#xff0c;程序由不共享状态的并行进程组成&#xff1b;相反&#xff0c;它们通过通道进行通信和同步操作。因此…

wireshark抓包

Wireshark是非常流行的网络封包分析软件&#xff0c;可以截取各种网络数据包&#xff0c;并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括&#xff1a; 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该例子学…

最新绕过目标域名CDN进行信息收集技术

绕过目标域名CDN进行信息收集 1&#xff0e;CDN简介及工作流程 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;的目的是通过在现有的网络架构中增加一层新的Cache&#xff08;缓存&#xff09;层&#xff0c;将网站的内容发布到最接近用户的网…

ubuntu下自启动设置,为了开机自启动launch文件

1、书写sh脚本文件 每隔5秒钟启动一个launch文件&#xff0c;也可以直接在一个launch文件中启动多个&#xff0c;这里为了确保启动顺利&#xff0c;添加了一些延时 #! /bin/bash ### BEGIN INIT sleep 5 gnome-terminal -- bash -c "source /opt/ros/melodic/setup.bash…

uniapp - 全平台兼容实现上传图片带进度条功能,用户上传图像到服务器时显示上传进度条效果功能(一键复制源码,开箱即用)

效果图 uniapp小程序/h5网页/app实现上传图片并监听上传进度,显示进度条完整功能示例代码 一键复制,改下样式即可。 全部代码 记得改下样式,或直接

MyBatis的基本入门及Idea搭建MyBatis坏境且如何一步骤实现增删改查(CRUD)---详细介绍

一&#xff0c;MaBatis是什么&#xff1f; 首先是一个开源的Java持久化框架&#xff0c;它可以帮助开发人员简化数据库访问的过程并提供了一种将SQL语句与Java代码进行解耦的方式&#xff0c;使得开发人员可以更加灵活地进行数据库操作。 1.1 Mabatis 受欢迎的点 MyBatis不仅是…

使用CSS的@media screen 规则为不同的屏幕尺寸设置不同的样式(响应式图片布局)

当你想要在不同的屏幕尺寸或设备上应用不同的CSS样式时&#xff0c;可以使用 media 规则&#xff0c;特别是 media screen 规则。这允许你根据不同的屏幕特性&#xff0c;如宽度、高度、方向等&#xff0c;为不同的屏幕尺寸设置不同的样式。 具体来说&#xff0c;media screen…

【Spring MVC】

目录 &#x1f36e;1 什么是 MVC &#xff1f; &#x1f381;2 Spring MVC 的连接 &#x1f358;2.1 RequestMapping 实现 POST 和 GET 请求 &#x1f963;2.2 GetMapping 只支持 GET 请求 &#x1fad6;2.3 PostMapping 只支持 POST 请求 &#x1f36c;3 Spring MVC 获取参数的…

Spring复习:(56)PropertySourcePlaceholderConfigurer的工作原理

PropertySourcePlaceholderConfigurer的用途&#xff1a;通过配置文件&#xff08;比如.properties文件&#xff09;给bean设置属性&#xff0c;替代属性占位符 示例&#xff1a; 属性配置文件 spring.datasource.urljdbc:mysql://xxx.xxx.xxx.xxx/test spring.datasource.us…