【STM32F4】⼆、IO引脚的复⽤和映射
⽬录
注:本博⽂只是对正点原⼦课程的⼜⼀次重复,总结正点的教程、写⼀些⾃⼰的感悟,并⾮以原创之名做抄袭之事。
STM32F4芯⽚数据⼿册的下载地址:
⼀、基本概念
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);