STM32的复用时钟的开启和重映射功能
最近在学习STM32,在参考手册上了解到关于“复用”和“重映射”这些概念,刚开始没搞懂,通过这几天在网上查找资料和看手册,弄清楚了,先与大家分享,希望能对跟我一样的新手有所帮助吧。
为了优化64脚或100脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。设置复用
重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射。这时,复用功能不再映射到它
们的原始分配上。
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重映射表。
其他外设的重映射可以参考STM3210x手册8.3节。
不是说使用了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的外设时钟并开启对应GPIO复用功能就行了。
举例说明,默认复用功能只需开始对应外设时钟和对应GPIO复用功能即可,重映射功能除了上述之外,还需开启对应AFIO时钟。
重映射步骤为:
1.打开重映射时钟和USART重映射后的I/O口引脚时钟,
1 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能对应IO口的时钟,因为是复用功能所以还要使能AFIO时钟 |
2.I/O口重映射开启.
1 | GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); |
3.配制重映射后的引脚: 这里只需配置重映射后的I/O(PB6,PB7),原来的不需要去配置(PA9,PA10)。
1 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; |
有时候,可能重映射仍然可能失败,在第一步之前加一句话,就应该没问题了
1 | GPIO_AFIODeInit(); |
简言之,若GPIO口使用了重映射栏中的外设功能,则需要开启AFIO时钟;只使用默认复用功能时,只开启相应外设时钟无需开启AFIO时钟。