江协科技STM32学习- P7 GPIO输入

    🚀write in front🚀  
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 

💬本系列哔哩哔哩江科大STM32的视频为主以及自己的总结梳理📚 

🚀Projeet source code🚀   

💾工程代码放在了本人的Gitee仓库:iPickCan (iPickCan) - Gitee.com

引用:

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

Keil5 MDK版 下载与安装教程(STM32单片机编程软件)_mdk528-CSDN博客

STM32之Keil5 MDK的安装与下载_keil5下载程序到单片机stm32-CSDN博客

0. 江协科技/江科大-STM32入门教程-各章节详细笔记-查阅传送门-STM32标准库开发_江协科技stm32笔记-CSDN博客

江科大STM32学习笔记(上)_stm32博客-CSDN博客

STM32学习笔记一(基于标准库学习)_电平输出推免-CSDN博客

术语:

英文缩写描述
GPIO:General Purpose Input Onuput通用输入输出
AFIO:Alternate Function Input Output复用输入输出
AO:Analog Output模拟输出
DO:Digital Output数字输出

正文:

0. 概述

从 2024/06/12 定下计划开始学习下江协科技STM32课程,接下来将会按照哔站上江协科技STM32的教学视频来学习入门STM32 开发,本文是视频教程 P2 STM32简介一讲的笔记。

1. GPIO简介

通过配置GPIO的端口配置寄存器,上面的位结构的电路就会根据我们的配置进行改变(比如,开关的通断、N-MOS和P-MOS是否有效、数据选择器的选择等),端口可以配置成以下8种模式。

模式名称

性质

特征

浮空输入

数字输入

可读取引脚电平,若引脚悬空,则电平不确定

上拉输入

数字输入

可读取引脚电平,内部连接上拉电阻,悬空时默认高电平

下拉输入

数字输入

可读取引脚电平,内部连接下拉电阻,悬空时默认低电平

模拟输入

模拟输入

GPIO无效,引脚直接接入内部ADC

开漏输出

数字输出

可输出引脚电平,高电平为高阻态,低电平接VSS

推挽输出

数字输出

可输出引脚电平,高电平接VDD,低电平接VSS

复用开漏输出

数字输出

由片上外设控制,高电平为高阻态,低电平接VSS

复用推挽输出

数字输出

由片上外设控制,高电平接VDD,低电平接VSS

 

2.按键简介

 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动

3.传感器模块简介

传感器模块:传感器元件(传感器模块就是利用传感器元件,比如如下图的光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化(比如光线越强,光敏电阻的阻值就越小),通过与定值电阻进行串联分压即可得到模拟电压输出,再通过电压比较器进行二值化(二值化就是要么是高要么是低)即可得到数字电压输出。

这个N1就是传感器元件所代表的可变电阻,它的阻值可以根据环境的光线、温度等模拟两进行变化。

N1上面的R1,是和N1进行分压的定值电阻,R1和N1串联,一端接VCC一端接VSS,这就构成了基本的分压电路,AO电压就由R1和N1两个电阻的分压得到。

AO电压就由R1和N1两个电阻的分压得到。

N1左边的C2是一个滤波电容,它是为了给中间的电压输出进行滤波的,用来滤除一些干扰,保证输出电压波形的平滑。一般我们在电路中遇到一端接到电路中,另一端接地的电容,都可以考虑一下是不是滤波电容的作用,并不是电路的主要框架,这时候我们进行分析电路时,就可以先把这个电容抹掉,这样就可使我们的电路分析更加简单。

二值化输出是通过这个LM393芯片来完成,是一个电压比较器芯片,里面由两个独立的电压比较器电路,然后剩下的是VCC和GND供电,里面电容是一个电源供电的滤波电容,这个电压比较器其实就是一个运算放大器,当同向输入端的电压大于反向输入端的电压时,输出就会瞬间升高为最大值也就是输出接VCC;反之当同向输入端的电压小于反向输入端的电压时,输出就会瞬间降为最小值,也就是输出接GND,这样就可以对一个模拟电压进行二值化了,DO就是最后数字电压的输出。

4.上拉电阻,下拉电阻

可以用上下拉电阻的思维分析传感器电阻的阻值变化对输出电压的影响,如下:

🌷AO这个输出端可以把它想象成一个水平杆子(下图红色直线),R1上拉电阻相当于拴在上方的弹簧,将杆子向上拉,N1下拉电阻相当于拴在地面的弹簧,将杆子向下拉;

🌷电阻的阻值越小,弹簧的拉力就越强,杆子的高度就相当于电路中的电压,杠子向拉力强的一端偏移(取决于两个弹簧的弹力之差);

🌷如果上下弹簧拉力一致,杆子处于居中位置也就是电路输出VCC/2的电压;如果上面的阻值小,拉力强,输出电压就会变高;

🌷反之下面的阻值小,输出电压就会变低 ;如果上下拉电阻的阻值都为0,就是两个无穷大的力在对抗,在电路中呈现的就是电源短路(应该避免)。

🌷单片机电路中会常出现这种上拉下拉电阻,比如弱上拉,强上拉等(强和弱就是指电阻阻值的大小,也就是这个弹簧拉力大小) ,最终输出电压就是在弹簧拉扯下最终杆子的高低。

5.按键和传感器硬件电路

5.1按键电路

下接按键的方式如下,一般来说我们用下接按键的方式,这个原因和LED的接法类似,是电路设计习惯和规范;下左图中,按键按下时,PA0直接下拉到GND,此时读取PA0口的电压就是低电平,在这种接法下,必须要求PA0是上拉输入模式,使按键松下,还是高电平。下右图,外部接了一个上拉电阻,当按键松手时,引脚由于上拉作用,保持为高电平,此时PA0引脚就可以配置为浮空输入或者上拉输入。

上接按键的方式(仅了解)如下,左图1中,要求将PA0必须配置成下拉输入模式,松手时,引脚会回到默认值低电平。 

 

5.2 传感器电路

传感器模块电路如下,DO是数字输出端口,PA0用于读取数字量。

6. 按键控制实验

6.1 模块化LED灯控制

将LED灯控制的程序进行模块话,加到一个专门的文件目录下,在STM32工程下创建一个新的目录 "Hardware",在Hardware目录下创建两个文件 "LED.h" 和 "LED.c"。

现在 LED.c 和 LED.h 中增加控制LED GPIO 引脚 PA0, PA1 的代码,测试LED功能进行初始化是否可以正常工作。

LED.c文件

#include "stm32f10x.h"                  // Device header
#include "LED.h"void LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef gpioInitStructure;gpioInitStructure.GPIO_Mode = GPIO_Mode_Out_PP;gpioInitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;gpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpioInitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1);
}void LED1_On(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}void LED1_Off(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_0);
}void LED2_On(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}void LED2_Off(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

LED.h文件

#ifndef __LED_H__
#define __LED_H__void LED_Init(void);
void LED1_On(void);
void LED1_Off(void);
void LED2_On(void);
void LED2_Off(void);#endif

main.c 文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"int main(int argc, char *argv[])
{	LED_Init();while(1){LED1_On();LED2_Off();Delay_ms(100);LED1_Off();LED2_On();Delay_ms(100);LED1_On();LED2_Off();Delay_ms(100);LED1_Off();LED2_On();Delay_ms(100);LED1_On();LED2_Off();Delay_ms(700);}return 1;
}

实验结果:

6.2 模块下按键检测

模块下按键检测代码,将案件检测的代码模块话为 key.c 和 key.h 文件假如到STM32工程中,这样代码的逻辑更清晰,也方便以后复用按键输入检测的模块。

key.c 

#include "stm32f10x.h"                  // Device header
#include "stdint.h"
#include "Delay.h"
#include "Key.h"void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef gpioInitStruture;gpioInitStruture.GPIO_Mode = GPIO_Mode_IPU;gpioInitStruture.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;gpioInitStruture.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &gpioInitStruture);}uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Delay_ms(20);	//按键按下消抖while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);Delay_ms(20);	//按键松开消抖KeyNum = 1;}if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){Delay_ms(20);	//按键按下消抖while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);Delay_ms(20);	//按键松开消抖KeyNum = 2;}return KeyNum;
}

key.h

#ifndef __KEY_H__
#define __KEY_H__void Key_Init(void);
uint8_t Key_GetNum(void);#endif

在 led.c 中加入LED灯点亮和熄灭的翻转(Toggle)函数,LED翻转函数中使用 STM32 库函数中的GPIO的输出模式下的‘输出读入函数’:GPIO_ReadOutputDataBit()来获取当前GPIO的输出,然后进行翻转。

led.c

#include "stm32f10x.h"                  // Device header
#include "LED.h"void LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef gpioInitStructure;gpioInitStructure.GPIO_Mode = GPIO_Mode_Out_PP;gpioInitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;gpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpioInitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1);
}void LED1_On(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}void LED1_Off(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_0);
}void LED1_Toggle(void)
{if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_0);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_0);}
}void LED2_On(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}void LED2_Off(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_1);
}void LED2_Toggle(void)
{if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
}

main.c 中循环检测按键的按下

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"uint8_t KeyNum = 0;int main(int argc, char *argv[])
{	LED_Init();Key_Init();while(1){KeyNum = Key_GetNum();if(KeyNum == 1){LED1_Toggle();}else if(KeyNum == 2){LED2_Toggle();}}return 1;
}

实验结果:

按下按键1,LED1点亮,再按下按键1,LED1熄灭。

按下按键2,LED2点亮,再按下按键2,LED2熄灭。

7.光敏传感器控制蜂鸣器实验

光敏传感器控制蜂鸣器实验,当光敏传感器光线较亮时光敏传感器 DO(数字输出)接口输出高电平,当光敏传感器光线较暗时光敏传感器 DO(数字输出)接口输出低电平同时光敏传感器上的‘DO-LED’指示灯变亮,可以根据光敏传感器上的‘DO-LED’指示灯判断光敏传感器输出是高电平还是低电平。

源码如下

buzzer.c 蜂鸣器模块源码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"#include "stm32f10x.h"                  // Device header
#include "LED.h"void Buzzer_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef gpioInitStructure;gpioInitStructure.GPIO_Mode = GPIO_Mode_Out_PP;gpioInitStructure.GPIO_Pin = GPIO_Pin_12;gpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &gpioInitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_12);
}void Buzzer_On(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}void Buzzer_Off(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_12);
}void Buzzer_Toggle(void)
{if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0){GPIO_SetBits(GPIOB, GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB, GPIO_Pin_12);}
}

buffer.h

#ifndef __BUZZER_H__
#define __BUZZER_H__void Buzzer_Init(void);
void Buzzer_On(void);
void Buzzer_Off(void);
void Buzzer_Toggle(void);#endif

光敏传感器模块源码, Lightsensor.c 

#include "stm32f10x.h"                  // Device header
#include "stdint.h"
#include "Delay.h"
#include "Lightsensor.h"void Lightsensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef gpioInitStruture;gpioInitStruture.GPIO_Mode = GPIO_Mode_IPU;gpioInitStruture.GPIO_Pin = GPIO_Pin_13;gpioInitStruture.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &gpioInitStruture);}uint8_t Lighsensor_Get(void)
{return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}

Lightsensor.h

#ifndef __LIGHT_SENSOR_H__
#define __LIGHT_SENSOR_H__void Lightsensor_Init(void);
uint8_t Lighsensor_Get(void);#endif

根据光敏传感器的输出来控制蜂鸣器的鸣叫,当光线亮时光敏传感器输出高电平,此时控制蜂鸣器关闭;当光线暗时光敏传感器输出低低电平,此时控制蜂鸣器鸣叫。

main.c 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "Buzzer.h"
#include "Lightsensor.h"uint8_t KeyNum = 0;int main(int argc, char *argv[])
{	LED_Init();Key_Init();Buzzer_Init();Lightsensor_Init();while(1){if(Lighsensor_Get() == 1){Buzzer_On();}else{Buzzer_Off();}}return 1;
}

实验结果:

光线亮时,光敏传感器输出高电平,光敏传感器DO-LED指示灯点亮

光线暗时,光敏传感器输出低电平,光敏传感器DO-LED指示灯点灭

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

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

相关文章

数据结构(树、平衡树、红黑树)

目录 树 树的遍历方式 平衡二叉树 旋转机制 左旋 右旋 旋转实例 左左 左右 右右 右左 总结 红黑树 树 相关概念 节点的内部结构如下 二叉树与二叉查找树的定义如下 树的遍历方式 前序遍历:当前节点,左子节点,右子结点 中序遍…

string的模拟实现与深浅拷贝

在上一章中可以看见,string类函数的基本实现和用法,在本文。来用基础的语言来模拟实现string类,来了解一下他们的基础底层; 在VS中string,我们可以看见,实现VS的类成员很多,很麻烦; …

【STM32】电容触摸按键

电容按键就是酷,但据我使用过电容按键版的洗澡计费机子后,一生黑(湿手优化没做好的电容按键简直稀碎)。 大部分图片来源:正点原子HAL库课程 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 1 触摸按…

Zookeeper官网Java示例代码解读(一)

2024-08-22 1. 基本信息 官网地址: https://zookeeper.apache.org/doc/r3.8.4/javaExample.html 示例设计思路 Conventionally, ZooKeeper applications are broken into two units, one which maintains the connection, and the other which monitors data. I…

【C++ Primer Plus习题】7.5

问题: 解答: #include <iostream> using namespace std;int function(int n) {if (n 0)return 1;if (n 1)return 1;return n* function(n - 1); }int main() {int value 0;while (true){cout << "请输入数字:";cin >> value;cout << val…

华为Huawei路由器交换机SSH配置

华为设备的SSH登录配置需要5个步骤&#xff0c;示例如下&#xff1a; 一、配置命令 使能SSH功能 stelnet server enable生成公钥 rsa local-key-pair create 1024配置AAA用户密码及相应授权 aaalocal-user xxx password cipher xxxyyy1234local-user xxx privilege level …

ADB 获取屏幕坐标,并模拟滑动和点击屏幕

本文声明:本文是参考https://blog.csdn.net/beyond702/article/details/69258932编制。同时,补充了在windows系统模式下,详细的获取屏幕坐标的步骤。 1.判断设备与windows电脑USB连接是否正常 在CMD窗口输入命令:ADB devices,按ENTER键,输出如下结果,则表示连接正常。 …

Prometheus+Grafana监控数据可视化

上一篇文章讲了prometheus的简单使用&#xff0c;这一篇就先跳过中间略显枯燥的内容&#xff0c;来到监控数据可视化。 一方面&#xff0c;可视化的界面看着更带劲&#xff0c;另一方面&#xff0c;也更方便我们直观的查看监控数据&#xff0c;方便后面的学习。 Grafana安装与…

DIFFUSION 系列笔记| Latent Diffusion Model、Stable Diffusion基础概念、数学原理、代码分析、案例展示

目录 Latent Diffusion Model LDM 主要思想 LDM使用示例 LDM Pipeline LDM 中的 UNET 准备时间步 time steps 预处理阶段 pre-process 下采样过程 down sampling 中间处理 mid processing 上采样 upsampling 后处理 post-process LDM Super Resolution Pipeline…

Redis基本全局命令

文章目录 get和setkeysexistsdelexpirettltype redis全局命令&#xff1a; redis支持很多种数据结构&#xff0c;整体上来说。redis是键值对结构&#xff0c;key固定就是字符串&#xff0c;value实际上就会有很多种&#xff0c;比如说&#xff1a; 字符串哈希表列表有序集合 …

住宅物业满意度计算方式中满意率和满意度指数的区别

满意率和满意度指数是用于计算住宅物业满意度的两种不同方式&#xff0c;它们的区别如下&#xff1a; 1、满意率&#xff1a;满意率是通过计算满意的居民人数与总参与调查的居民人数之间的比例来衡量满意度。它以百分比形式表示&#xff0c;可以直观地了解居民对物业管理的整体…

集运系统如何多维度展现企业业务情况?

在集运行业&#xff0c;数据是企业决策的重要依据。为了在竞争中保持优势&#xff0c;企业需要一套高效、灵活且可靠的管理工具来应对市场的快速变化。易境通集运系统以其全面而精细的统计报表功能&#xff0c;成为企业决策优化和业务增长的重要助手。 易境通集运系统https://…

使用在AMD GPU上运行的ROCm进行大语言模型的自然语言处理任务

Performing natural language processing tasks with LLMs on ROCm running on AMD GPUs — ROCm Blogs 在这篇博客中&#xff0c;您将学习如何使用在AMD的Instinct GPU上运行的ROCm进行一系列流行且有用的自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;使用不同的大…

新手该如何选择与小程序定位相关的关键词

关键词的优化是提高小程序排名的关键步骤之一&#xff0c;所以如何选择与小程序定位相关的关键词是一个很重要的过程&#xff0c;需要考虑多个因素以确保关键词既符合小程序的业务特性&#xff0c;又能吸引目标用户。以下是一些具体的步骤和建议&#xff1a; 1. 深入了解小程序…

Go发布自定义包

1、初始化go.mod go mod init github.com/xumeng03/images2、编写包内容 这里只是一个简单的压缩jpg/jpeg图片例子&#xff0c;代码参考 https://github.com/disintegration/imaging 2.1、fs.go package imagesimport ("image""io""os""p…

Vue3中的defineExpose的认识

文章目录 defineExpose子组件父组件&#xff1a;总结&#xff1a; defineExpose 使用 <script setup> 的组件是默认关闭的——即通过模板引用或者 $parent 链获取到的组件的公开实例&#xff0c;** 不会 **暴露任何在 <script setup> 中声明的绑定。 可以通过 def…

OpenCV几何图像变换(10)透视变换函数warpPerspective()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 warpPerspective 函数使用指定的矩阵对源图像进行透视变换&#xff1a; dst ( x , y ) src ( M 11 x M 12 y M 13 M 31 x M 32 y M 33 , M…

必备工具:2024四大视频压缩神器推荐!

随着视频质量的不断提高&#xff0c;文件大小也变得越来越大&#xff0c;这给存储和分享带来了不小的挑战。今天&#xff0c;我们就来一起探索几款优秀的视频压缩工具&#xff01; 福昕视频压缩大师 直达链接&#xff1a;www.foxitsoftware.cn/shipinyasuo/ 福昕视频压缩大师…

两个月冲刺软考——SQL基础:排序、分组和聚合函数的实用指南

1.涉及到的部分基本语法 1.1 ORDER BY 与 GROUP BY ORDER BY用于对查询结果进行排序&#xff1b;默认是升序&#xff08;ASC&#xff09;&#xff0c;可以指定降序&#xff08;DESC&#xff09;。 GROUP BY用于将数据按照一个或多个列进行分组&#xff1b;通常与聚合函数&am…

长视频平台:谁都想成为「爆款制造机」

【潮汐商业评论/ 原创】 “今晚下班回家&#xff0c;我要先追优酷更新的《边水往事》&#xff0c;再补爱奇艺的《九部检察官》&#xff0c;还有腾讯视频新上线的脱口秀……”对于Chloe来说&#xff0c;没有什么比下班回家看剧更放松的。 “为了追这些剧&#xff0c;我最近把优…