或许你认为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就不能用了。