STM32 中的大部分 GPIO 都有复用功能,所以对于有复用功能的 I/O 引脚,还要开启其复用功能时钟。如 GPIO 的 pin4 可以用作 ADC1 的输入引脚,当我们把它作为 ADC1 使用时,需要开启 ADC1 的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
另外, STM32 的所有 GPIO 都引入到 EXTI 外部中断线上,使得所有的 GPIO 都能作为外部中断的输入源。所以如果把 GPIO 用作 EXTI 外部中断时,还需要开启 AFIO 时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
那么,问题来了!
AFIO 是什么?AFIO 时钟什么时候需要开启?
我们从《STM32中文参考手册_V10》中找到:对寄存器 AFIO_EVCR、AFIO_MAPR 和 AFIO_EXTICRX 进行读写操作前,应当首先打开 AFIO 的时钟(设置 APB2 外设时钟使能寄存器 RCC_APB2ENR)。
也就是说:当你需要配置 AFIO 这些寄存器的时候,就需要把 RCC_APB2ENR 寄存器的 AFIO 位置‘1’打开 AFIO 时钟。
跟 AFIO 相关的寄存器有:
事件控制寄存器(AFIO_EVCR)
复用重映射和调试I/O 配置寄存器(AFIO_MAPR)
外部中断配置寄存器1(AFIO_EXTICR1)
外部中断配置寄存器2(AFIO_EXTICR2)
外部中断配置寄存器3(AFIO_EXTICR3)
外部中断配置寄存器4(AFIO_EXTICR4)