一、关键概念

       MCU的IO引脚如PA1、PB1等等,有GPIO(General-purpose input and output)和AFIO(Alternate-function input and output)功能。以PA1为例:软件设置PA1为GPIO输入模式后,可以读PA1引脚输入的电平;软件设置PA1为GPIO输出模式后,可以控制PA1引脚输出高/低电平;软件设置PA1为AFIO输入模式后,PA1引脚可以作为指定外设的输入引脚;软件设置PA1为AFIO输出模式后,PA1引脚可以作为指定外设的输出引脚。

1、引脚的模式


2、引脚的GPIO功能

① 当pin作为GPIO输入时,模式设为“非模拟输入”(上下拉可配置),此时可读pin的输入电平

② 当pin作为GPIO输出时,模式设为“非复用输出”(推挽、开漏可配置),此时可控制pin的输出电平

3、引脚的复用功能

① 当pin要作为外设A的输出引脚时,pin设为“复用输出”(推挽、开漏可配置)

② 当pin要作为外设A的输入引脚时,若外设A为ADC,则pin设为"模拟输入",否则pin设为“非模拟输入”(上下拉可配置)

③ 当pin既要作为外设A的输入引脚,也要作为外设A的输出引脚(如I2C的SDA引脚),则pin设为“复用输出”(推挽、开漏可配置)

PS:使用pin的复用功能时,pin可能连到多个外设的引脚,此时程序员要确保只有外设A使用了此pin,没有其他外设来抢此pin

4、外设引脚重映射

       使用pin的复用功能时,复用外设有两类,一类是“Default外设”,一类是"Remap外设"。若软件未执行外设引脚重映射指令,则pin连接的是“Default外设”;若软件执行了外设引脚重映射指令,则pin连接的是“Remap外设”。(注意软件在控制外设引脚重映射前,需使能AFIO时钟)

PS: 外设A可能有很多引脚,故又引入下面两个概念
       部分重映射:外设A的部分引脚重映射
       完全重映射:外设A的全部引脚重映射

       软件需在芯片手册中查看外设A的重映射表,然后再看电路图中外设A用的是哪个引脚,最后才能确定外设A应执行哪种重映射。

二、程序开发流程(以PA7为例)

1、PA7作为GPIO

GPIO_InitTypeDef GPIO_InitStruct;               
__HAL_RCC_GPIOA_CLK_ENABLE();	//使能GPIOA时钟
	
GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode	= GPIO_MODE_INPUT;
GPIO_InitStruct.Pull 		= GPIO_NOPULL;
GPIO_Init(GPIOA,&GPIO_InitStruct);				//配置PA7为 浮空输入     
state = HAL_GPIO_ReadPin(GPIOA, GPIO_Pin_7);	//读PA7

GPIO_InitStruct.GPIO_Mode	= GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.GPIO_Speed  = GPIO_SPEED_FREQ_LOW; 
GPIO_Init(GPIOA,&GPIO_InitStruct);	//配置PA7为 推挽输出, 输出速率最大2Mhz
HAL_GPIO_WritePin(GPIOA, GPIO_Pin_7, 0);	//控制PA7输出低电平

2、PA7作为外设ADC12_IN7的输入引脚

/* 设置PA7的模式(ADC12_IN7 是PA7的“Default外设”),然后初始化ADC */

GPIO_InitTypeDef GPIO_InitStruct;               
__HAL_RCC_GPIOA_CLK_ENABLE();
	
GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode	= GPIO_MODE_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);	//配置PA7为 模拟输入 

初始化ADC1;

3、PA7作为外设TIM1_CH1N的输出引脚

/* 设置PA7的模式,然后TIM1引脚部分重映射(TIM1_CH1N 是PA7的“Remap外设”),然后初始化TIM1 */

GPIO_InitTypeDef GPIO_InitStruct;               
__HAL_RCC_GPIOA_CLK_ENABLE();
	
GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode	= GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed 		= GPIO_SPEED_FREQ_HIGH;
GPIO_Init(GPIOA,&GPIO_InitStruct);	//配置PA7为 复用推挽输出, 输出速率最大50Mhz

__HAL_RCC_AFIO_CLK_ENABLE();		//使能AFIO时钟
__HAL_AFIO_REMAP_TIM1_PARTIAL();	//TIM1引脚部分重映射

初始化TIM1;

三、注意事项

1、AFIO输入模式和GPIO输入模式的配置是一样的,且都可以配置内部上下拉电阻。

2、pin 为输出时,最大输出速率可配置。

3、复位后,STM32F072 / STM32F103的所有引脚为浮空输入(除个别特例,如SW调试引脚),N32L406的所有引脚为 模拟模式(除个别特例)。

4、复位后,默认PA13为SWDIO复用功能,PA14为SWCLK复用功能。
​        PS: 如果软件在运行时修改了PA13、PA14的配置,导致MCU复位后,无法用Jlink下载程序或无法用Jlink调试程序,可以先修改软件,取消软件对PA13、PA14的配置(让其保持复位默认状态),然后用导线手动拉低NRST引脚使MCU处于复位状态,然后在下载程序的同时,手动释放NRST引脚。

5、STM32F103、STM32F072的 pin 配置区别:

​① pin为输出时,内部上下拉电阻是否可配置:STM32F103的 pin 为输出时,无法配置内部上下拉电阻(上下拉强制断开);而STM32F072的 pin 为输出时,上下拉电阻可配置。

② pin为AFIO时,是否可以设置 pin 连接哪个外设:STM32F103中,pin 在硬件上同时连到多个外设,软件负责保证只使能其中一个外设;而在STM32F072中,pin 在硬件上只能连到一个外设,并且软件可以指定 pin 连接哪一个外设。

③ pin为AFIO时,外设A是否需要引脚重映射:在STM32F103中,当外设A属于 pin 的 “Remap外设”时,软件需要控制外设A执行引脚重映射;而在STM32F072中,软件可通过配置 直接让 pin 连到外设A,因此外设A不需要引脚重映射。

④ 具有Additional functions 的pin的数量不同:在STM32F103中,只有 USB_DM/USB_DP引脚 有Additional functions;而在STM32F072中,很多引脚都有 Additional functions。
       PS:Additional functions: 当外设A是 pin 的Additional functions时,若外设A使能,则pin 强制连到外设A ,不管 pin配置的是什么模式。

参考资料

[1] STM32F103xx datasheet.

[2] STM32F10xxx reference manual.

作者:节墨之大刀

物联沃分享整理
物联沃-IOTWORD物联网 » STM32外设地图-GPIO和AFIO

发表回复