首页 > 技术文章 > AFIO时钟

ckk-blog 2020-11-21 23:48 原文

在使用片内外设时候,有时候会疑惑,什么时候需要编写打开复用功能AFIO时钟这一条语句?

  //打开复用功能时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

AFIO

复用引脚的出现,是因为一方面我们希望单片机面积小,但是引脚数量是有限的,另一方面一个产品中并不会使用单片机的全部功能,所以把片上外设的引脚和GPIO引脚进行了共用,也就是复用(重复使用)。

看下I/O段端口结构

当使用片上外设时,该引脚就是开启了复用功能AF,此时称其为复用引脚AFIO,否则就是普通的GPIO。

在参考手册中就对AF进行了详尽的描述:

当片上外设输出时,输入并没有与IO端口断开,我们仍然可以读取IO端口电平。AF是没有复用输入模式的,只有输入模式。

理论上当需要使用片上外设时候,都需要开启AFIO时钟,但是为什么一些就不需要,直接开启相应外设时钟就可以了?

何时需要编写打开AFIO时钟

如果直接挂载在APB1/2总线下的外设,直接打开外设时钟就可以了。

需要打开AFIO时钟语句的情况:

  1. APB1的外设引脚需要重映射到APB2,因为AFIO时钟是在APB2总线下。

  2. 使用到外部中断,因为外部中断使用到了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); 

推荐阅读