0302GPIO外设输入功能

GPIO外设输入功能

  • 输入部分硬件电路
    • 按键简介
    • 传感器模块简介
    • 按键和传感器模块的硬件电路
  • C语言的学习
    • C语言数据类型
    • 宏定义
    • typedef
    • 结构体
    • 枚举
    • C语言知识总结
  • 按键控制LED灯&光敏传感器蜂鸣器
  • GPIO总结
    • GPIO使用方法总结
    • 模块化编程的方法:

两个程序:按键控制LED,光敏传感器控制LED灯

GPIO输入部分直接从外部硬件设备开始

C语言的相关知识点
C语言的数据类型、宏定义、typedef、结构体和枚举 知识点,是库函数里经常出现的东西,了解这些有利于对库函数的执行逻辑更加清晰明了。C语言的if else、加减乘除最基本的可以自学我的C++部分
同时C语言的指针。对于指针的含义和方法,这是需要熟练掌握的

输入部分硬件电路

按键简介

在这里插入图片描述

抖动通常在5-10ms之间,人分辨不出来,但对于高速运行的单片机而言,这就漫长了。所以要对抖动进行过滤,否则会出现按键按一下,单片机反映了多次的现象。按键松手时也会有一段抖动。
最简单的方法是软件加一段延时,把抖动时间耗过去

传感器模块简介

在这里插入图片描述
这些传感器都是利用传感器元件,
比如光线越强,光敏电阻的阻值越小
温度越高,热敏电阻的阻值越小
红外光线越强,红外接收管的阻值越小。但是电阻的变化不易被直接观察,所以一般通过分压来输出

N1代表可变电阻(相对于各传感器,可以对应为光敏电阻、热敏电阻、红外接收管)
上下拉电阻在单片机中经常出现,弱上拉、弱下拉、强上拉、强下拉。这里强弱指的是电阻阻值的大小,弱上拉的电阻阻值大,驱动能力弱一点,上拉下拉指接到VCC、GND。

分到的模拟电压表示强度,
二值化比较通常用于检测通断,所以IN+阈值不需要过多的调整

按键和传感器模块的硬件电路

在这里插入图片描述
下接按键的方式(常用下接方式,这是电路设计的习惯和规范),上接按键的方式
第一个图最常用的按键接法(需要上拉输入的模式,默认高电平,否则会出现引脚电压不确定的错误现象)
第二个图外部接了上拉电阻(可以配置成浮空输入或者上拉输入,如果是上拉输入,那就是内外两个上拉电阻共同作用,这时高电平更强一些,对应的高电平更加稳定,但当引脚被强行拉低时,损耗也会大一些)
第三个图(需单片机引脚可以配置成下拉输入模式,一般的单片机可能不一定有下拉输入模式,所以用的不多)
第四个图(下拉输入模式或者浮空输入模式)

C语言的学习

C语言数据类型

在这里插入图片描述

在51单片机中int是16位的,而在STM32单片机中,int是32位的。和51的不同之处,不要弄混了

右边是C语言的stdint.h文件和ST对这些变量的重命名。因为左边的名字比较长,而且int的位数根据系统的不同还有可能不一样,还有char本义字符型意思,按名字来说应该存放字符,但是我们用单片机来存放整数而不是字符。
综合以上原因,C语言和ST就给这些变量换了个名字。C语言提供的有stdint.h这个头文件,使用了新的名字
int8_t就是char的新名字,表示意思就是8位整数数据。
-t表示这个用typedef重名命名的变量类型,
unsigned char 的新名字就是uint8_t,意思是无符号8位整型数据

代表的就是前面的数据类型,只是换了一个名字而已。
在这里插入图片描述

s8、u8、s16 、u16、就是ST库函数以前用的名字
在这里插入图片描述
新版库函数仍然支持这些写法,明确了这是库函数老的类型,是为了传统目的保留的(兼容老版本)
在这里插入图片描述

推荐使用stdint关键字的定义,因为是新版库函数使用的方式,也是C语言stdint.h头文件提供的官方定义

宏定义

在这里插入图片描述
此处就是用ABC 直接替代 12345
如:#define GPIO_Pin_10 ((uint16_t)0x0400)
GPIO_Pin_10 替换的就是 ((uint16_t)0x0400),加了强制类型转换,是为了严谨性考虑的,目前我们暂时不用管。这里0x0400表示第10号口,但这不方便理解,所以用宏定义将10号口改一下名字,叫GPIO_Pin_10。
宏定义除了替换之外,还有其他的用法,可以后期再学。

typedef

在这里插入图片描述
用途和宏定义差不多,
区别:宏定义的新的名字在左边,typedef的新名字在右边。(原来的名字也可以用)
宏定义不需要分号,typedef后面必须加分号。
宏定义任何名字都可以换,而typedef只能专门给变量类型换名字
所以宏定义的改名范围更宽,只不过对于变量类型重命名而言,使用typedef更加安全。
宏定义无脑改名,typedef会对命名进行检查,如果不是变量类型的名字,就报错

结构体

在这里插入图片描述
组合数据类型,一大堆基本数据类型的集合,数组只能组合相同类型的数据,想组合不同类型的数据就用结构体

变量就是定义数据和引用数据的
所以struct 要{}来打包变量,此处就是定义一个结构体变量StructName,包含了char 型的x,int型的y,float型的z

定义数据:
int a; 定义一个int型数据叫a,
int b[5]; 定义一个5个int型数据的数组
struct c; 定义一个结构体类型,叫c
但是既然是不同类型的数组组合,就需要告诉编译器是哪些数据的组合,所以还得加一个附加说明,告诉它是哪些数据,在struct后面加一个花括号,要打包哪些变量
struct{char x;int y;float z;} c; 这才是结构体的完整定义
定义一个结构体变量,名字叫c,其中包含了char 型的x,int型的y,float型的z3个子项

引用数据:
a=66;
b[0]=66; 数组名b加上方括号取索引,比如第0个元素等于66,
引用c 需要用结构体的名字c,然后用.运算符取索引,索引不是0,1,2,3,4,5了,而是结构体子项的名字,比如c.x=‘A’; c.y=66; c.z=3.14;
结构体成员多,一般会换行来写。

结构体的特殊用法
如果每次定义都写 struct{char x;int y;float z;} 这么一大串,那就麻烦,所以typedef的作用就出来了
typedef struct{char x;int y;float z;} StructName; 用StructName来替换前面的一长串,看上去就简单多了。

另一种引用方式:
pStructName->x=‘A’; pStructName是结构体的首地址,也就是结构体指针,加上->运算符,再加结构体成员名

加结构体指针的引用方式的原因:结构体是一种组合数据类型,在函数的数据传递过程中,通常用地址传递而不是值传递(地址传递、值传递在指针讨论 用法和利弊)

在这里插入图片描述
比如这个地方,结构体变量在传给GPIO_Init函数时,传递的是结构体的指针

在这里插入图片描述
对应GPIO_Init函数用结构体指针来接收,里面再引用结构体成员的时候,就可以使用->这个符号来引用
也可以用*号引出指针变量的内容,再用.点来引用结构体也是可以的,只不过用->这个运算符号更加方便
在这里插入图片描述
这个结构体就是一个数据打包的过程,首先将参数写到结构体的这3个变量里,然后统一打包,将结构体传递到函数里,函数里面再把这个结构体拆包出来,读取变量。这就是使用结构体的过程。(当需要参数很多时不方便管理就需要结构体了)

枚举

在这里插入图片描述
比如定义一个变量存储星期的值,那理论上取值是1-7,如果定义的整形变量,那变量任意存什么数都行,不会收到限制,这时可能出现数据不合法。比如星期8的出现,如果需要程序更加安全,就可以定义一个取值受限制的整形变量:枚举

也可以当成宏定义的集合:

定义和结构体差不多,这里是enum,然后是变量名字,中间是花括号,但注意里面是逗号,隔开
这样可以限制变量的取值范围,只能取花括号里面的定值。
另外,里面的定义,如果按照顺序累加的,那后面的幅值可以省略,编译器会自动添加上去。
同时也可以用typedef改一下名

比如:
typedef enum{
MONDAY=1,
TUESDAY,
WEDNESDAY
} week_t;

week_t week;
week MONDAY; //week = 1;
week = 8; //就会编译器报警:枚举里混入了其他变量

int a=MONDAY; //这样的用法和宏定义就差不多了,所以说枚举也是一个宏定义的集合,就是这个意思。

C语言知识总结

实际都不是C语言最根本的语法,没有这些东西照样可以完成功能,这些创造出来是为了更好地管理工程。虽然表面上多此一举,但是工程复杂起来后,使用这些知识可以使编程更加快捷、更容易理解,更不容易出错。

按键控制LED灯&光敏传感器蜂鸣器

对于驱动代码而言,一般都会封装起来,单独放在另外的.c和.h文件里。(模块化编程的方式)
led.c文件存放驱动程序的主体代码,led.h用来存放驱动程序可以对外提供的函数或变量的声明
在这里插入图片描述
led.c的第一行,需要添加 stm32f10x.h文件
led.h要添加一个防止头文件重复包含的代码
在这里插入图片描述
这里面的函数代码思想值得学习。这8个函数都值得学习
在编写代码时,如果不显示代码提示的话,可以按一下快捷键ctrl+Alt+空格,这样就可以弹出代码提示框了
在主函数里面,代码变得更加简介,初始化就是初始化,开灯就是开灯,关灯就是关灯,不需要再管底层的各种参数了。这就是模块化编程的好处。

在这里插入图片描述
GPIO_ReadInputDataBit 读取输入数据寄存器某一个端口的输入值的 参数:GPIOx,GPIO_Pin 用来指定某一个端口,返回值是uint8_t,代表这个端口的高低电平
GPIO_ReadInputData 读取整个输入数据寄存器的 参数GPIOx 用来指定外设,返回值uint16_t,是16位的数据,每一位代表一个端口值
GPIO_ReadOutputDataBit 读取输出数据寄存器某一个端口的输入值的 参数:GPIOx,GPIO_Pin 用来指定某一个端口,返回值是uint8_t,代表这个端口的高低电平(原则上来说,并不是用来读取端口的输入数据的,一般用于输出模式下,用来看一下自己的输出是什么)
GPIO_ReadOutputData 读取整个输出数据寄存器的
下面是读取的对应关系
在这里插入图片描述

在这里插入图片描述

变量全局变量,局部变量,定义域不一样。名称相同但是强龙不压地头蛇。

函数写好后,尽量在函数上方加一些注释,说明函数的用途,参数的取值和返回值的意思。时间久了自己看起来也知道,别人看也容易理解。

GPIO总结

GPIO使用方法总结

首先初始化时钟,然后定义结构体,赋值结构体,
GPIO_MODE 可以选择8中输入输出模式
GPIO_Pin 可以选择引脚,可以用按位或的方式同时选中多个引脚
GPIO_Speed 选择输出速度,要求不高的话直接使用50MHz即可
最后使用GPIO_Init函数,将指定的GPIO外设初始化好

然后是8个读取和写入的函数,读写主要用这些函数即可。
在这里插入图片描述

模块化编程的方法:

自己做产品外围硬件比较多,这时候就尽量把每个硬件的驱动函数单独提取出来,封装在.c和.h文件里,这样有利于简化主函数的逻辑。主函数里面有更重要的任务要完成,不要让驱动函数混在主函数里面。另外把硬件驱动提取出来,也有利于我们移植程序,还有利于进行分工合作,比如让别人来写驱动函数。主要的精力就可以集中在主函数的逻辑上了。
最后既然要做封装,函数的注释就要写清楚,这样方柏霓使用这个模块的人快速上手这些函数。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

前端图表库G2快速上手

文档地址&#xff1a; https://g2-v3.antv.vision/zh/docs/manual/getting-started/ https://g2.antv.antgroup.com/ 安装&#xff1a; pnpm i antv/g2在vue3中使用&#xff1a; <script setup> import {Chart} from antv/g2; import {onMounted} from "vue"…

系统架构师考点--信息系统基础知识

大家好。今天我们来总结一下信息系统基础知识的相关考点&#xff0c;每年都会考&#xff0c;一般是在上午场选择题中&#xff0c;占3分左右&#xff0c;其次下午场论文也有可能会出相关的考题。 一、信息系统概述 信息系统&#xff1a; 是由计算机硬件、网络和通信设备、计算…

鸿蒙语言基础类库:【@ohos.util.Deque (线性容器Deque)】

线性容器Deque 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 Deque&#xff08;double ended queue&#xff09;根据循环队列的数据结构实现&#xff0c;符合先进先出以及先进后出的特点&…

ESP32的I2S引脚及支持的音频标准使用说明

ESP32 I2S 接口 ESP32 有 2 个标准 I2S 接口。这 2 个接口可以以主机或从机模式&#xff0c;在全双工或半双工模式下工作&#xff0c;并且可被配置为 8/16/32/48/64-bit 的输入输出通道&#xff0c;支持频率从 10 kHz 到 40 MHz 的 BCK 时钟。当 1 个或 2 个 被配置为主机模式…

nvm安装报错(镜像问题)

一、问题报错 安装的时候如果跟着网上早些时候的配置&#xff0c;调整了setting文件&#xff0c;配置镜像的话&#xff0c;可能报这个错误。 这个是因为他没检索到后面的链接地址&#xff0c;因为镜像的地址新的已经更换了。使用这个吧&#xff1a; node_mirror: https://npm…

华为、H3C、锐捷、思科四大设备厂商交换机配置命令总结合辑

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 一直以来&#xff0c;对于华为、H3C、锐捷、思科交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;四…

解决本地操作云服务器上的Redis

方案一&#xff1a;开放Redis默认端口&#xff0c;本地通过公网IP端口号的形式访问。 方案二&#xff1a;每次将本地编写好的Java代码打包&#xff0c;放在云服务器上运行。 方案三&#xff1a;配置ssh端口转发&#xff0c;把云服务器的redis端口&#xff0c;映射到本地主机。 …

如何构建数据驱动的企业?爬虫管理平台是关键桥梁吗?

一、数据驱动时代&#xff1a;为何选择爬虫管理平台&#xff1f; 在信息爆炸的今天&#xff0c;数据驱动已成为企业发展的核心战略之一。爬虫管理平台&#xff0c;作为数据采集的第一站&#xff0c;它的重要性不言而喻。这类平台通过自动化手段&#xff0c;从互联网的各个角落…

CentOS 7:停止更新后如何下载软件?

引言 CentOS 7 是一个广受欢迎的 Linux 发行版&#xff0c;它为企业和开发者提供了一个稳定、安全、且免费的操作系统环境。然而&#xff0c;随着时间的推移&#xff0c;CentOS 7 的官方支持已经进入了维护阶段&#xff0c;这意味着它将不再收到常规的更新和新功能&#xff0c;…

Spring Boot集成grpc快速入门demo

1.什么是GRPC&#xff1f; gRPC 是一个高性能、开源、通用的RPC框架&#xff0c;由Google推出&#xff0c;基于HTTP2协议标准设计开发&#xff0c;默认采用Protocol Buffers数据序列化协议&#xff0c;支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务&#xff0c…

随笔(一)

1.即时通信软件原理&#xff08;发展&#xff09; 即时通信软件实现原理_即时通讯原理-CSDN博客 笔记&#xff1a; 2.泛洪算法&#xff1a; 算法介绍 | 泛洪算法&#xff08;Flood fill Algorithm&#xff09;-CSDN博客 漫水填充算法实现最常见有四邻域像素填充法&#xf…

ChatGPT提问提示指南PDF下载经典分享推荐书籍

ChatGPT提问提示指南PDF&#xff0c;在本书的帮助下&#xff0c;您将学习到如何有效地向 ChatGPT 提出问题&#xff0c;以获得更准确和有用的回答。我们希望这本书能够为您提供实用的指南和策略&#xff0c;帮助您更好地与 ChatGPT 交互。 ChatGPT提问提示指南PDF下载 无论您是…

ESLint: Delete `␍`(prettier/prettier)解决问题补充

如果你是克隆的&#xff0c;参考这位大佬的文章 vue.js - Delete ␍eslint(prettier/prettier) 错误的解决方案 - 个人文章 - SegmentFault 思否 如果你是个人在本地实现&#xff0c;且改为 仍旧报错&#xff0c;我解决的方案&#xff1a; 改为&#xff0c;同时勾选和我配置一…

【WebGIS平台】传统聚落建筑科普数字化建模平台

基于上述概括出建筑单体的特征部件&#xff0c;本文利用互联网、三维建模和地理信息等技术设计了基于浏览器/服务器&#xff08;B/S&#xff09;的传统聚落建筑科普数字化平台。该平台不仅实现了对传统聚落建筑风貌从基础到复杂的数字化再现&#xff0c;允许用户轻松在线构建从…

C++|异常

目录 一、异常概念 二、异常使用 2.1异常的抛出与捕获 2.2异常的重新抛出 2.3异常安全注意事项 2.4异常规范 三、自定义异常体系 四、C标准库的异常体系 五、异常的优缺点 对于传统的错误处理机制&#xff0c;例如c语言常用的&#xff1a; 1.assert&#xff0c;捕获到…

虚拟内存【Linux】

虚拟内存 为什么需要虚拟内存Linux虚拟内存的结构32位系统下的虚拟地址空间64位系统下的虚拟地址空间页表多级页表TLB 流程虚拟内存的作用 为什么需要虚拟内存 为了在进行多进程编码进行内存访问的时候保持内存的隔离性&#xff0c;数据安全性&#xff0c;所以出现了虚拟内存。…

Linux | 安装lb-toolkits 1.2.4库

Linux | 安装 lb-toolkits 最近又需要下载葵花的数据&#xff0c;之前分享过一次代码。今天发现之前的环境不小心被我删了&#xff0c;而运行相关的代码需要安装lb-toolkits这个库&#xff0c;今天正好记录了一下安装lb-toolkits的过程。 这里安装的版本是1.2.4&#xff0c;别…

EPSON LQ80KF II驱动 打印机 0x00000003e3

1.添加打印机 2.按名次选择共享打印机,输入共享打印机ip 3.选择创建新端口 4.选择打印机驱动

办公助手推荐✨

办公助手来啦&#xff01;✨ 办公助手来啦&#xff01;✨&#x1f31f; 主要亮点&#x1f4dd; 全新PDF编辑器&#x1f3a8; 丰富的幻灯片版式&#x1f30d; 改进的从右至左显示&#x1f310; 新增本地化选项 &#x1f4ca; 应用场景在线办公套件&#x1f4f1; 多平台支持&…

如何学好C++?

首先&#xff0c;对于零基础的想学习C的同学&#xff0c;我想要你们先明白一件事&#xff1a;C是一门极为复杂且难以掌握的编程语言。因此推荐在学习C之前可以先去学习C语言&#xff0c;在拥有了一定的知识储备和编程能力后再学习C会更加的高效和相对轻松。 下面推荐从三个方面…