STM32芯片为了实现低功耗,设计了一个功能完善但是非常复杂的时钟系统。相比于普通的MCU配置好GPIO的寄存器既可以使用,STM32的GPIO在使用之前开需要开启外设时钟。而GPIO对应的各个外设均配置了时钟开关,为减少STM32整体功耗,仅在需要使用该设备时开启相应外设的时钟。
在开启外设时钟前,首先需要参考系统结构图,知道外设挂在在哪个中线上,以GPIOA Pin9为例说明,查询系统结构图知道GPIOA挂载在APB2上:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIOA Pin9为串口的发送端,为使用串口,同时要开启串口时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
上述是一般外设的时钟配置过程,而在一些特殊使用中需要打开复用时钟,也就是AFIO:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
很多资料中并没有写明何时需要开启AFIO,有些资料中显示使用复用功能时需要开启该时钟,由此我决定查询手册记录备案。
查询STM32参考手册可知:
由上图可知在我们需要配置AFIO的AFIO_EVCR、AFIO_MAPR和AFIO_EXTICRX时需要打开AFIO时钟。
AFIO_EVCR:事件控制寄存器
AFIO_MAPR:重映射和调试IO寄存器
AFIO_EXTICRX:外部中断配置寄存器
由此可见,在使用“重映射”、“调试IO”、“事件控制”、“外部中断”时需要打开AFIO复用时钟,而在使用引脚复用功能是并需要打开AFIO时钟。