关于STM32通用和复用I/O口
一,概述
STM32F10x系列具有丰富的端口可供使用包括26、37、51、80、112个多功能双向5V兼容的快速I/O口,所有I/O口可以映射到16个外部中断。每个通用的I/O(GPIO)端口有
2个32位配置寄存器(GPIOx_CRL、GPIO_CRH)
2个32位数据寄存器(GPIOx_IDR、GPIO_ODR)
1个32位置位/复位寄存器(GPIOx_BSSR)
1个16位复位寄存器(GPIOx_BRR)
1个32位锁定寄存器(GPIOx_LCKR)
GPIO端口的每个位可以由软件分别配置成多种模式,如输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能和开漏复用功能。
1.1 通用I/O
复位期间和复位后,复用功能未开启,I/O端口被配置成浮空输入模式。复位后,JTAG引脚被置于上拉或下拉模式。
-
PA15:JTDI置于上拉模式
-
PA14:JTCK置于下拉模式
-
PA13:JTMS置于上拉模式
-
PB4:JNTRST置于上拉模式
当I/O引脚作为输出配置时,写到输出寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚,可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据,所有GPIO引脚都有一个弱上拉和弱下拉,当配置位输入时,它们可以被激活,也可以被断开。
1.2 单独的位设置或位清除
当对GPIOx_ODR(数据寄存器)的个别位编程时,软件不需要禁止中断,在单次APB2写操作中,可以只更改一个或多个位。这是通过对置位/复位寄存器(GPIOx_BSSR/GPIOx_BRR)中想要更改的位写1实现的。没被选择的位将不更改。
1.3 外部中断/唤醒线
所有的端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
1.4 复用功能
使用默认复用功能前必须对端口位配置寄存器编程。
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉、下拉)且输入引脚必须由外部驱动;
对于复用的输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
对于双向复用功能,端口必须配置成复用功能输出模式(推挽或开漏)。这时,驱动器被配置成浮空输入模式。
如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的信号连接。如果软件吧一个GPIO引脚配置成复用输出功能,但是外设没有被激活,它的输入将不确定。
1.5 软件重新映射I/O复用功能
为了使不同期间封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他的一些引脚上,这可以通过软件配置相应的寄存器来完成(AFIO)。这时,复用功能就不再映射到它们的原始引脚上。
1.6 GPIO锁定机制
锁定机制允许冻结I/O配置,当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将不能更改端口位的配置。这主要用在一些关键引脚的配置上,防止程序跑飞引起灾难性后果,如果在驱动功率模块的配置上,应用了锁定机制,以冻结I/O口配置,即使程序跑飞,也不会改变这些引脚的配置。
1.7 输入配置
当I/O端口置为输入时,I/O端口位会有如下变化
(1)输出缓冲器被禁止
(2)施密特触发器输入被激活
(3)根据输入配置(上拉、下拉、浮动)的不同弱上拉和下拉电阻被连接
(4)出现在I/O引脚上的数据在每个APB2时钟被采样到输入数据寄存器。
(5)对输入数据寄存器的访问可得到I/O状态。
1.8 输出配置
当I/O口端被配置成输出时,所有的I/O端口会有如下变化
(1)输出缓冲器被激活
①开漏模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将端口置于高阻状态。(P-MOS从不被激活)。
②推挽模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS。
(2)施密特触发输入被激活
(3)弱上拉和下拉电阻被禁止。
(4)出现在I/O引脚上的数据在每个APB2时钟被采样到输入数据寄存器。
(5)在开漏模式时,对输入数据寄存器的访问可得到I/O状态。
(6)在推挽模式时,对输出数据寄存器的访问得到最后一次写的值。
1.9 复用功能配置
当I/O端口被配置为复用功能时,I/O端口的基本结构会有以下变化:
(1)在开漏或推挽模式配置中,输出缓冲器被打开。
(2)内置外设的信号驱动输出缓冲器(复用功能输出)。
(3)施密特触发输入被激活。
(4)弱上拉和下拉电阻被禁止。
(5)在每个APB2时钟周期,出现在I/O引脚上的数据被采样到输入数据寄存器。
(6)开漏模式时,读输入数据寄存器可得到I/O口状态。
(7)在推挽模式时,读输出数据寄存器可得到最后一次写的值。
一组复用功能I/O寄存器允许用户把一些复用功能重新映射到不同的引脚。
1.10 模拟输入配置
当I/O端口被配置为模拟输入配置时,所有的I/O端口位的基本结构会有如下变化:
(1)输出缓冲器被禁止。
(2)禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强制为零。
(3)弱上拉和下拉电阻被禁止。
(4)读取输入数据寄存器时数值为零。