步遥情感网
您的当前位置:首页STM32的复用时钟的开启和重映射功能

STM32的复用时钟的开启和重映射功能

来源:步遥情感网

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外设的TXRX分别对应PA2PA3,但是我的学习板上的PA2,PA3引脚接了其他设备,但是为了还要用USART2

“RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO”就打开了GPIOD重映射功能USART2设备的TXRX映射到PD5,PD6上,我们在这两个引脚上接上MAX232串口芯片就可以使用USART2串口通信了。

各位看官该问:“USART2是不是可以映射到任意管脚呢?

答案是否定的,它只能映射到固定的管脚,下图是USART2重映射表

 

其他外设的重映射可以参考STM32100X手册。

二、

 

为了节省IO资源单片机会在一个IO上复用很多功能,一般来说,单片机IO用到一个功能后就能再用外的复用功能(对应的外设),这就体现出了STM32 GPIO的强大了,我们用重映射的方法把其中一个外设映射到其他IO脚上,这样就可以充分利用片内资源!

  

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

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

 

 

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

 

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

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

 

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

因篇幅问题不能全部显示,请点此查看更多更全内容