STM32外设地图-GPIO和AFIO
一、关键概念
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.
作者:节墨之大刀