STM32单片机的GPIO功能复用及AFIO时钟

发布时间 2023-12-02 01:04:52作者: hizrd

前言

在使用STM32单片机时会发现,使用一些GPIO的一些功能的时候需要开启AFIO的时钟,但有时候却不开启AFIO的时候也可以用,外部中断的时候也需要开启这个时钟,通过查询网络上的一些资料和开发手册,把这个问题基本弄明白了,在这里简单记录下。

GPIO功能复用与重映射

image

从参考手册中可以看出,功能复用就是把GPIO的输入输出控制器与原有的输入输出寄存器断开,连到相应的外设上面,因此IO便受相应外设的控制。手册里也介绍了输入输出时复用功能应该配置的模式。
很多外设除了默认的使用的IO口,还可以进行重映射,映射到别的IO上面,这个在F103中是通过端口的重映射来进行配置的。

image

以定时器2为例,它可以进行多种重映射,如果把对应的寄存器配置了,它就会内部连接到对应的GPIO上面。
这还有一个问题,同时,一个IO会连接了内部的多个外设,这些外设同时只能使用其中的一个。可以这样说,GPIO的重映射操作就是改变了外设与GPIO之间的内部连接。

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//进行TIM3部分重映射

GPIO AFIO时钟

那么,什么时候需要开启AFIO的时钟呢?

image

可以看出,开启GPIO的复用时钟与使用GPIO的复用功能没有必然的联系,如果需要操作这些寄存器,要先开启AFIO时钟。如果我们使用的是一个GPIO的默认复用功能,就不需要改变这些寄存器,也就不需要开启AFIO时钟,如果进行了重映射的改变,外部中断线连接的配置,都改变了这些寄存器的之一或部分,所以需要开启AFIO时钟。

注意:在使用外部中断的时候也要开启GPIO的复用功能时钟,这个不要忘记。如果有GPIO的复用功能不能正常使用或者外部中断不能正常触发,不要忘了检查AFIO时钟是否开启。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启GPIO复用时钟