1、GPIO简介

  STM32F103ZET6有多个GPIO组,如GPIOA、GPIOB、GPIOC...等等。每个GPIO组具有16个IO口。

  GPIO组的寄存器都是类似的,每个GPIO组都有2个32位的配置寄存器、2个32位的数据寄存器、1个32位的置位/复位寄存器、1个16位复位寄存器和1个32位锁定寄存器。

  STM32的很多IO口都是5V兼容的,具体哪些IO口是5V兼容的,可以从芯片的数据手册管脚描述中查到,在手册的IO Level中标FT的就是5V电平兼容的。

2、GPIO配置

  STM32F103ZET6可以通过配置寄存器CRH和CRL将IO配置成不同的功能。IO具有以下几种不同的模式:

    • 输入浮空
    • 输入下拉
    • 输入上拉
    • 模拟输入
    • 开漏输出
    • 推免式输出
    • 推免式复用功能
    • 开漏复用功能  

  CRH和CRL寄存器的每4个BIT用来配置一个IO的功能,CRL用来配置低8位IO的功能,CRH用来配置高8位IO的功能。

  CNF1、CNF0、MODE1、MODE0这4个位组成了1个IO的配置位,如GPIOF0的配置位CNF1、CNF0、MODE1、MODE0这些位位于CRL寄存器中的BIT3~BIT0;GPIOF1的配置位CNF1、CNF0、MODE1、MODE0这些位位于CRL寄存器中的BIT7~BIT4;而GPIOF8的配置位CNF1、CNF0、MODE1、MODE0这些位位于CRH寄存器中的BIT3~BIT0;以此类推。CRH和CRL这两个寄存器总共有64个BIT,总共组成了16个IO的配置位。

  IO口的配置表如下:

  MODE1和MODE0是用来配置IO的输入、输出状态;CNF1和CNF0则是根据IO口的输入和输出状态的不同配置不同的IO功能。

  在配置IO的时候,首先通过MODE1和MODE0配置IO是输入还是输出,再通过CNF1和CNF0配置IO是什么功能的输入或输出。

  通过CNF1、CNF0、MODE1、MODE0这些位可以将IO设置成上拉/下拉输入,但是具体是设置成上拉输入还是下拉输入,并不是根据这4个位来决定的。IO口是通过ODR数据寄存器来区分到底是设置成上拉输入还是下拉输入。如果IO口的ODR被置为1,则IO口被设置为上拉输入;如果IO口的ODR被清为0,则IO口被设置为下拉输入。

  CNF1、CNF0、MODE1、MODE0配置位功能如下:

  MODE1和MODE0控制IO的输入和输出:

      • [MODE1、MODE0] = 00 设置为输入。
      • [MODE1、MODE0] = 01 设置为输出,速率为10MHZ。
      • [MODE1、MODE0] = 10 设置为输出,速率为20MHZ。
      • [MODE1、MODE0] = 11 设置为输出,速率为50MHZ。

  CNF1、CNF0则需要根据IO是输入还是输出来区分:

    IO设置为输入时:

        • [CNF1、CNF0] = 00 设置为模拟输入。
        • [CNF1、CNF0] = 01 设置为浮空输入。
        • [CNF1、CNF0] = 10 设置为上拉/下拉输入。
        • [CNF1、CNF0] = 11保留。

    IO设置为输出时:

        • [CNF1、CNF0] = 00 设置为通用推免输出。
        • [CNF1、CNF0] = 01 设置为通用开漏输出。
        • [CNF1、CNF0] = 10 设置为复用功能推免输出。
        • [CNF1、CNF0] = 11 设置为复用功能开漏输出。

3、GPIO的复位状态

  芯片在上电复位后,大部分IO口的模式默认为浮空输入模式。但是有些IO比较特殊,比如PA15、PA14、PA13、PB4、PB3等IO,这些IO是JTAG和SWIO调试下载口,芯片复位后,这些IO就被默认成了JTAG和SWIO等功能,也就是说芯片复位后,PA15、PA14、PA13、PB4、PB3等IO并不能通过常规的配置设置成相应的功能。如果需要使用这些口的IO口功能,则必须将这些IO功能重新映射为GPIO口。

  需要注意的是如果将PA15、PA14、PA13、PB4、PB3等口重映射为GPIO口后,则不能用调试器调试程序,而且也不能下载程序,只有通过复位芯片,使这些IO口的功能处于复位默认功能,才能下载程序。

  复位后,PA15、PA14、PA13、PB4、PB3这些引脚被配置成如下模式:

    • PA15:JTDI被置为上拉输入模式。
    • PA14:JTCK/SWCLK被置为下拉输入模式。
    • PA13:JTMS/SWDIO被置为上拉输入模式。
    • PB4:JNTRST被置为上拉输入模式。
    • PB3:JTDO

4、GPIO锁定机制

  GPIO的锁定机制允许冻结IO口的配置。当在一个端口位上通过LCKR寄存器执行了锁定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。

5、外设的GPIO配置

  可以在中文参考手册的GPIO介绍章节查到外设的GPIO设置,比如说如果要使用USART_TX功能,需要将USART_TX脚位配置成什么状态,可以在参考手册中查到。

6、GPIO寄存器

  CRH和CRL是GPIO的配置寄存器,用来配置IO的功能。

  IDR是GPIO的输入数据寄存器。通过IDR寄存器可以读出IO的状态。需要注意的是IDR寄存器只能以字(16位)的形式读出。

  ODR是GPIO的输出数据寄存器。通过ODR寄存器可以输出高低电平。

  BSRR是GPIO的端口位设置/清除寄存器。BSRR寄存器的高16位是清除IO位,低16位是置位IO位。需要注意的是BSRR只有在写入1的时候,相应的功能才有作用,写入0是无效的。

  BRR是GPIO的端口位清除寄存器。BRR基础只有在写入1的时候,相应的功能才有作用,写入0无效。

  LCKR是GPIO的端口配置锁定寄存器。LCKR寄存器用来锁定IO口的配置,设置后,除了复位后不能再配置IO的状态。

7、HAL库操作GPIO

  以下面的程序为例说明:

void GPIO_Init(void)
{ GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOF_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
}

  首先定义一个GPIO_InitTypeDef结构体。

  在操作GPIO口之前,需要先使能GPIO的时钟。在HAL库中,是通过宏定义的方式使能或失能相应外设时钟的。一般在stm32f1xx_hal_rcc_ex.h文件当中。如果不知道某个外设的时钟是在哪个寄存器使能的,可以通过stm32f1xx_hal_rcc_ex.h查看对应的时钟使能程序。

  HAL_GPIO_Init函数是GPIO初始化函数,通过传入的参数来配置IO的功能。

  GPIO_InitStruct.Pin选择要设置的IO脚。

  GPIO_InitStruct.Mode选择要设置的功能。

  GPIO_InitStruct.Pull选择设置上拉或下拉或无上下拉。

  GPIO_InitStruct.Speed选择设置IO口的速度。

  在HAL库中GPIO的函数被封装在stm32f1xx_hal_gpio.c文件中,可以在该文件中查看每个函数是如何实现和使用的。

  GPIO重映射使能和失能

  在HAL库中,GPIO重映射的使能和失能被封装成了宏,可以在stm32f10xx_hal_gpio_ex.h文件当中查看。

  比如调试接口重映射成GPIO口:

    PA15、PA14、PA13、PB4、PB3这几个口是调试接口脚,芯片复位的时候,将它们的功能默认为调试接口的功能,如果不重映射,它们将不能用来作为IO口功能被操作。

    通过配置AFIO_MAPR寄存器的SWJ_CFG[2:0]位,可以设置PA15、PA14、PA13、PB4、PB3是调试接口还是GPIO口。

    __HAL_AFIO_REMAP_SWJ_ENABLE();//将PA15、PA14、PA13、PB4、PB3全部设为调试接口

    __HAL_AFIO_REMAP_SWJ_NONJTRST();//将PA15、PA14、PA13、PB3设为调试接口,而PB4为IO口

    __HAL_AFIO_REMAP_SWJ_NOJTAG();//将PA15、PA14、PA13设为调试接口,而PB4、PB3为IO口

    __HAL_AFIO_REMAP_SWJ_DISABLE();//将PA15、PA14、PA13、PB4、PB3全部设为IO口
    

8、通过STM32CubeMX配置GPIO

  以使用STM32CubeMX配置GPIOF6口为例说明。

  打开STM32CubeMX软件,通过Pinout View选择PF6脚位为GPIO_Output功能。如下图:

  在System Core下选择GPIO,会弹出Configuration界面,在Configuration配置IO口的功能,如图:

  点击Configuration中的PF6,会弹出PF6 Configuration,这里可以配置PF6的属性。

  点击Project Manger,在里面设置生成的工程路径和生成的工程类型。如下图:

  配置完之后点击右上角的GENERATE CODE生成功能代码。

  打开生成的工程。

  找到MX_GPIO_Init()函数,该函数就是实现PF6口的配置,如下:

  可以通过MX配置生成的工程参考外设的配置流程。

STM32F103ZET6 GPIO的使用的更多相关文章

  1. STM32(2)——GPIO

    对于初学者而言,最简单的是对芯片上的IO进行操作,我们学习ARM时候,第一个工程就是点亮LED,STM32F103ZET6通用输入输出接口(General-Purpose Inputs/Outputs ...

  2. STM32的GPIO工作原理 | 附电路图详细分析

    STM32的GPIO介绍 STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚.GPIO的引脚与外部硬件设备连接,可实现与外部通讯.控制外部硬件或者采集外部硬件数据的功能. ...

  3. STM32 C++编程 002 GPIO类

    使用 C++ 语言给 STM32 编写一个 Gpio 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专 ...

  4. STM32 GPIO口的配置和应用

    STM32F103ZET6 一共有7组IO口(有FT的标识是可以识别5v的) 每组IO口有16个IO 一共16*7=112个IO 4种输入模式: (1) GPIO_Mode_AIN 模拟输入 (2) ...

  5. 新建基于STM32F103ZET6的工程-HAL库版本

    1.STM32F103ZET6简介 STM32F103ZET6的FLASH容量为512K,64K的SRAM.按照STM32芯片的容量产品划分,STM32F103ZET6属于大容量的芯片. 2.下载HA ...

  6. [转]: stm328种GPIO模式

    [原创]:这段时间开始研究stm32,今天撸着一段代码一直追,追到了GPIO口模式的枚举类型这里,遂去网上查看这8种模式到底是什么,网上一查,看到了一个答案被很多博主转载或者原创,那我也就不重复废话了 ...

  7. 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(3)

    作者 彭東林 pengdonglin137@163.com 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uIma ...

  8. 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)

    作者 彭東林 pengdonglin137@163.com 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uIma ...

  9. 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(1)

    作者 彭東林 pengdonglin137@163.com 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uIma ...

随机推荐

  1. CVPR 2020 三篇有趣的论文解读

    作者 | 文永亮 学校 | 哈尔滨工业大学(深圳) 研究方向 | 视频预测.时空序列预测 目录 AdderNet - 其实不需要这么多乘法 Deep Snake for Real-Time Insta ...

  2. aosp Pixel 修改 SIM 卡支持及解决网络带x问题

    去除网络X的方法 adb shell settings put global captive_portal_https_url http://g.cn/generate_204 自己用 php 做一个 ...

  3. Java反射之成员变量的反射

    上一篇介绍了Java反射之构造方法反射.这次我们在说一说如何反射类中的成员变量并用作一个简单案例. [一]Field类 Filed类代表字段,包含字段拥有的所有属性,比如修饰符,变量类型,值等等,Fi ...

  4. 4000字干货长文!从校招和社招的角度说说如何准备Java后端大厂面试?

    插个题外话,为了写好这篇文章内容,我自己前前后后花了一周的时间来总结完善,文章内容应该适用于每一个学习 Java 的朋友!我觉得这篇文章的很多东西也是我自己写给自己的,比如从大厂招聘要求中我们能看到哪 ...

  5. js 随机产生100个0~1000之间的整数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 将config从内部移动到外部 3部曲

    1 创建 public/config.js /* eslint-disable no-shadow-restricted-names */ // eslint-disable-next-line no ...

  7. AVR单片机教程——走向高层

    本文隶属于AVR单片机教程系列.   在系列教程的最后一篇中,我将向你推荐3个可以深造的方向:RTOS.C++.事件驱动.掌握这些技术可以帮助你更快.更好地开发更大的项目. 本文涉及到许多概念性的内容 ...

  8. java 锁 简介(转)

    转自 https://www.cnblogs.com/hustzzl/p/9343797.html 1. Java锁的种类 在笔者面试过程时,经常会被问到各种各样的锁,如乐观锁.读写锁等等,非常繁多, ...

  9. Python 之装饰器

    Python 的装饰器可谓是提高开发效率的一大利器.然而初学装饰器的时候感觉很难理解,因为除了 Python 之外没听说哪个语言有这种东西. 而且网上看的很多解释看似容易理解,但只能很快理解了装饰器能 ...

  10. Android UI性能测试——使用 Systrace 查找问题

    一 官方文档翻译 官文地址:https://developer.android.com/studio/command-line/systrace systrace命令允许您在系统级别上收集和检查所有运 ...