[GPIO篇 --GPIO输出]《STM32从零开始:点亮一个LED灯》

目录

一、引言

二、知识储备

1、GPIO简介

2、GPIO的几种输入输出配置模式

3、LED简介

三、正文

1、硬件准备

2、软件准备

3、工程实现

1、工程创建

2、代码编写

4、调试与验证

四、参考资料


一、引言

    本文将带你从零开始学习STM32的GPIO配置与使用,适合初学者。我们将通过一个简单的LED闪烁示例,讲解如何配置GPIO引脚并编写驱动代码程序。

    本人正在学习江科大STM32课程,本博作为本人的学习笔记,有错误还请指正,共同学习进步,谢谢~

二、知识储备

1、GPIO简介

    GPIO(General Purpose Input Output)是通用输入输出口 ,可配置为8种输入输出模式 ,在输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 ,在输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。

2、GPIO的几种输入输出配置模式

    上图中的GPIO位结构图中,红色框住的上半部分是GPIO的输入部的内部结构,下半部分则是输出部分的内部结构。

    保护二极管的主要作用是对GPIO内部电路进行保护作用,限制了我们的GPIO引脚的输入输出电压范围必须控制在VSS和VDD之间,当GPIO电压大于VDD,上面的二极管导通,电流不会流入内部电路,当GPIO电压小于VSS,下面的二极管导通,不会向电路内部汲取电流,只有当GPIO的电压在VSS和VDD之间,上下二极管才会都不导通,此时内部电路才会正常工作。

    施密特触发器:目的是确保输入内部寄存器的数据为CPU可以识别的数字信号(0和1),输入信号由于各种原因可能会产生波动,当输入超过施密特触发器的上限阈值则为高电平,当输入低于施密特触发器的下限阈值则为低电平

    对于浮空输入:上拉电阻和下拉电阻均处于未导通状态,这时候输入处于高阻态,极易收到外部环境因素的影响。因此在浮空输入时,端口一定要接上一个连续的驱动源,不能出现浮空的状态。

    对于上拉输入:上拉电阻导通,下拉电阻未导通,此时电路默认输入高电平,注意这里的上拉电阻的阻值一般较大,起到个弱上拉的作用

    对于下拉输入:上拉电阻未导通,下拉电阻导通,此时电路默认输入低电平,注意这里的下拉电阻的阻值一般较大,起到个弱下拉的作用

    对于模拟输入:此时GPIO的输入信号跳过施密特触发器直接通向STM32内部ADC,进行模拟量的采集与转换

    输出部分可以由 输出数据寄存器或片上外设控制,两种控制方式通过这个数据选择器接到了输出控制部分。如果选择通过输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口了。

    对于推挽输出:在推挽输出模式下,P-MOS和N-MOS均有效,数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平,数据寄存器为0时,上管断开,下管导通,输出直接接到VSS,就是输出低电平,这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式也可以叫强推输出模式。在推挽输出模式下,STM32对IO口具有绝对的控制权,高低电平都由STM32说的算。

    对于开漏输出:在开漏输出模式下,这个P-MOS是无效的,只有N-MOS在工作,数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式;数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平;这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的。开漏模式一般可以作为通信协议的驱动方式,比如I2C通信的引脚,就是使用的开漏模式,在多机通信的情况下,这个模式可以避免各个设备的相互干扰,另外开漏模式还可以用于输出5V的电平信号。比如在I0口外接一个上拉电阻到5V的电源,当输出低电平时,由内部的N-MOS直接接VSS,当输出高电平时,由外部的上拉电阻拉高至5V,这样就可以输出5V的电平信号,用于兼容一些5V电平的设备,这就是开漏输出的主要用途。

    对于复用开漏输出:和普通的开漏输出没有太大区别,唯一区别就是输出控制权交由片上外设来控制

    对于复用推挽输出:和普通的推挽输出没有太大区别,唯一区别就是输出控制权交由片上外设来控制

    注意在输入模式下输出部分是无效的,但是在输出模式下输入部分是有效的,这是因为一个端口只能有一个输出,但是可以有多个输入。

   GPI_ANAOG_IN                          // 模拟输入
   GPI_FLOATING_IN                     // 浮空输入
   GPI_PULL_DOWN                     // 下拉输入
   GPI_PULL_UP                           // 上拉输入
        
    GPO_PUSH_PULL                   // 推挽输出
    GPO_OPEN_DTAIN                 // 开漏输出
    GPO_AF_PUSH_PULL            // 复用推挽输出
    GPO_AF_OPEN_DTAIN          // 复用开漏输出

  GPIO_Mode_AIN 
  GPIO_Mode_IN_FLOATING
  GPIO_Mode_IPU 
  GPIO_Mode_Out_OD 
  GPIO_Mode_Out_PP 
  GPIO_Mode_AF_OD
  GPIO_Mode_AF_PP 

3、LED简介

    LED即发光二极管,正向通电点亮,反向通电不亮。LED长脚是正极短脚是负极,如果管脚有被裁剪过也可以根据头部来判断正负极,大的是负极。

    下图分别是低电平驱动LED和高电平驱动LED的硬件电路图:

三、正文

1、硬件准备

    LED灯一个、STM32F103最小系统板一个、面包板一个、STLINK一个、杜邦线若干

2、软件准备

    编译环境keil

   STM32F10x固件库

3、工程实现

1、工程创建

第一步、在桌面建一个存放工程代码的文件夹,我这里就命名为LED点灯实验

第二步、打开keil5新建工程存放在“LED点灯实验”下,在下图中选择芯片型号,这里就选择我们本次实验使用的主控STM32F103C8

第三步、将官方提供的固件库中的文件添加到我们自己刚刚建立的工程文件中,在我们自己的工程文件夹下新建一个Start文件夹存放复制过来的启动文件

第四步、下图中的stm32f10x文件是STM32F10X的外设寄存器描述文件,用来描述STM32有哪些寄存器和寄存器对应的地址的,另外两个system文件主要是用来配置时钟的,这里我们将这三个文件也复制粘贴到刚建的Start文件夹下面

第五步、将下面两个M3内核寄存器描述文件也复制下来,放到Start文件下,至此,我们工程所必须的软件就已经复制完成了。

第六步、将下图中选中的Start文件夹下面的文件添加到工程中来

可以看到这里的文件左边都有一把琐,这是只读文件的标志,这都是STM32中最基本的文件,是不需要修改的

第七步、将Start文件夹的头文件路径添加到我们的工程中

第八步、在工程文件夹中新建Library文件夹,用来存放固件库中的外设驱动文件,将下面的文件中文件全部复制到我们自己建的库里面

第九步、在我们工程文件夹下面新建一个文件夹USER,用来存放我们用户文件,将下图中的文件复制到User文件夹中

第十步、按照上述第六步第七步的操作再将Library和Usertian添加路径,至此我们的工程就已经建好了,将main中的全部删除就可以开始我们的程序了

2、代码编写

这里只需要配置下GPIO即可,开启时钟--GPIO模式配置--GPIO引脚置高电平

注意:如果编写代码是发现头文件哪里有报错,应该是编译器版本的原因,改成版本5就可以了

    4、调试与验证

    这里我们将LED的正极接PA0,负极接GND,当我们将PA0置高电平时LED就会被点亮。注意上述程序我们的GPIO配置的

    四、参考资料

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

    2、《嵌入式系统及应用》电子科技大学_哔哩哔哩_bilibili

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值