一.  什么叫管脚复用

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

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

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

2)外设的复用功能映射到AF1到AF13。

3)Cortex-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实例讲解

以usart2的TX,RX为例

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

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

/*使能GPIOD时钟*/

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);

USART2在APB1总线上

/*使能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(对于串口2是PD5,PD6)配置为复用功能(ADC和DAC设置为模拟通道)。

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列出来非常详细,如下

stm32 某个io引脚不能拉高_【stm32f407】IO引脚复用和映射相关推荐

  1. io操作是指什么_各种IO模型,一篇打尽

    一.阻塞/非阻塞-同步非同步 同步/异步 同步请求:A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A; 异步请求:A调用B,B的处理是异步的,B在接到请求后先告诉A ...

  2. STM32 SPI NSS 引脚为不能拉高问题

    使用过 STM32 的SPI 的朋友可能都会发现一个问题,那就是其NSS引脚 在硬件模式下无法自动拉高,可能也因为这个原因致使  .大部分朋友在使用SPI时候都是优先选用软件 控制NSS引脚的工作模式 ...

  3. 分时线的9代表什么_股票早上快速拉高然后慢慢下跌,意味着什么?看完才知道套路...

    既然人性是与生俱来的,那么站在这个角度上来看,投机交易盈利的逻辑,一定是假设绝大多数的交易者一定会犯跟以前一样的错误, 这样自己才有可能赚取这大部分交易者的钱,才有可能获得几倍于本金的投资收益,这里需 ...

  4. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

    版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 I ...

  5. 22.IO引脚复用和映射原理与配置

    IO引脚复用和映射原理与配置 参考资料: 正点原子STM32开发板: <STM32开发指南-HAL库版本>-4.4 IO引脚复用和映射 STM32F4xx官方资料: <STM32F4 ...

  6. 模拟IIC——关于模拟IIC的IO口的配置选取推挽输出还是开漏输出,以及是否需要更改IO口输入输出模式和是否需要对IO配置上拉

    在使用模拟IIC的时候,观看别人的程序的时候发现了程序之间的一些不一样的地方 ----------------------------------代码1------------------------ ...

  7. 【stm32】史上最详细的8种IO口模式

    8种IO口模式 4种输入模式 4种输出模式 (带上拉或者下拉) 浮空输入 推挽输出 上拉输入 复用式推挽输出 下拉输入 开漏输出 模拟输入 复用式开漏输出 1.浮空输入 浮空输入模式下,I/O端口的电 ...

  8. 单片机C语言拉高1位,第二讲 单片机C语言之12864液晶显示

    前面一讲我们焊接了C51的最小系统.这讲里我们将继续焊接上液晶显示相关电路,并分别实现用12864显示一个汉字,字符串,数字,浮点数以及可调节的电子时钟. 概念 点阵式液晶显示模块(LCD)广泛应用于 ...

  9. 上拉电阻和下拉电阻_以按键举例

    一.什么是上拉电阻.什么是下拉电阻 上拉电阻和下拉电阻都是电阻元器件,所谓上拉电阻就是接电源正极,下拉的就是接负极或地. 二.上拉电阻原理及电路图 (1)上拉电阻,保证IO没有外部信号输入时,IO检测 ...

  10. 51的IO口和上拉电阻驱动

    单片机的引脚,可以用程序来控制,输出高.低电平,这些可算是单片机的输出电压. 但是,程序控制不了单片机的输出电流. 单片机的输出电流,很大程度上是取决于引脚上的外接器件. 单片机输出低电平时,将允许外 ...

最新文章

  1. 基于OpenCV的显著图绘制
  2. Python使用matplotlib可视化多分类变量组合下分组小提琴图、使用seaborn中的catplot函数可视化多分类变量组合下分组小提琴图(Categorical Plots)
  3. 正则表达式的环视深度剖析
  4. 【华为云技术分享】【论文阅读】增量学习近期进展及未来趋势预测
  5. svn从本地更新了资源库的资源后删除了某个文件夹无法恢复(已解决)
  6. 2017-9-19Linux基础知识(2)
  7. 心电图系统服务器与存储系统,心电图网络信息化管理系统
  8. 视频监控系统运维解决方案
  9. HP服务器清除bios方法
  10. linux shell 宏定义_一篇教会你写90%的shell脚本
  11. 关于文件上传失败的问题
  12. 引入时间轴:动态图模型的共性与特征
  13. 【连接池】Tomcat 连接池中 maxActive,maxWait,maxAge,testOnBorrow,testWhileIdle等选项的作用
  14. 二维三维四维vector乃至多维vector数组的建立
  15. 送给她最最浪漫的表白(Python代码实现)
  16. 用PPA下载codeblocks
  17. 计算机有哪些配件名称大全,台式机主机有哪些配件组成
  18. 苹果手机技巧,如何查男朋友手机,查岗技能大曝光!
  19. 2020天猫双十一红包口令
  20. 5G套餐正式公布!中国联通如何应对井喷5G咨询?百度知道成新入口

热门文章

  1. Java Web J2EE下的两大框架SSH和SSM对比
  2. redis 一主二从三哨兵
  3. 测试团队成功适应敏捷的障碍
  4. js 作为属性的变量
  5. 【Matlab学习笔记】【图像滤波去噪】以-4,-8为中心的拉普拉斯滤波器
  6. 【Matlab学习笔记】【图像滤波去噪】高斯平滑滤波
  7. 【LeetCode】【字符串】题号:*389. 找不同
  8. C++中的向量vector
  9. 使用ENVI5.3构建时序数据展示
  10. php 判断语句是一个作用域吗,关于php变量作用域的详细介绍_后端开发