Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

【stm32f407】IO引脚复用和映射

$
0
0

一.  什么叫管脚复用

STM32F4有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。

STM32F4系列微控制器IO引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的IO口。这样可以确保共用同一个IO引脚的外设之间不会发生冲突。每个IO引脚都有一个复用器,该复用器采用16路复用功能输入(AF0AF15),可通过GPIOx_AFRL(针对引脚0-7)GPIOx_AFRH(针对引脚8-15)寄存器对这些输入进行配置,每四位控制一路复用:

1)完成复位后,所有IO都会连接到系统的复用功能0AF0)。

2)外设的复用功能映射到AF1AF13

3Cortex-M4EVENTOUT映射到AF15

      如图:

      

上图是针对引脚0-7,对 于引脚8-15,控制寄存器为GPIOx_AFRH。从图中可以看出。当需要使用复用功能的时候,我们配置相应的寄存器GPIOx_AFRL或者GPIOx_AFRH,让对应引脚通过复用器连接到对应的复用功能外设。这里我们列出GPIOx_AFRL寄存器的描述,

GPIOx_AFRH的作用跟GPIOx_AFRL类似,只不过GPIOx_AFRH控制的是一组IO口的高八位,GPIOx_AFRL控制的是一组IO口的低八位

寄存器分别如下:


二.  USART实例讲解

usart2TX,RX为例

USART2TX,RX对应的PIN脚分别为:PD5,PD6

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

/*使能GPIOD时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);

USART2APB1总线上

/*使能USART2时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

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

void  RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph,FunctionalState NewState);
void  RCC_AHB2PeriphClockCmd(uint32_tRCC_AHB2Periph, FunctionalState NewState);
void  RCC_AHB3PeriphClockCmd(uint32_tRCC_AHB3Periph, FunctionalState NewState);
void   RCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph, FunctionalState NewState);
void  RCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph, FunctionalState NewState);

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

2) 其次,我们在GIPOx_MODER寄存器中将所需IO(对于串口2PD5,PD6)配置为复用功能(ADCDAC设置为模拟通道)。

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

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

/*GPIOD5与GPIOD6初始化*/
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5 | GPIO_Pin_6; 
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(GPIOD,&GPIO_InitStructure);//初始化PD5,PD6

      4)最后,我们配置GPIOx_AFRL或者GPIOx_AFRH寄存器,将IO连接到所需的AFx。这些步骤对于我们使用库函数来操作的话,是调用的

      

GPIO_PinAFConfig函数来实现的。具体操作代码如下:
/*PD5连接AF7,复用为USART2_TX */
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2);
/* PD6连接AF7,复用为USART2_RX*/
GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2);

对于函数GPIO_PinAFConfig函数,入口第一个第二个参数很好理解,可以确定是哪个IO

对于第三个参数,实际上我们确定了这个IO到底是复用为哪种功能之后,这个参数也很好选择,因为可选的参数在stm32f4xx_gpio.h列出来非常详细,如下

 

 

作者:XiaoXiaoPengBo 发表于2017/6/5 15:04:47 原文链接
阅读:147 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles