IO口的复用
最近在学习STM32,在BZ上一篇关于的串口通信文章里有这么一段代码:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);
当初是参考开发的例子写的,一直对GPIOD或上“RCC_APB2Periph_AFIO”这句话的意思没搞懂,通过这几天在网上查找资料和看手册,终于高清楚了,不敢独享,希望能对跟我一样的新手有所帮助吧o(∩_∩)o...
一、
STM32上有很多I/O口,也有很多的内置外设,像I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多内置外设的I/O复用引脚可以通过重映射功能,从不同的I/O管脚引出,即使用了复用功能的引脚是可通过程序改变的。
知道了这些我们就不难理解上面代码的意思了,程序中用到的USART2外设的TX,RX分别对应PA2,PA3,但是我的学习板上的PA2,PA3引脚接了其他设备,但是为了还要用USART2,
“RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO”就打开了GPIOD重映射功能,把USART2设备的TX,RX映射到PD5,PD6上,我们在这两个引脚上接上MAX232串口芯片就可以使用USART2串口通信了。
那各位看官该问:“USART2是不是可以映射到任意管脚呢?”
答案是否定的,它只能映射到固定的管脚,下图是USART2重映射表
其他外设的重映射可以参考STM32100X手册。
二、
为了节省IO资源单片机会在一个IO上复用很多功能,一般来说,单片机IO口用到了一个功能后就能再用另外的复用功能(对应的外设)了,这就体现出了STM32 GPIO的强大了,我们用重映射的方法把其中一个外设映射到其他IO脚上,这样就可以充分利用片内资源!
也许你以为IO和AFIO是很简单的,事实上有几个误区可能很多人都没注意过,当你只用现成的开发板来学习的时候,别人已经帮你做好了资源分配,所有的外设功能学习都是照着别人给你的例程去做的,这才没让你觉得奇怪。
先问自己一个问题:STM32中,USART2和TIM2是共用相同IO的,你如何决定这几个IO到底是做USART2还是做TIM2呢?如果你要同时使用USART2和TIM2,该怎么办?
1、不是说使用了IO的复用功能就一定要启动RCC_APB2Periph_AFIO的Clock的,参考下图
只有使用了AFIO的事件控制寄存器(AFIO_EVCR)、AFIO的重映射功能(AFIO_MAPR)以及外部中断(AFIO_EXTICRx)控制寄存器才需要开启AFIO的时钟,STM32参考手册从来没说过使用IO的复用功能就一定要开启AFIO时钟,这是个误区。
例如下面的,最常用的USART1,如果你的板子上,默认用的就是PA9和PA10这两个IO作为USART1的TX和RX,那么也就是没有重映射(No Remap)这种情况下根本不需要开启AFIO时钟,只要开启USART1的外设时钟就行了。这个实验很简单,自己试试就知道了。
2、从下面的图你可以看到,原来USART1是可以放在PB6和PB7上面的,只不过几乎所有的原理图封装中都不会在PB6和PB7的复用功能上标出它可以当USART1用,毕竟这种重映射的情况太多,几乎所有外设都可以重映射,每个都标出来会非常混乱。