当前位置: 首页 > news >正文

STM32单片机入门学习——第7节: [3-3] GPIO输入

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!

本文写于:2025.04.02

STM32开发板学习——第7节: [3-3] GPIO输入

  • 前言
  • 开发板说明
  • 引用
  • 解答和科普
  • 一、GPIO输入
  • 二、C语言知识
  • 问题
  • 总结

前言

   本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
   欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
   在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
   另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!

开发板说明

   本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
   原理图如下
1、开发板原理图
在这里插入图片描述
2、STM32F103C6和51对比
在这里插入图片描述
3、STM32F103C6核心板
在这里插入图片描述

视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。

下图是实物图
在这里插入图片描述

引用

【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)
在这里插入图片描述
数据手册

解答和科普

一、GPIO输入

在这里插入图片描述
在这里插入图片描述
这就是基本电路:N1就是传感器元件所代表的可变电阻,它的阻值可以根据环境的光线、温度等模拟量变化,上面这个R1,是和N1进行分压的定值电阻,R1和N1串联,一端接在VCC正极,一端接在GND负极。基本的分压电路。左边的电容是一个滤波电容,它是为了给中间的电压输出进行滤波的,用来滤除干扰,保证输出电压波形的平滑。
一般我们在电路中遇到这种一端接在电路上,另一端接地的电容,都可以考虑是不是滤波电容的作用。 如果是滤波电容的作用,那这个电容就是用来保证电路稳定的,并不是电路的主要框架,这时候我们在分析电路的时候可以把它去掉,分析更简单。
分析:N1阻值变小时,下拉作用就会增强,中间的AO端的电压就会拉低,极端情况下,N1阻值为0,AO输出被完全下拉,输出0V,当N1阻值变大,下拉作用就会减弱,中间的引脚由于R1的上拉作用,电压就会升高。极端情况下,N1阻值无穷大,相当于断路,输出电压被R1拉高至VCC。

AO这个输出端你可以把它想象成一个放在屋里的水平杆子,R1上拉电阻相当于拴在屋顶的弹簧,将杆子往上拉,N1下拉电阻相当于拴在地面的弹簧,将杆子往下拉,这个电阻的阻值越小,弹簧的拉力就越强,这个杆子的高度相当于输出电压。偏移多少取决于拉力之差。
如果上面的组织小,拉力强,那输出电压就会变高 ,反之下面的阻值小,输出电压就会变低,如果阻值为0,在电路中就是短接的状态,那就相当于拉力无穷大了,如果上下拉电阻都为0,就是两个无穷大的力在对抗,在电路中呈现的状态就是电源短路,所以这种情况应该避免。
在单片机经常出现 弱上拉,弱下拉,强上拉,强下拉,这里的强弱指的是电阻阻值的大小,也就是弹簧弹力的大小,上拉和下拉指的就是接到VCC还是GND,也就是这个杆子是拉向屋顶还是地面,最终的输出电压就是在弹簧拉扯下最终杆子的高低。
在这里插入图片描述
这就是AO电压的由来,仅需要两个电阻分压即可得到,还支持数字输出,这个数字输出就是对AO进行二值化的输出,这里二值化是通过芯片LM393来完成的,这个LM393是 一个电压比较器芯片,里面有两个独立的电压比较强电路,然后剩下的时VCC和GND供电,其他的就是运算放大器。
在这里插入图片描述
在这里插入图片描述
按键硬件电路:一般用下接,
1、当按键按下时,PA0被直接下拉到GND,此时读取PA0口的电压就是低电平,当按键松手时,PA0被悬空,悬空会出现什么情况呢,就是引脚的电压不确定对吧,所以在这种接发下,必须要求PA0是上拉输入的模式,否则就会出现引脚电压不确定的错误现象,所以当PA0是上拉输入模式,引脚再悬空,PA0就是高电平,所以这种方式下,按下按键,引脚为低电平,松手,引脚为高电平。

2、外部上拉电阻了,当按键松手时,引脚由于上拉作用,自然保持为高电平,当按键按下时,引脚直接接到GND,也就是无穷大的力把这个引脚往下拉,所以引脚为低电平,此时可以配置为浮空输入或者上拉输入。如果是上拉,就会更强一点,会更加的稳定。

3、这种要求PA0必须配置成下拉输入的模式,当按键按下时,引脚为高电平,松手时,引脚回到默认值低电平。

4、再外界一个下拉电阻,所以PA0配置为下拉输入模式或者浮空输入模式。
传感器电路:

二、C语言知识

在这里插入图片描述
unsigned char =uint8_t=u8;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
和宏定义的区别:
首先,宏定义的新名字在左边,typedef的新名字在右边;
宏定义不需要分号,typedef后面必须加分号;
宏定义任何名字都可以换,而typedef只能专门给变量类型换名字。
在这里插入图片描述
结构体也是一种数据类型,比如Char、short、int等,这些称为基本数据类型,然后数组就是一大堆基本数据类型的集合,
比如char a[10];就是10个char型数据的集合,那数组我们就可以称为组合数据类型,它是有许多基本数据类型组合而来的,数组组合只能是相同的数据,比如这个就是10个char型数据的组合。
如果我们相组合不同的数据类型该怎么办呢:
结构体:是一种组合数据类型,它的作用就是组合不同的数据类型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这些内容是一个结构体的数据类型,然后是typedef 将结构体换了个名字,叫做StructName_t

#include   <stdio.h>

//	typedef struct{char x;int y;float z;} StructName_t;
	typedef struct{
	char x;
	int y;
	float z;
	} StructName_t;
	
int main(void)
{
	StructName_t c;
	StructName_t d;
	
	c.x='A';
	c.y=66;
	c.z=3.14;
	printf("c.x= %c\n", c.x);
	printf("c.y= %d\n", c.y);
	printf("c.z= %f\n", c.z);
	printf("HELLO Word\n");
	return 0;
}

在这里插入图片描述
第一句,定义结构体类型的数据,数据名称叫GPIO_InitStructure,左边是结构体类型名称,
在这里插入图片描述
Struct包括花括号这里是结构体数据类型,然后用typedef将这个类型换了一个新名字,叫做GPIO_InitDef,和我们之前写的一样。
然后引用结构体成员;
在这里插入图片描述
这是因为,结构体是一种组合数据类型,在函数之间的数据传递中,通常用的是地址传递而不是值传递。
在这里插入图片描述
在这里插入图片描述
这里是用结构体指针来接受的,然后引用就可以用->.
打包和拆包。
在这里插入图片描述
比如星期八
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
也可以int a= ENABLE;
和宏定义差不多。

问题

总结

本节课主要是学习了,GPIO的输入,介绍了按键和传感器的原理和硬件电路,然后介绍了C语言的基本知识。结构体变量和枚举,定义的简写等。

http://www.dtcms.com/a/106763.html

相关文章:

  • 树莓派超全系列教程文档--(22)使用外部存储设备的相关操作
  • Spring Boot 集成Redis中 RedisTemplate 及相关操作接口对比与方法说明
  • #Linux内存管理# 假设设备上安装了一块2G的物理内存,在系统启动时,ARM Linux内核是如何映射的?
  • RAG 和 RAGFlow 学习笔记
  • 【VUE3】Pinia
  • ARM 性能分析工具:Streamline
  • 高并发内存池(二):Central Cache的实现
  • Java 进化之路:从 Java 8 到 Java 21 的重要新特性
  • 【爬虫基础】第三部分 爬虫请求库 1/4
  • Android 防抖和节流
  • 【Kafka基础】Kafka工作原理解析
  • 英语口语 -- 常用 1368 词汇
  • 206. 反转链表 92. 反转链表 II 25. K 个一组翻转链表
  • 店铺状态设置-03.功能测试
  • Kotlin问题汇总
  • AI:机器学习-线性回归
  • 边缘计算赋能淘宝API:分布式节点缓存降低高并发延迟
  • 风电行业预测性维护解决方案:AIoT驱动下的风机健康管理革命
  • 多模态RAG实践:如何高效对齐不同模态的Embedding空间?
  • arcgis10.8 Toolbox中的conversion tools没有to coverage工具?
  • 4. 理解Prompt Engineering:如何让模型听懂你的需求
  • 【Kafka基础】基础概念解析与消息队列对比
  • Redis如何在windows中简单安装?
  • 线性DP总结
  • Centos 8 安装教程(新手版)
  • element-ui自制树形穿梭框
  • python操作es
  • 机器学习的一百个概念(8)插补法
  • LeetCode hot 100—最长递增子序列
  • PyQt5界面设计