嵌入式软件开发首页投稿(暂停使用,暂停投稿)我爱编程

STM32F10x之GPIO

2016-03-30  本文已影响941人  hackvilin

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 特点

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 选择管脚用作外部中断线路
上一篇下一篇

猜你喜欢

热点阅读