AFIO时钟
在使用片内外设时候,有时候会疑惑,什么时候需要编写打开复用功能AFIO时钟这一条语句?
即
//打开复用功能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
AFIO
复用引脚的出现,是因为一方面我们希望单片机面积小,但是引脚数量是有限的,另一方面一个产品中并不会使用单片机的全部功能,所以把片上外设的引脚和GPIO引脚进行了共用,也就是复用(重复使用)。
看下I/O段端口结构
当使用片上外设时,该引脚就是开启了复用功能AF,此时称其为复用引脚AFIO,否则就是普通的GPIO。
在参考手册中就对AF进行了详尽的描述:
当片上外设输出时,输入并没有与IO端口断开,我们仍然可以读取IO端口电平。AF是没有复用输入模式的,只有输入模式。
理论上当需要使用片上外设时候,都需要开启AFIO时钟,但是为什么一些就不需要,直接开启相应外设时钟就可以了?
何时需要编写打开AFIO时钟
如果直接挂载在APB1/2总线下的外设,直接打开外设时钟就可以了。
需要打开AFIO时钟语句的情况:
-
APB1的外设引脚需要重映射到APB2,因为AFIO时钟是在APB2总线下。
-
使用到外部中断,因为外部中断使用到了AFIO相应寄存器,所以也需要打开AFIO时钟这条语句。
在参考手册AFIO寄存器那里其实就写明了,详细的可以看一下。
举例,将APB1总线下TIM3的CH1、CH2和CH3根据重映射表,进行完全重映射到APB2总线下的PC端口。
//打开要映射到的GPIOC和复用功能时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE );
//打开定时器3时钟
RCC_APB1PeriphClockCmd(HALL_TIM_CLK,ENABLE);
//使能引脚完全重映射
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);