STM32F10x之GPIO

1 GPIO概述

1.1 功能描述

STM32的GPIO端口相对比较复杂,所以使用起来也困难许多,STM32的GPIO端口的每一位都可以由软件配置成多种模式。
4种输入模式:

  • 输入浮空;
  • 输入上拉;
  • 输入下拉;
  • 模拟输入;

4种输出模式:

  • 开漏输出;
  • 推免输出;
  • 推免式复用功能;
  • 开漏复用功能。

每个I/O可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访问)。每个I/O端口有两个32位配置寄存器(GPIOx_CRL, GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。下图给出了一个I/O端口位的基本结构:


I/O端口位的基本结构

1.2 特点

  • 专门的寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了直接设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。
  • I/O端口的输出模式有3种速度可选,分别为2MHz、10MHz和50MHz,这有利于噪声控制。这个速度是指I/O端口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关。用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路)模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的抗电磁干扰(EMI)能力,当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。
  • GPIO端口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。
  • 在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。
  • 所有I/O端口都有外部中断能力,可以作为外部中断的输入,便于系统灵活设计,为了使用外部中断线,端口必须配置成输入模式。
  • GPIO端口的配置具有上锁功能,当配置好GPIO端口后,可以通过程序锁住配置组合,直到 下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O端口的配置被改变而损坏,如一个输入端口变成输出端口并输出电流。
  • 所有I/O端口兼容CMOS和TTL,多数I/O端口兼容5V电平,这些IO端口在与5V 电平的外设连接的时候具有优势,具体哪些 I/O端口是5V 兼容的,可以从该芯片的数据手册管脚描述章节查到( I/O Level 标 FT 的就是 5V 电平兼容的)。
  • 具有独立的唤醒I/O端口。
  • 很多I/O口的复用功能,可以重新映射。

2 端口复用和重映射

2.1 定义

在STM32中,有许多通用I/O端口,同时也内置了许多外设,如USART、CAN、SPI、ADC等等,为了节俭引出管脚,这些内置外设引出管脚是与通用I/O管脚共用的,当I/O管脚作为这些外设模块的功能引脚时就叫端口复用功能。同时,在STM32中,每个内置外设都有若干个输入输出引脚,一般这些外设的输出引脚都有默认I/O端口,为了让设计工程师拥有更大的灵活性以便可以更好地安排外设引脚功能,在 STM32中引入了外设引脚重映射(remap)的概念,即一个外设的引脚除了具有默认的引脚位外,还可以通过配置重映射寄存器的方式,把这个外设的引脚映射到其它的引脚位。以下是STM32F103xC,STM32F103xD和STM32F103xE数据手册中有关USART3引脚的摘要。



...


...


图1 I/O端口定义摘要

从以上管脚定义摘要中这里可以看出,管脚PB10除了可以用作通用I/O功能外还可以复用作I2C2_SCL或USART3_TX,还可以重映射为TIM2_CH3,管脚PB11除了可以用作标准I/O功能外还可以复用作I2C2_SDA或USART3_RX,还可以重映射为TIM2_CH4。USART3_TX的默认引出脚是PB10,USART3_RX的默认引出脚是PB11,但经过重映射后,可以变更USART3_TX的引出脚为PD8,变更USART3_RX的引出脚为PD9。

2.2 端口复用输出

一个外设的功能引脚不管是从默认的脚位引出还是从重映射的引脚引出,都需要通过GPIO端口实现,相应的GPIO端口必须配置为输入(对应模块的输入功能,如USART的RX)或复用输出(对应模块的输出功能,如USART的TX),对于输出引脚,可以按照需要配置为推挽复用输出或开漏复用输出。


图2 复用输出配置电路

从图中可以看出,配置为复用输出时,该端口对应的GPIO普通输出功能将不起作用,例如当配置PB10对应的引脚为复用输出功能时,操作PB10对应的输出寄存器将不影响引脚上的信号。通用I/O端口输入功能与复用的输入功能的配置方式没有分别,这意味着在使用引脚的复用输入功能时,可以在这个引脚的输入寄存器上读出引脚上的信号。例如在使能了USART3模块时,可以读GPIOB_IDR寄存器,得到PB11信号线上的当前状态。

2.3 端口重映射

在STM32中,有很多内置外设都具有重映射的功能,比如USART、TIM、CAN、SPI、I2C等,详细请看STM32参考手册和所选芯片的数据手册。有些内置外设的重映射功能还可以有多种选择,下面是STM32F10x参考手册上有关USART3输入输出引脚的重映射功能表:


表1 USART3重映射

从这个表中可以看出,USART3的TX和RX的默认引脚时PB10和PB11,但是可以根据重映射寄存器的配置,它们可以重映射到PC10和PC11,还可以重映射到PD8和PD9。

2.4 端口复用功能选择

在STM32中,有不少引脚上可以作为多个模块的复用功能引出脚,如图1的PB10,默认复用功能就有I2C2_SCL和USART3_TX两个功能,TIM2重映射后,TIM2_CH3也使用PB10的复用功能。在使用引脚的复用功能时,需要注意,在软件上只可以使能一个外设模块,否则在引出脚上可能产生信号冲突。例如,如果使能了USART3模块,且没有对USART3进行重映射配置,则不可以使能I2C2模块;同理如果需要使用I2C2模块,则不能使能USART3模块。但是如果重映射USART3,则USART3的TX和RX信号将从PC10和PC11,或PD8和PD9引出,避开了I2C2使用的PB10和PB11,这时就可以同时使用 I2C2模块和USART3模块了。

在STM32中,重映射是对所有信号管脚同时有效,从表1中可以看出,重映射是对所有信号同时有效。有的外设的部分信号引脚是可以独立开关的,例如USART3模块共有5个信号,分别为TX、RX、CK、CTS和RTS,在这5个信号中,在使能了USART3模块后,只有TX和RX是始终与对应的引出脚相连,而其它3个信号分别有独立的控制位,控制它们是否与外部引脚相连,如果程序中不使用某个信号的功能,则可以关闭这个信号的功能,对应的引脚可以做为其它功能的引出脚,比如,当关闭了USART3的CK、CTS和 RTS功能并且没有重映射USART3时,PB12、PB13和PB14 可以作为通用输入输出端口使用,也可以作为其它模块的复用功能引出脚。

3 外设端口配置

3.1 外设端口模式配置

不同的外设、工作模式、引脚所对应的GPIO模式配置也不会不同,以下列出了所有外设的端口配置。


表2 高级定时器TIM1&TIM8
表3 通用定时器TIM2~5
表4 USART
表5 SPI
表6 I2S
表7 I2C
表8 BxCAN
表9 USB
表10 全速USB OTG
表11 SDIO
表12 ADC/DAC
表13 FSMC
表14 其他IO

3.2 外设端口重映射

为了优化64脚或100脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射,这时,复用功能不再映射到它们的原始分配上。

3.2.1 OSC32_IN/OSC32_OUT

当 LSE 振 荡 器 关 闭 时 , LSE 振 荡 器 引 脚 OSC32_IN/OSC32_OUT 可 以 分 别 用 做 GPIO 的PC14/PC15, LSE功能始终优先于通用I/O口的功能。

3.2.2 OSC_IN/OSC_OUT

外部振荡器引脚OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现。这个重映射只适用于36、 48和64脚的封装(100脚和144脚的封装上有单独的PD0和PD1的引脚,不必重映射)。

3.2.3 CAN1复用功能重映射

CAN信号可以被映射到端口A、端口B或端口D上,如下表所示。对于端口D,在36、 48和64脚的封装上没有重映射功能。


表15 CAN1复用功能重映射

3.2.4 CAN2 复用功能重映射

表16 CAN2重映射

3.2.5 JTAG/SWD复用功能重映射

调试接口信号被映射到GPIO端口上,如下表所示:


表17 调试接口信号

为了在调试期间可以使用更多GPIO端口,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)的SWJ_CFG[2:0]位,可以改变上述重映射配置,参见下表。

表18 调试端口重映射

3.2.6 ADC复用功能重映射

表19 ADC1外部触发注入转换重映射
表20 ADC1外部触发规则转换重映射
表21 ADC2外部触发注入转换重映射
表22 ADC2外部触发规则转换重映射

3.2.7 定时器复用功能重映射

表23 TIM5重映射
表24 TIM4重映射
表25 TIM3重映射
表26 TIM2重映射
表27 TIM1重映射

3.2.8 USART复用功能重映射

表28 USART3重映射
表29 USART2重映射
表30 USART1重映射

3.2.9 I2C1复用功能重映射

SPI1映射不适用于36脚封装。

表31 I2C重映射

3.2.10 SPI1复用功能重映射

表32 SPI1重映射

3.2.11 SPI3复用功能重映射

SPI3映射只适用于互联网型产品。

表33 SPI3重映射

3.2.12 以太网复用功能重映射

以太网映射只出现在互联型产品。


表34 ETH重映射

4 GPIO函数库

4.1 初始化数据结构定义

typedef struct
{
  uint16_t GPIO_Pin; /*!< 指定被配置的GPIO管脚 */
  GPIOSpeed_TypeDef GPIO_Speed;  /*!< 指定所选管脚的速度 */
  GPIOMode_TypeDef GPIO_Mode; /*!< 指定所选管脚的操作模式 */
}GPIO_InitTypeDef;

4.2 库函数

函数名 描述
GPIO_DeInit 将外设GPIOx寄存器重设为缺省值
GPIO_AFIODeInit 将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值
GPIO_Init 根据GPIO_InitStruct中指定的参数初始化外设 GPIOx 寄存器
GPIO_StructInit 把GPIO_InitStruct中的每一个参数按缺省值填入
GPIO_ReadInputDataBit 读取指定端口管脚的输入
GPIO_ReadInputData 读取指定端口的输入
GPIO_ReadOutputDataBit 读取指定端口管脚的输出
GPIO_ReadOutputData 读取指定端口输出
GPIO_SetBits 设置指定的数据端口位
GPIO_ResetBits 清除指定的数据端口位
GPIO_WriteBit 设置或者清除指定的数据端口位
GPIO_Write 向指定端口写入数据
GPIO_PinLockConfig 锁定管脚设置寄存器
GPIO_EventOutputConfig 选择 管脚用作事件输出
GPIO_EventOutputCmd 使能或者失能事件输出
GPIO_PinRemapConfig 改变指定管脚的映射
GPIO_EXTILineConfig 选择管脚用作外部中断线路
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容