答应我,别再踩AFIO的误区了!

一、前言

今天发现了这样一个问题!?我在回顾ADC的基本配置的时候,发现ADC不是复用的IO引脚吗?为什么没有打开AFIO时钟!?奇了怪了!难道,我写错了?这就带着这个疑问来寻求答案了~

你看,下面便是证据,还真的就是完全不见AFIO的踪影!!

说在前面:我用的是沁恒的一款芯片,型号是ch32v20xc8t6,是一款RISC-V架构的芯片。其实跟STM32蛮像的,核心都一样。ADC1也是挂载在APB2上的。

二、AFIO是什么?

AFIO也就是复用管脚。顾名思义,一个引脚可以拥有多重身份,可以不只是作为一个普通的输入输出IO使用。也可以当作其他外设的IO口。其实也就是,MCU的引脚资源是有限的,需要更加合理的分配,也就出现了管脚复用的现象。

三、需要打开AFIO时钟的场合

直接上干货!就不赘述了。

  1. 使用了AFIO的事件控制器。

  2. 使用了AFIO的重映射功能(这个是很特殊的!外设引脚发生冲突,且要从APB1映射到APB2)。

  3. 使用了外部中断(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上。其他的同理~

如有侵权,联系删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值