一、前言
今天发现了这样一个问题!?我在回顾ADC的基本配置的时候,发现ADC不是复用的IO引脚吗?为什么没有打开AFIO时钟!?奇了怪了!难道,我写错了?这就带着这个疑问来寻求答案了~
你看,下面便是证据,还真的就是完全不见AFIO的踪影!!
说在前面:我用的是沁恒的一款芯片,型号是ch32v20xc8t6,是一款RISC-V架构的芯片。其实跟STM32蛮像的,核心都一样。ADC1也是挂载在APB2上的。
二、AFIO是什么?
AFIO也就是复用管脚。顾名思义,一个引脚可以拥有多重身份,可以不只是作为一个普通的输入输出IO使用。也可以当作其他外设的IO口。其实也就是,MCU的引脚资源是有限的,需要更加合理的分配,也就出现了管脚复用的现象。
三、需要打开AFIO时钟的场合
直接上干货!就不赘述了。
-
使用了AFIO的事件控制器。
-
使用了AFIO的重映射功能(这个是很特殊的!外设引脚发生冲突,且要从APB1映射到APB2)。
-
使用了外部中断(EXTI)控制寄存器。
举个例子,就以第二个为例:AFIO的重映射功能。
比如:
USART1的USART1_TX与USART1_RX默认映射的位置分别是PA9、PA10。当这两个引脚被其他外设占用的时候,我们让USART1让位,重映射到其他地方去。这里切记,看手册。我们给它重映射到PB6、PB7的位置去。
怎么映射呢?来看看流程吧。
第一步:使能IO端口的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
第二步:使能被映射的外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART1,ENABLE);
第三步:使能AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
第四步:打开重映射
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
好了,到这里就可以啦!
四、溯源,为什么ADC1不用打开AFIO时钟!?
我们来回顾一下,使用ADC1符合上一个标题开头提及的三个中的哪一个呢?很明显,它哪个也不符合。它并没有发生引脚冲突,不需要从APB1挪到APB2去。它本身就挂载在APB2上!所以不用打开AFIO时钟。
总结:
挂载在APB2上的外设是不用打开AFIO的时钟的,只需要打开对应的GPIO及本身的时钟即可!
五、为什么是从APB1的映射到APB2?
挂载在APB1上的外设,它和别的外设使用了一样的引脚,发生了冲突是需要重映射的。那为什么非要重映射到APB2呢?APB1不行吗!?凭什么!这不公平,哈哈,因为你要映射的普通GPIO引脚全都挂载在APB2上,无路可去,只能到APB2啊!
另外要注意,AFIO也挂载在APB2上哦。所以你需要打开要用的GPIO的时钟,打开要映射的外设时钟,打开AFIO时钟,再打开重映射就可以啦。
六、不可以随意映射到某个引脚
为什么!?来看手册!以串口为例吧。
USART2只能映射到PD5和PD6上。其他的同理~
如有侵权,联系删除。