"stm32的AFIO"是什么意思?

 我来答
脏话比謊话干净
2017-12-17 · TA获得超过3045个赞
知道小有建树答主
回答量:10
采纳率:0%
帮助的人:1548
展开全部

"stm32的AFIO"意思是在程序内部,部分外设使用是复用IO口,便可以开该复用时钟。

例如在STM32F103VET6中USART3的IO口为TX/PB10,RX/PB11。假若你要是将给外设IO口映射到(TX/PC10,RX/PC11)或者(TX/PD8,RX/PD9),便需要开启AFIO时钟即可正常工作。

灰灰妈咪0
2017-12-16 · TA获得超过921个赞
知道答主
回答量:5
采纳率:100%
帮助的人:697
展开全部

在配置PC13引脚的外部线中断时,配置其外挂时钟时用到了复用功能:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);

原因是PC13的第一功能引脚是GPIO,第二功能引脚是TAMER-RTC1,并没有EXTI的功能,要想用它产生外部线中断,必须配置AFIO复用功能,将EXTI功能映射到PC13引脚上。

PC13引脚功能图

又例:

CAN总线用到了PB8、PB9,而这两个引脚本身没有CAN功能,需要重映射:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);


PB8、PB9引脚功能图

CAN&485 TR引脚图

而有的配置是不需要配置复用功能的,例如:UASRT1的引脚PA9、PA10,它们的第二功能引脚就是USART功能,所以在使用UASRT功能的时候,就不能再AFIO配置时钟。

在配置RCC外挂时钟的时候,既要配置基础的GPIO模式,又要配置其第二功能USART的时钟。

而用到了PA9的第二引脚,有一种输出模式是复用输出模式,所以要配置成复用输出模式。

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;


由于USART和GPIOA都外挂在RCC_APB2上,所以参数是两个值的组合。

/* config USART1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);


也许你以为IO和AFIO是很简单的,事实上有几个误区可能很多人都没注意过,当你只用现成的开发板来学习的时候,别人已经帮你做好了资源分配.所有的外设功能学习都是照着别人给你的例程去做的,这才没让你觉得奇怪。

先问自己一个问题:STM32中,USART2和TIM2是共用相同IO的,你如何决定这几个IO到底是做USART2还是做TIM2呢?如果你要同时使用USART2和TIM2,该怎么办?

1、不是说使用了IO的复用功能就一定要启动RCC_APB2Periph_AFIO的Clock的,参考下图

只有使用了AFIO的事件控制寄存器、AFIO的重映射功能以及外部中断(EXTI)控制寄存器才需要开启AFIO的时钟,STM32参考手册从来没说过使用IO的复用功能就一定要开启AFIO时钟,这是个误区。

例如下面的,最常用的USART1,如果你的板子上,默认用的就是PA9和PA10这两个IO作为USART1的TX和TX,那么也就是没有重映射,No Remap,这种情况下根本不需要开启AFIO时钟,只要开启USART1的外设时钟就行了。这个实验很简单,自己试试就知道了。

2、从上面的图你可以看到,原来USART1是可以放在PB6和PB7上面的,只不过几乎所有的原理图封装中都不会在PB6和PB7的复用功能上标出它可以当USART1用,毕竟这种重映射的情况太多,几乎所有外设都可以重映射,每个都标出来会非常混乱。

STM32中,USART2的CTS、RTS、TX、RX和TIM2的CH1~CH4都在PA0~PA3上面,具体要如何选择这两个功能呢?

如果要使用USART2,就开始USART2的外设时钟,如果要使用TIM2,就开启TIM2的外设时钟,如果你同时开启,我也不知道会怎么样,你可以自己试试,我觉得应该是两个都不能用。如果你一定要在PA0~PA3上使用这两个功能,只能是时分复用。

正确的同时使用USART2和TIM2,应该是使用上面提到的AFIO_Remap寄存器,将其中的一个重映射到其他IO上去,当然这样其他IO的本身的复用功能你就不能开启了。

回到前面的问题,如果你不做Remap,你根本不可能同时在PA0~PA3上同时使用这两个外设,现在你的方案有两种:

一、保留USART2在PA口上,将TIM2完全重映射(Full Remap)到其他IO上,或者,如果你不用RTS和CTS的硬件流控制,PA0(CTS)和PA1(RTS)上对应的CH1和CH2是可以不用重映射的,只需要将Bit9:8改成10,也就是将CH3和CH4部分重映射到PB10和PB11上去,而CH1和CH2继续保留在PA0和PA1上。但这种情况下,PB10和PB11上的I2C2和USART3就不能用了。

二、保留TIM2在PA口,将USART2重映射到PD口上,很明显,当TIM2完全不重映射时,USART2必须的信号线只有Clock不受影响,这种情况下也没有部分映射可言了,必须将USART2完全重映射到PD3~PD7上,同样的,这种情况下FSMC就不能用了。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式