当前位置:网站首页>(十一)STM32——IO引脚复用与映射
(十一)STM32——IO引脚复用与映射
2022-07-23 15:20:00 【Meursault639】
目录
端口复用
STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
例如串口1的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而用做复用功能串口1的发送接收引脚的时候,叫端口复用
那我们如何去寻找我们所需要的串口引脚呢?当然需要去查看芯片手册啦!比如我们去寻找串口2的引脚,搜索一下USART2,就能出现啦!然后找到对应引脚就好啦!

端口复用映射原理
- STM32F4系列微控制器IO引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的IO口。这样可以确保共用同一个IO引脚的外设之问不会发生沖突。
- 每个IO引脚都有一个复用器,该复用器采用16路复用功能输入(AF0到AF15)可通过GPIOx AFRL(针对引脚0-7)和GPIOx AFRH(针对引脚8-15)奇存器对这些输入进行配置,每四位控制一路复用。
GPIOx AFRL
GPIOx AFRH
比如我们要选择定时器3,只需要AFRH选择AF2,就实现了端口的复用。那么如何进行选择呢?这个时候就要用到我们的AFRL寄存器以及AFRH寄存器了!

从表中可以看出,32 位寄存器 GPIOx_AFRL 每四个位控制一个 IO 口,所以每个寄存器控制 32/4=8 个 IO 口。寄存器对应四位的值配置决定这个 IO 映射到哪个复用功能 AF。
对于外设复用功能的配置,除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式,这个配置是在 IO 口对应的 GPIOx_MODER 寄存器中配置的。同时要配 置 GPIOx_AFRH 或者 GPIOx_AFRL 寄存器,将 IO 口通过复用器连接到所需要的复用功能对应的 AFx。 接下来,我们通过一个打开串口1的例子来说明一下整个流程!
流程
- 首先,我们要使用 IO 复用功能外设,必须先打开对应的 IO 时钟和复用功能外设时钟。
/*使能 GPIOA 时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
/*使能 USART1 时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);- 其次,我们在 GIPOx_MODER 寄存器中将所需 IO(对于串口 1 是 PA9,PA10)配置为复用功能(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- 最后,我们配置 GPIOx_AFRL 或者 GPIOx_AFRH 寄存器,将 IO 连接到所需的 AFx。 这些步骤对于我们使用库函数来操作的话,是调用的 GPIO_PinAFConfig 函数来实现的。具 体操作代码如下:
/*PA9 连接 AF7,复用为 USART1_TX */
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
/* PA10 连接 AF7,复用为 USART1_RX*/
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);对于GPIO_PinAFConfig()函数,第一个参数是哪个GPIO,第二个参数为GPIO几,第三个就是确定哪个功能的,还是蛮好理解的。
边栏推荐
- LeetCode_ 724_ Find the central subscript of the array
- Implementation of deep copy deepclone
- 分析optimism重放合约地址攻击事件
- 基于OpenPGP的文件管理系统
- Keras之二分类问题
- 数智化时代文旅遇新机?中国移动咪咕造 “元宇宙第一岛”
- Trust sums two numbers
- Redis distributed lock, it's really impossible without it
- TwinCAT 3 首次运行报错4115
- JDBC program example using Preparedstatement
猜你喜欢

@Bean 注解的方法调用多次会创建多个bean 实例吗

rust中的静态分发和动态分发

Trust guessing numbers game

USB Type-C PD CC逻辑芯片中的角色定义

SAP HANA数据库备份失败解决办法

Solutions to sap Hana database backup failure

Don't ask me again why MySQL hasn't left the index? For these reasons, I'll tell you all

idea debug常用操作

Visualization of network infrastructure

为啥一问 JVM 就 懵B ???
随机推荐
LeetCode_ 724_ Find the central subscript of the array
LeetCode_动态规划_中等_120.三角形最小路径和
你真的了解Redis的持久化机制吗?
MinGW-w64的安装及配置教程
WARNING: Your password has expired.Password change required but no TTY available.
Why do you get confused when you ask JVM???
Thread pool, who am I? Where am I?
乘风破浪!金融科技时代下的数字化转型之路
面试官:MySQL 数据库查询慢,除了索引问题还可能是什么原因?
leetcode刷题:动态规划04(不同路径)
curl get&post
Phpstrom shortcut key
Tapdata 与优炫数据库完成产品兼容性互认证
idea debug常用操作
从马尔可夫链到GPT,字节跳动AI Lab总监李航细说语言模型的前世今生
Sublime text tips
PDO operation
computed在项目中的使用
LeetCode_ 455_ Distribute cookies
[pytorch] basic use 7. GPU allocation