【STM32F4】二、I/O引脚的复用和映射

您所在的位置:网站首页 stm32引脚复用功能 【STM32F4】二、I/O引脚的复用和映射

【STM32F4】二、I/O引脚的复用和映射

#【STM32F4】二、I/O引脚的复用和映射| 来源: 网络整理| 查看: 265

目录 一、基本概念1. 什么是I/O引脚?2. 什么是I/O引脚的复用? 二、如何配置I/O引脚复用?1. 复用器(GPIOx_AFRL/GPIOx_AFRH)和复用功能(AF)2. 程序编写2.1 打开I/O时钟和复用功能对应外设时钟2.2 配置I/O引脚的模式2.3 配置相应的复用器

注:本博文只是对正点原子课程的又一次重复,总结正点的教程、写一些自己的感悟,并非以原创之名做抄袭之事。

STM32F4芯片数据手册的下载地址:只要5积分!

一、基本概念 1. 什么是I/O引脚?

I 是 input 之意,O 是 output 之意。I/O引脚就是芯片的输入输出管脚。主要是与外部设备进行数据交换的端口。

STM32F4共有 144个引脚 ,其中 112个是I/O引脚;另外的32个是 电源脚,复位脚,特殊功能脚等。

2. 什么是I/O引脚的复用?

来看下面这张图: 在这里插入图片描述 在类似上面的芯片原理图上经常可以看到GPIO端口后边接很长一串,比如PA9/USART1_TX/TIM1_CH2,意思就是PA9引脚除了可以作为简单的I/O输入输出电平,还可以有复用功能,可以复用为USART1_TX或TIM1_CH2。什么引脚复用为什么功能不是瞎定的,而是有根据的,根据就是芯片数据手册,里边会有一个表,叫做复用功能映射表(如下图所示),可以列出所有端口的所有复用功能。

复用功能映射表(部分): 在这里插入图片描述 如上表中PE2,除了做I/O口连接外设,还可以作为TRACECLK、FSMC_A23等复用功能。

二、如何配置I/O引脚复用? 1. 复用器(GPIOx_AFRL/GPIOx_AFRH)和复用功能(AF)

每组I/O口都对应着一个复用器,如GPIOA对应着一个复用器、GPIOB对应着一个复用器……每个复用器分为两部分,如GPIOA对应的复用器分为GPIOA_AFRL、GPIOA_AFRH两部分,其中GPIOx_AFRL负责低8位引脚,即PA0 ~ PA7;而GPIOx_AFRH负责高8位引脚,即PA8 ~ PA15。

复用器有什么作用呢?

它能控制每个引脚的复用功能(AFx),AF的选择范围为 AF0 ~ AF15,但并不是每个引脚都有16个AFx起作用,大部分情况下每个引脚只有3~6个复用功能,其他的AFx都没用;如GPIOA_AFRL可以控制PA0引脚,它的复用功能如下图所示: 在这里插入图片描述 虽然AF的范围有AF0 ~ AF15,但只有AF1、AF2、AF3、AF7、AF8、AF11、AF15起作用,其他的都为空,是非法值。

2. 程序编写 2.1 打开I/O时钟和复用功能对应外设时钟

首先,我们要使用 IO 复用功能外设,必须先打开对应的 IO 时钟和复用功能外设时钟。如:

/*使能 GPIOA 时钟*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); /*使能 USART1 时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

这里需要说明一下,官方库提供了五个打开 GPIO 和外设时钟的函数分别为:

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState); void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState); void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState); void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

这五个函数分别用来打开相应的总线下 GPIO 和外设时钟。比如我们的串口 1 是挂载在 APB2 总线之下,所以我们调用对应的 APB2 总线下外设时钟使能函数 RCC_APB2PeriphClockCmd 来使能串口 1 时钟。对于其他外设我们调用相应的函数即可。

2.2 配置I/O引脚的模式

其次,我们在 GIPOx_MODER 寄存器中将所需 IO配置为复用功能(若是复用ADC 或 DAC外设,则设置为模拟功能)。

再次,我们还需要对 IO 口的其他参数,例如类型,上拉/下拉以及输出速度。

上面两步,在我们库函数中是通过 GPIO_Init 函数来实现的,参考代码如下:

/*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 2.3 配置相应的复用器

最后,我们配置 GPIOx_AFRL 或者 GPIOx_AFRH 寄存器,将 IO 连接到所需的 AFx。

这些步骤对于我们使用库函数来操作的话,是调用的 GPIO_PinAFConfig 函数来实现的。具体操作代码如下:

/*PA9 连接 AF7,复用为 USART1_TX */ /*此处并没有体现出 AF7,因为它已经在宏定义中等同于 GPIO_AF_USART1 了*/ GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); /* PA10 连接 AF7,复用为 USART1_RX*/ /*此处并没有体现出 AF7,因为它已经在宏定义中等同于 GPIO_AF_USART1了 */ GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3