GPIO端口的使用

目录

一. 前言

二. APB2外设时钟使能寄存器

三. GPIO端口的描述

四. GPIO端口使用案例


一. 前言

        基于库函数的开发方式就是使用ST官方提供的封装好的函数。而如果没有添加库函数,那就是基于寄存器的开发方式,这种方式一般不是很推荐。因为由于ST对寄存器封装的比较好,所以使用库函数的方法,既能满足对寄存器的配置,对开发人员也比较友好,有利于提高开发效率。

并且提一下,我们所讲的都是以STM32F10单片机系列作为案例来讲的。

今天我们所讲的GPIO都是APB2的外设,所谓APB2也就是桥接1。

二. APB2外设时钟使能寄存器

        因为我们GPIO都是APB2的外设,并且要想使用我们的STM32单片机,就都得先开时钟,这是为了降低能耗。这在我关于深入了解STM32单片机博客中也有提到的。

APB2外设复位寄存器也就是RCC_APB2ENR。我们通过查询手册就可以得到如下信息:

举个例子,当我们想开启GPIOC端口的时候,我们就可以这样设置:

RCC_APB2ENR=0x00000010;

这样就开启了GPIOC的时钟使能。因为我们这里总共有32位,用16进制表示就有8个数字,而GPIOC的位置在倒数第二个数,并且它的值为1。学会查看并使用STM32手册对于我们来说是非常重要的,我们都需要具备这种能力。

由于我们的GPIO口用不到APB1外设时钟使能寄存器,这里我就不介绍了,想了解的小伙伴可以去查询下STM32F10xxx参考手册。

三. GPIO端口的描述

        每个GPIO端口都有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。

关于以上函数的使用说明,我们都可以使用手册来查询,如下所示:

我们只需要在上面书签查找处输入我们想要查询的内容,就可以得到相关使用说明了。大家慢慢培养这个习惯,就会使用芯片参考手册了。

 这里还需要讲下GPIO端口的八种输入输出模式,在输出模式下可控制端口输出高低电平,用以驱动LED,控制蜂鸣器,模拟通信协议输出时序等。在输入模式下则可读取端口的高低电平或电压,用于读取按键输入,外接模块电平信号输入,ADC电压采集,模拟通信协议接受数据等。

八种输入输出模式如下所示:

  1. 浮空输入:可读取引脚电平,若引脚悬空,则电平不确定。
  2. 上拉输入:可读取引脚电平,内部连接上拉电阻,悬空时默认高电平。
  3. 下拉输入:可读取引脚电平,内部连接下拉电阻,悬空时默认低电平。
  4. 模拟输入:GPIO无效,引脚直接接入内部ADC。
  5. 开漏输出:可输出引脚电平,高电平为高阻态,低电平接VSS
  6. 推挽输出:可输出引脚电平,高电平接VDD,低电平接VSS
  7. 复用开漏输出:由片上外设控制,高电平为高阻态,低电平接VSS
  8. 复用推挽输出:由片上外设控制,高电平接VDD,低电平接VSS

 值得注意的是,一个端口只能有一个输出,但可以有多个输入,也就是说为输入模式时,输出模式无效。

提到GPIO的描述,就不得不提及GPIO的位结构了,关于GPIO详细的位结构,感兴趣的小伙伴可自行在网上查找,很容易找到的。这里我主要讲下几个难以让人理解的。在GPIO位结构中,接了两个保护二极管,这个是对输入电压进行限幅的。

其中施密特触发器的作用就是对输入电压进行整形的,它的执行逻辑是,如果输入电压大于某一阈值,输出就会瞬间升为高电平。反之则相反。并且对于施密特触发器来说,只有高于上限或者低于下限,输出才会变化。

其中的MOS管就是一种电子开关,我们的信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS。

四. GPIO端口使用案例

        为了方便大家理解,我们这里举两个使用GPIO端口的示例。分别是LED流水灯和蜂鸣器的使用。

这里简单介绍下这两种东西,LED就是一种发光二极管,正向通电点亮,反向通电不亮。

蜂鸣器有两种,一种是有源蜂鸣器,另外一种则就是无源蜂鸣器。其中有源蜂鸣器就是内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定。无源蜂鸣器则是内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。

由于要使用到GPIO口,并且使用的是库函数的开发方式,所以就不得不提下关于GPIO口的几个常用库函数了。这里简要介绍下,给大家留个印象,如果想深入了解,可以查询手册。

首先是GPIO_DeInit()函数,是用来复位GPIO外设的。

GPIO_ResetBits()函数和GPIO_SetBits()函数是用来设置端口状态和初值的。

GPIO_WriteBit()和GPIO_Write()两个函数作用跟上面两个函数差不多。在使用时,可点击鼠标右键来查看函数参数该如何设置。

看到这里,不知道大家有没有注意到GPIO_ResetBits()等函数后面都有一个s,代表可以同时设置多个端口的状态。

下面我们来看下LED流水灯实现代码:

#include "stm32f10x.h"                  // Device header
#include "delay.h"
int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);while(1){ //LED流水灯闪烁代码GPIO_Write(GPIOA,~0x0001);	//0000 0000 0000 0001Delay_ms(100);GPIO_Write(GPIOA,~0x0002);  //0000 0000 0000 0010Delay_ms(100);GPIO_Write(GPIOA,~0x0004);	//0000 0000 0000 0100Delay_ms(100);GPIO_Write(GPIOA,~0x0008);	//0000 0000 0000 1000Delay_ms(100);GPIO_Write(GPIOA,~0x0010);	//0000 0000 0001 0000Delay_ms(100);GPIO_Write(GPIOA,~0x0021);	//0000 0000 0010 0000Delay_ms(100);GPIO_Write(GPIOA,~0x0041);	//0000 0000 0100 0000Delay_ms(100);GPIO_Write(GPIOA,~0x0081);	//0000 0000 1000 0000Delay_ms(100);}}

下面我们再来看下实际效果:

 

下面我们再来看下关于蜂鸣器的相关源代码:

#include "stm32f10x.h"                  // Device header
#include "delay.h"
int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);while(1){ GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(700);}
}

 

至于关于STM32F10参考手册,我已经放在了百度网盘中,如下:

 链接:https://pan.baidu.com/s/1zrtAtLYEEnBNZ1QsuvvdNQ 
提取码:3wjv

 

        

        

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

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

相关文章

docker pull 超时的问题如何解决

docker不能使用&#xff0c;使用之前的阿里云镜像失败。。。 搜了各种解决方法&#xff0c;感谢B站UP主 <iframe src"//player.bilibili.com/player.html?isOutsidetrue&aid113173361331402&bvidBV1KstBeEEQR&cid25942297878&p1" scrolling"…

维护左边枚举右边

前言&#xff1a;一开始遇到这个题目的时候没啥思路&#xff0c;但是当我看到值域在1000的时候我想着直接暴力从右边枚举不就行了吗&#xff0c;时间复杂度刚刚好&#xff0c;试一下就过了 正解应该是啥呢&#xff0c;其实也是维护一遍&#xff0c;运行另外一边 O ( n ) O(n)…

所有测试人,下半年的新方向(大模型),赢麻了!!!

现在做测试&#xff0c;真的挺累的。 现在测试越来越难做&#xff0c;晋升困难&#xff0c;工资迟迟不涨……公司裁员&#xff0c;测试首当其冲&#xff01;&#xff01; 做测试几年了&#xff0c;还没升职&#xff0c;就先到了“职业天花板”。 想凭工作几年积累的经验&…

Linux进程:fork函数深度剖析

目录 一、初识fork函数 二、fork函数的返回值 三、fork之后&#xff0c;父子进程谁先运行 四、fork的使用示例 一、初识fork函数 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 进程调用fork…

Apache POI快速入门

介绍 Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI都是用于操作 Excel 文件。 Apache POI的主要组件包括&#xff1a; HS…

监控易监测对象及指标之:全面监控Sybase_New数据库

随着企业数据量的不断增长和业务的复杂化&#xff0c;数据库的稳定性和性能成为了保障业务连续性的关键因素。Sybase_New数据库作为众多企业选择的数据管理解决方案&#xff0c;其稳定性和性能对于企业的运营至关重要。 为了确保Sybase_New数据库的稳定运行和高效性能&#xff…

单体到微服务架构服务演化过程

架构服务化 聊聊从单体到微服务架构服务演化过程 单体分层架构 在 Web 应用程序发展的早期&#xff0c;大部分工程是将所有的服务端功能模块打包到单个巨石型&#xff08;Monolith&#xff09;应用中&#xff0c;譬如很多企业的 Java 应用程序打包为 war 包&#xff0c;最终会形…

基于vue框架的刺梨销售管理系统pgl49(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,刺梨分类,刺梨产品,刺梨新闻 开题报告内容 基于Vue框架的刺梨销售管理系统开题报告 一、引言 随着现代农业的快速发展和消费者对健康食品需求的日益增长&#xff0c;刺梨这一富含营养价值的水果逐渐受到市场的青睐。然而&#x…

学习Python的难点分析

一、语法灵活性带来的困惑 缩进规则 Python使用缩进来表示代码块&#xff0c;而不是像其他编程语言&#xff08;如C或Java&#xff09;使用大括号。这虽然使代码看起来简洁&#xff0c;但对于初学者来说可能会造成困扰。例如&#xff1a; if True:print("This is insid…

网站建设中,营销型网站与普通网站有什么区别

营销型网站与普通网站在建站目的、交互设计以及结构优化等方面存在区别。以下是具体分析&#xff1a; 建站目的 营销型网站&#xff1a;以销售和转化为主要目标&#xff0c;通过专业的市场分析和策划来吸引潜在客户&#xff0c;并促使其采取购买行动。普通网站&#xff1a;通常…

零基础学Servlet

零基础学Servlet 一。介绍&#xff1a; servlet是一种比较古老的编写网站的方式&#xff0c;在2010年之前比较流行&#xff0c;在此之后&#xff0c;有一堆大佬创造了Spring&#xff08;一种框架&#xff09;&#xff0c;Spring是针对Servlet进行进一步封装&#xff0c;从而让…

OpenSource - 开源日历库tui.calendar

文章目录 强大且灵活的开源日历库推荐&#xff1a;tui.calendar多视图支持&#xff1a; Monthly, Weekly, Daily and Various View Types支持拖拽: Dragging and Resizing a Schedule事件管理支持多语言集成与扩展高度定制化其他功能地址总结 强大且灵活的开源日历库推荐&#…

关于Chrome浏览器F12调试,显示未连接到互联网的问题

情况说明 最近笔者更新下电脑的Chrome浏览器&#xff0c;在调试前端代码的时候&#xff0c;遇到下面一个情况&#xff1a; 发现打开调试面板后&#xff0c;页面上显示未连接到互联网&#xff0c;但实际电脑网络是没有问题的&#xff0c;关闭调试面板后&#xff0c;网页又能正…

防砸安全鞋这样挑,舒适又安心!

在复杂多变的工作环境中&#xff0c;安全始终放在首位&#xff0c;特别是对于那些在工地、车间等危险环境中工作的朋友们来说&#xff0c;一双好的防砸安全鞋无疑是工作中的“守护神”。然而&#xff0c;市面上的防砸安全鞋种类繁多&#xff0c;如何挑选一双既舒适又安心的鞋子…

汇川技术即将在工博会发布类博途全集成自动化平台,德国研发中心功不可没,投资数亿打造工业利器

在即将拉开帷幕的9月中国工博会上&#xff0c;汇川技术将向世界展示其自主研发的全新成果——IFA&#xff0c;一个全集成、全场景覆盖的工厂自动化软件平台。这一平台的发布&#xff0c;不仅标志着汇川技术在工业自动化领域的又一里程碑式突破&#xff0c;更彰显了其与国际工业…

VS code Jupyter notebook 导入文件目录问题

VS code Jupyter notebook 导入文件目录问题 引言正文引言 这几天被 VS code 中 Jupyter Notebook 中的文件导入折磨的死去活来。这里特来说明一下放置于不同文件夹下的模块该如何被导入。 正文 首先,我们需要按下 Ctrl + , 键打开设置,然后搜索 notebook file root。在如…

五.海量数据实时分析-FlinkCDC+DorisConnector实现数据的全量增量同步

前言 前面四篇文字都在学习Doris的理论知识&#xff0c;也是比较枯燥&#xff0c;当然Doris的理论知识还很多&#xff0c;我们后面慢慢学&#xff0c;本篇文章我们尝试使用SpringBoot来整合Doris完成基本的CRUD。 由于 Doris 高度兼容 Mysql 协议&#xff0c;两者在 SQL 语法…

G2O (General Graph Optimization)

前言 以高翔的《视觉SLAM14讲》中的 g2o 拟合曲线为例&#xff0c;讲解 g2o 的使用。源文件为 g2oCurveFitting.cpp。 #include <iostream> #include <g2o/core/g2o_core_api.h> #include <g2o/core/base_vertex.h> #include <g2o/core/base_unary_edge.…

一文读懂:监督式微调(SFT)

监督式微调 (Supervised fine-tuning)&#xff0c;也就是SFT&#xff0c;就是拿一个已经学了不少东西的大型语言模型&#xff0c;然后用一些特定的、已经标记好的数据来教它怎么更好地完成某个特定的任务。就好比你已经学会了做饭&#xff0c;但是要特别学会怎么做川菜&#xf…