AFIO简介
AFIO,直译为:复用输入输出,是STM32上众多的片上外设之一;我们知道当IO引脚复用功能冲突时,可以通过重映射来解决这个问题,而AFIO就是专门用来执行"复用功能的重映射"的模块(可以看出其名字与功能并不一致)。
注意,IO重映射只是重映射的一种。
查表重映射(流程)
在STM32的芯片上有许许多多的片上外设,其中有一部分片上外设能够使用AFIO模块,对它的复用功能进行重映射。因此,在STM32的参考手册(RM0008)中,不同模块的重映射使用方法分别用一个小节来解释(共12小节,即12个模块的重映射功能),并且是我们编程AFIO的依据。
1、分配引脚功能
假如我们要同时使用定时器1与串口通信(如下图所示),在分配IO引脚时就会发现冲突:定时器1的四个通道(CH1、CH2、CH3、CH4)所对应IO引脚分别为PA8、PA9、PA10、PA11;而串口通信的Px、Tx所对应IO引脚为PA10、PA9,因此两组引脚冲突。
此时要通过AFIO解决引脚冲突(重新分配引脚功能),分别查一下这两个片上外设的IO重映射表。如下图所示,为定时器1的重映射表。
2、定时器重映射表
可以看出有3个映射方案:
方案一 | 无重映射 | 重映射值=00 | 使用默认(通用)情况下的IO引脚 |
方案二 | 部分重映射 | 重映射值=01 | 对模块的一部分引脚重映射 |
方案三 | 完全重映射 | 重映射值-11 | 对模块的所有引脚重映射 |
可以看出在此工程下,定时器1无法使用重映射:方案1、2不改变对应的IO引脚;方案3虽然能改变引脚,但对于C8T6芯片而言,不存在GPIOE,故无法使用重映射。
3、串口重映射表
其表格分为两列:
第一列REMAP=0,即无重映射,使用默认的IO引脚;
第二列REMAP=1,进行重映射,IO引脚被改变;
因此可以使用USART1的重映射,来解决引脚冲突的问题。
AFIO的标准库函数
AFIO的驱动程序
在STM32的标准库的文件夹中存在一个一个的模块(h和c文件),例如:GPIO模块的驱动就位于stm32f10x_gpio.h(头文件)和stm32f10x_gpio.c(源文件)这两个文件中。
值得注意的是,AFIO的编程接口同样放在stm32f10x_gpio.h和stm32f10x_gpio.c这两个文件中,也就是说和GPIO驱动放在了一块。
AFIO编程接口
AFIO一共有4个编程接口(库函数),如下图所示:
GPIO_PinRemapConfig
要想实现上例工程,需要配置IO引脚的重映射,故使用GPIO_PinRemapConfig函数即可。对于GPIO_PinRemapConfig函数,有两个参数,第一个为需要配置重映射的具体模块和方案;第二个为开启/关闭选择。
以定时器1为例:参数GPIO_PartialRemap_TIM1是指定时器1模块、方案2;GPIO_FullRemap_TIM1指定时器1、方案3。