深入理解STM32F4库函数中GPIO_PinAFConfig()函数及复用功能解析

1、文章概述:在跟着野火学习STM32F07课程使,到串口这一章节,我不太理解GPIO_PinAFConfig()函数的意思。后来经过,查找资料,自己计算GPIO_PinAFConfig()函数内的内容,最终理解的GPIO_PinAFConfig()函数的意思是:将外设(形参一)的某个引脚(形参二)用作什么功能(参数三)。那么在这里的意思是将GPIOA的9、10引脚用作USART1。当然,在stm32F07的手册中也说明了PA9和PA10分别作为串口1的TX和RX。

2、怎么发现的问题?在做实验:实现USART1的通信控制RGB中,发现使用到了GPIO_PinAFConfig()这一函数,却无法理解其意思,野火的代码在这里的只有简单的注释。

下面我将野火的代码拷一下:

void USARTx_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
		
  RCC_AHB1PeriphClockCmd(USARTx_RX_GPIO_CLK|USARTx_TX_GPIO_CLK,ENABLE);

  /* 使能 USART 时钟 */
  USARTx_CLOCKCMD(USARTx_CLK, ENABLE);
  
  /* GPIO初始化 */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
  /* 配置Tx引脚为复用功能  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin =  USARTx_TX_PIN  ;  
  GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure);

  /* 配置Rx引脚为复用功能 */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin =  USARTx_RX_PIN;
  GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure);
  
 /* 连接 PA10 到 USART1__R10*/
 // 意思是想把GPIOA的引脚PA10复用成USART1
  GPIO_PinAFConfig(USARTx_RX_GPIO_PORT,USARTx_RX_SOURCE,USARTx_RX_AF);

  /*  连接 PA9 到 USART1_T9*/
  // 意思是想把GPIOA的引脚PA9复用成USART1
  GPIO_PinAFConfig(USARTx_TX_GPIO_PORT,USARTx_TX_SOURCE,USARTx_TX_AF);
  
  /* 配置串DEBUG_USART 模式 */
  /* 波特率设置:DEBUG_USART_BAUDRATE */
  USART_InitStructure.USART_BaudRate = USARTx_BAUDRATE;
  /* 字长(数据位+校验位):8 */
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;	
  /* 停止位:1个停止位 */
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  /* 校验位选择:偶校验 */  
	USART_InitStructure.USART_Parity = USART_Parity_No;
  /* 硬件流控制:不使用硬件流 */
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  /* USART模式控制:同时使能接收和发送 */
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  /* 完成USART初始化配置 */
  USART_Init(USARTx, &USART_InitStructure); 
	
  /* 使能串口 */
  USART_Cmd(USARTx, ENABLE);
}

代码来自野火

3、解释GPIO_PinAFConfig()函数。

先说我弄懂后的最终理解,即GPIO_PinAFConfig()函数在这里的意思是将GPIOA的9、10引脚用作USART1。

(1)USART1的写和读引脚如下所示,其中PA9用作TX(写),PA10用作RX(读)。将PA9和PA10 GPIO初始化后,我们需要将其复用为USART1(我的理解是告诉芯片,我要用这两个引脚当串口1的读写接口了)。

 图一

(2)在AFRH9[3:0]和AFRH10[3:0]这里的取值就是用来描述PA9和PA10 要被复用成什么功能,这里每个引脚都是4位来描述,取值0~15分别选择AF0~AF15,每个AFx都有其意思,如图三所示。AF7表示串口1、2、3。所以这里AFRH9[3:0]和AFRH10[3:0]都要置为0b0111。那么这里只需要使用GPIO_PinAFConfig()函数就可以将GPIOA的AFRH寄存器的AFRH9[3:0]和AFRH10[3:0]置为0b0111。

 图二

图三 

4、在理解这块内容的时候看了下面的这篇文章,对此表示感谢。大家也可以去看看,该作者对这个函数内容进行了详细的解释。对于STM32F4库函数中GPIO_PinAFConfig()函数的解读-爱码网 (likecs.com)

物联沃分享整理
物联沃-IOTWORD物联网 » 深入理解STM32F4库函数中GPIO_PinAFConfig()函数及复用功能解析

发表评论