STM32F10x之GPIO

作者: hackvilin | 来源:发表于2016-03-30 16:09 被阅读941次

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

    相关文章

      网友评论

        本文标题:STM32F10x之GPIO

        本文链接:https://www.haomeiwen.com/subject/eejslttx.html