目录
STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
例如串口1的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而用做复用功能串口1的发送接收引脚的时候,叫端口复用
那我们如何去寻找我们所需要的串口引脚呢?当然需要去查看芯片手册啦!比如我们去寻找串口2的引脚,搜索一下USART2,就能出现啦!然后找到对应引脚就好啦!
- STM32F4系列微控制器IO引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的IO口。这样可以确保共用同一个IO引脚的外设之问不会发生沖突。
- 每个IO引脚都有一个复用器,该复用器采用16路复用功能输入(AF0到AF15)可通过GPIOx AFRL(针对引脚0-7)和GPIOx AFRH(针对引脚8-15)奇存器对这些输入进行配置,每四位控制一路复用。
比如我们要选择定时器3,只需要AFRH选择AF2,就实现了端口的复用。那么如何进行选择呢?这个时候就要用到我们的AFRL寄存器以及AFRH寄存器了!
从表中可以看出,32 位寄存器 GPIOx_AFRL 每四个位控制一个 IO 口,所以每个寄存器控制 32/4=8 个 IO 口。寄存器对应四位的值配置决定这个 IO 映射到哪个复用功能 AF。
对于外设复用功能的配置,除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式,这个配置是在 IO 口对应的 GPIOx_MODER 寄存器中配置的。同时要配 置 GPIOx_AFRH 或者 GPIOx_AFRL 寄存器,将 IO 口通过复用器连接到所需要的复用功能对应的 AFx。 接下来,我们通过一个打开串口1的例子来说明一下整个流程!
- /*使能 GPIOA 时钟*/
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
- /*使能 USART1 时钟*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
- /*GPIOA9 与 GPIOA10 初始化*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9,PA10
- /*PA9 连接 AF7,复用为 USART1_TX */
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
- /* PA10 连接 AF7,复用为 USART1_RX*/
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
对于GPIO_PinAFConfig()函数,第一个参数是哪个GPIO,第二个参数为GPIO几,第三个就是确定哪个功能的,还是蛮好理解的。