天南地北客
发表于: 2015-11-29 17:16:11 | 显示全部楼层

9    通用I/O (GPIO)


9.1        简介

每个通用I/O端口包括4个32位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)、2个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)和1个32位置位/复位寄存器 (GPIOx_BSRR)。此外,所有GPIO都包括1个32位锁定寄存器 (GPIOx_LCKR)和2个32位复用功能选择寄存器(GPIOx_AFRH和GPIOx_AFRL)。


9.2        GPIO主要特性

•        输出状态:推挽或开漏 + 上拉/下拉

•        从输出数据寄存器 (GPIOx_ODR) 或外设(复用功能输出)输出数据

•        可为每个 I/O 选择不同的速度

•        输入状态:浮空、上拉/下拉、模拟

•        将数据输入到输入数据寄存器 (GPIOx_IDR) 或外设(复用功能输入)

•        置位和复位寄存器 (GPIOx_BSRR),对 GPIOx_ODR 具有按位写权限

•        锁定机制 (GPIOx_LCKR),可冻结 I/O 端口配置

•        模拟功能

•        复用功能选择寄存器

•        快速翻转,每次翻转最快只需要两个时钟周期

•        引脚复用非常灵活,允许将 I/O 引脚用作 GPIO 或多种外设功能中的一种


9.3        GPIO功能描述

根据数据手册中列出的每个 I/O 端口的特性,可通过软件将通用 I/O (GPIO) 端口的各个端口位分别配置为多种模式:

•        输入浮空

•        输入上拉

•        输入下拉

•        模拟

•        具有上拉或下拉功能的开漏输出

•        具有上拉或下拉功能的推挽输出

•        具有上拉或下拉功能的复用功能推挽

•        具有上拉或下拉功能的复用功能开漏

每个 I/O 端口位均可自由编程,但 I/O 端口寄存器必须按 32 位字、半字或字节进行访问。GPIOx_BSRR 寄存器和 GPIOx_BRR 寄存器旨在实现对 GPIOx_ODR 寄存器进行原子读取/修改访问。这样便可确保在读取和修改访问之间发生中断请求也不会有问题。


图 18 和图 19 分别显示了标准和 5 V 容限 I/O 端口位的基本结构。表 32 给出了可能的端口位配置方案。

图 18. I/O 端口位的基本结构

457.jpg


图 19. 5V 容限 I/O 端口位的基本结构

safsd.jpg


表32. 端口位配置表

hu.jpg

跳转到指定楼层
天南地北客
发表于: 2015-11-30 22:26:18 | 显示全部楼层

9.3.1        通用I/O(GPIO)

在复位期间及复位刚刚完成后,复用功能尚未激活,大多数 I/O 端口被配置为输入浮空模式。

复位后,调试引脚处于复用功能上拉/下拉状态:

•        PA15:JTDI 处于上拉状态

•        PA14:JTCK/SWCLK 处于下拉状态

•        PA13:JTMS/SWDAT处于上拉状态

•        PB4:NJTRST 处于上拉状态

•        PB3:JTDO 处于浮空状态

当引脚配置为输出后,写入到输出数据寄存器 (GPIOx_ODR) 的值将在 I/O 引脚上输出。可以在推挽模式下或开漏模式下使用输出驱动器(仅驱动低电平,高电平为高阻态)。

输入数据寄存器 (GPIOx_IDR) 每隔 1 个 AHB 时钟周期捕获一次 I/O 引脚的数据。

所有 GPIO引脚都具有内部弱上拉及下拉电阻,可根据 GPIOx_PUPDR 寄存器中的值来打开/关闭。


9.3.2        I/O 引脚复用功能复用器和映射

器件 I/O引脚通过一个复用器连接到板载外设/模块,该复用器一次仅允许一个外设的复用功能 (AF) 连接到 I/O 引脚。这可以确保共用同一个 I/O 引脚的外设之间不会发生冲突。

每个 I/O 引脚都有一个复用器,该复用器采用多达 16 路复用功能输入(AF0 到 AF15),可通过 GPIOx_AFRL(针对引脚 0 到 7)和 GPIOx_AFRH(针对引脚 8 到 15)寄存器对这些输入进行配置:

•        复位后,复用器选择为复用功能 0 (AF0)。在复用模式下通过 GPIOx_MODER 寄存器配置 I/O。

•        器件数据手册中详细说明了每个引脚的特定复用功能分配。

除了这种灵活的 I/O 复用架构之外,各外设还可以将复用功能映射到不同 I/O 引脚,这可以优化小型封装中可用外设的数量。


要将 I/O 配制成所需功能,必须按照以下步骤操作:

•        调试功能:每个器件复位后,立即将这些引脚分配为可由调试主机使用的复用功能引脚。

•        GPIO:在 GPIOx_MODER 寄存器中将所需 I/O 配置为输出、输入或模拟通道。

•        外设复用功能:

–        在 GPIOx_AFRL 或 GPIOx_AFRH 寄存器中,将 I/O 连接到所需的 AFx。

–        通过 GPIOx_OTYPER、GPIOx_PUPDR 和 GPIOx_OSPEEDER 寄存器,分别选择类型、上拉/下拉以及输出速度。

–        在 GPIOx_MODER 寄存器中将所需 I/O 配置为复用功能。

•        其它功能:

–        对于 ADC、DAC、OPAMP 和 COMP,在 GPIOx_MODER 寄存器中将所需 I/O 配置为模拟模式,并在 ADC 、DAC、OPAMP和 COMP 寄存器中配置所需功能。对于ADC,需要配置GPIOx_ASCR 寄存器。

–        对于 RTC、WKUPx 和振荡器的其它功能,在相关的 RTC、PWR 和 RCC 寄存器中配置所需功能。这些功能优先于标准 GPIO 寄存器中的配置。

有关复用功能 I/O 引脚映射的详细信息,请参见器件数据手册中的“复用功能映射”表。


9.3.3        I/O 端口数据寄存器

每个GPIO端口有4个32位存储器映射的控制寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR),可配置多达16个 I/O。GPIOx_MODER 寄存器用于选择 I/O 模式(输入、输出、AF、模拟)。GPIOx_OTYPER 和 GPIOx_OSPEEDR 寄存器用于选择输出类型(推挽或开漏)和速度。无论采用哪种 I/O 方向,GPIOx_PUPDR 寄存器都用于选择上拉/下拉。


9.3.4        I/O 端口数据寄存器

每个 GPIO 都具有 2 个 16 位数据寄存器:输入和输出数据寄存器(GPIOx_IDR 和GPIOx_ODR)。GPIOx_ODR 用于存储待输出数据,可对其进行读/写访问。通过 I/O 输入的数据存储到输入数据寄存器 (GPIOx_IDR) 中,它是一个只读寄存器。

有关寄存器说明的详细信息,请参见第 9.4.5节:GPIO 端口输入数据寄存器 (GPIOx_IDR)(x = A..K)和第9.4.6节:GPIO端口输出数据寄存器 (GPIOx_ODR) (x = A..K)。


9.3.5        I/O 数据位操作

置位复位寄存器 (GPIOx_BSRR) 是一个 32 位寄存器,它允许应用程序在输出数据寄存器(GPIOx_ODR) 中对各个单独的数据位执行置位和复位操作。置位复位寄存器的大小是GPIOx_ODR 的二倍。

GPIOx_ODR 中的每个数据位对应于 GPIOx_BSRR 中的两个控制位:BS(i) 和 BR(i)。当BS(i) 位写入 1 时,其会置位对应的 ODR(i) 位。当BR(i) 位写入 1 时,其会复位 ODR(i) 对应的位。

在 GPIOx_BSRR 中向任何位写入 0 都不会对 GPIOx_ODR 中的对应位产生任何影响。如果在 GPIOx_BSRR 中同时尝试对某个位执行置位和复位操作,则置位操作优先。

使用 GPIOx_BSRR 寄存器更改 GPIOx_ODR 中各个位的值是一个“单次”操作,不会锁定GPIOx_ODR 位。随时都可以直接访问 GPIOx_ODR 位。GPIOx_BSRR 寄存器提供了一种执行原子按位处理的方法。

在对 GPIOx_ODR 进行位操作时,软件无需禁止中断:在一次原子 AHB 写访问中,可以修改一个或多个位。


9.3.6        GPIO锁定机制

通过将特定的写序列应用到GPIOx_LCKR寄存器,可以冻结GPIO控制寄存器。冻结的寄存器包括GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRL和GPIOx_AFRH。

要对GPIOx_LCKR寄存器执行写操作,必须应用特定的写/读序列。当正确的LOCK序列应用到此寄存器的第16位后,会使用LCKR[15:0]的值来锁定I/O的配置(在写序列期间,LCKR[15:0] 的值必须相同)。将LOCK序列应用到某个端口位后,在执行下一次MCU复位或外设复位之前,将无法对该端口位的值进行修改。每个GPIOx_LCKR位都会冻结控制寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRL 和 GPIOx_AFRH)中的对应位。

LOCK 序列(参见第 9.4.8节:GPIO端口配置锁定寄存器 (GPIOx_LCKR) (x = A..K))只能通过对GPIOx_LCKR寄存器进行字(32位长)访问的方式来执行,因为 GPIOx_LCKR 的第16位必须与 [15:0]位同时置位。

有关详细信息,请参见第 9.4.8节:GPIO 端口配置锁定寄存器 (GPIOx_LCKR) (x = A..K) 中的 LCKR 寄存器说明。


9.3.7        I/O复用功能输入/输出

有两个寄存器可用来从每个I/O可用的复用功能输入/输出中进行选择。借助这些寄存器,可根据应用程序的要求将某个复用功能连接到其它某个引脚。

这意味着可使用GPIOx_AFRL和GPIOx_AFRH复用功能寄存器在每个GPIO上复用多个可用的外设功能。这样一来,应用程序可为每个I/O选择任何一个可用功能。由于AF选择信号由复用功能输入和复用功能输出共用,所以只需为指定I/O的复用功能输入/输出选择一个通道即可。

要了解在每个GPIO引脚上复用了哪些功能,请参见器件数据手册。


9.3.8        外部中断线/唤醒线

所有端口都具有外部中断功能。要使用外部中断线,必须将端口配置为输入模式。请参见第11节:外部中断和事件控制器(EXTI)和第11.3节:唤醒事件管理。


9.3.9        输入配置

对I/O端口作为输入进行编程时:

•        输出缓冲器被禁止

•        施密特触发器输入被打开

•        根据GPIOx_PUPDR寄存器中的值决定是否打开上拉和下拉电阻

•        输入数据寄存器每隔1个AHB时钟周期对I/O引脚上的数据进行一次采样

•        对输入数据寄存器的读访问可获取I/O状态

图20说明了I/O端口位的输入配置。

图20. 输入浮空/上拉/下拉配置

21.jpg

回复

使用道具 举报

天南地北客
发表于: 2015-12-1 21:49:49 | 显示全部楼层

9.3.10        输出配置

对I/O端口作为输出进行编程时:

•        输出缓冲器被打开:

–        开漏模式:输出寄存器中的“0”可激活N-MOS,而输出寄存器中的“1”会使端口保持高阻态 (Hi-Z)(P-MOS始终不激活)

–        推挽模式:输出寄存器中的“0”可激活N-MOS,而输出寄存器中的“1”可激活P-MOS

•        施密特触发器输入被打开

•        根据GPIOx_PUPDR寄存器中的值决定是否打开上拉和下拉电阻

•        输入数据寄存器每隔1个AHB时钟周期对I/O引脚上的数据进行一次采样

•        对输入数据寄存器的读访问可获取I/O状态

•        对输出数据寄存器的读访问可获取最后的写入值

图21说明了 I/O 端口位的输出配置。

图21. 输出配置      

9i0.jpg


9.3.11        复用功能配置

对I/O端口作为复用功能进行编程时:

•        可将输出缓冲器配置为开漏或推挽模式

•        输出缓冲器由来自外设的信号驱动(发送器使能和数据)

•        施密特触发器输入被打开

•        根据GPIOx_PUPDR寄存器中的值决定是否打开弱上拉电阻和下拉电阻

•        输入数据寄存器每隔1个AHB时钟周期对I/O引脚上的数据进行一次采样

•        对输入数据寄存器的读访问可获取I/O状态

注:        当选择的复用功能是LCD功能或者SWPMI_IO时,上述描述的复用功能配置不适用。在这种情况下,编程为复用功能输出的I/O,以模拟配置描述的进行配置。

图22说明了 I/O 端口位的复用功能配置

图22. 复用功能配置

23.jpg


9.3.12        模拟配置

对I/O端口作为模拟配置进行编程时:

•        输出缓冲器被禁止

•        施密特触发器输入停用,I/O引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)

•        弱上拉和下拉电阻被硬件关闭

•        对输入数据寄存器的读访问值为“0”

图23说明了 I/O 端口位的高阻态模拟输入配置。

图23. 高阻态模拟配置

24.jpg


9.3.13        将HSE或LSE振荡器引脚用作GPIO

当HSE或LSE振荡器关闭(复位后的默认状态)时,可将相关的振荡器引脚用作常规GPIO。

当HSE或LSE振荡器打开(通过设置RCC_CSR寄存器中的HSEON或LSEON位)时,振荡器会控制与其相关联的引脚,这些引脚的GPIO配置不起作用。

将振荡器配置为用户外部时钟模式时,仅为时钟输入保留OSC_IN或OSC32_IN引脚,OSC_OUT或OSC32_OUT引脚仍可用作常规GPIO。


9.3.14        在备份电源域中使用GPIO引脚

当内核电源域掉电时(器件进入待机模式时),PC13/PC14/PC15/PI8 GPIO 功能会丢失。在这种情况下,如果不通过 RTC 配置旁路其 GPIO 配置,这些引脚将被设置为模拟输入模式。

有关由RTC控制的I/O的详细信息,请参见第 1058 页上的第 34.3 节:RTC 功能说明。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 49 | 回复: 80



手机版|

GMT+8, 2024-12-22 01:00 , Processed in 0.101345 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表