• (十一)STM32——IO引脚复用与映射


    目录

    端口复用

    端口复用映射原理 

    GPIOx AFRL

    GPIOx AFRH ​

    流程


    端口复用

            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 时钟和复用功能外设时钟。 
    1. /*使能 GPIOA 时钟*/
    2. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    3. /*使能 USART1 时钟*/
    4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    • 其次,我们在 GIPOx_MODER 寄存器中将所需 IO(对于串口 1 是 PA9,PA10)配置为复用功能(ADC 和 DAC 设置为模拟通道)
    • 再次,我们还需要对 IO 口的其他参数,例如类型,上拉/下拉以及输出速度。 上面两步,在我们库函数中是通过 GPIO_Init 函数来实现的,参考代码如下:
    1. /*GPIOA9 与 GPIOA10 初始化*/
    2. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    3. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    4. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
    5. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
    6. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
    7. GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9,PA10
    • 最后,我们配置 GPIOx_AFRL 或者 GPIOx_AFRH 寄存器,将 IO 连接到所需的 AFx。 这些步骤对于我们使用库函数来操作的话,是调用的 GPIO_PinAFConfig 函数来实现的。具 体操作代码如下:
    1. /*PA9 连接 AF7,复用为 USART1_TX */
    2. GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
    3. /* PA10 连接 AF7,复用为 USART1_RX*/
    4. GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

            对于GPIO_PinAFConfig()函数,第一个参数是哪个GPIO,第二个参数为GPIO几,第三个就是确定哪个功能的,还是蛮好理解的。

  • 相关阅读:
    迁移学习(COAL)《Generalized Domain Adaptation with Covariate and Label Shift CO-ALignment》
    如何理解MIC?
    深入实现 MyBatis 底层机制的任务阶段 6-实现任务阶段 6- 在 WyxConfiguration, 读取 XxxMapper.xml,能够创建 MappperBean 对象
    【Linux】Linux服务器防火墙架构简介
    【UDS】ISO14229之0x85服务
    day26--AJAX(axios使用,http协议(部分),接口文档,form-serialize使用)
    Markdown使用方法
    抖音小店需要办理营业执照吗?怎么办理?这个流程你一定要收好!
    基于OXC的光电联动全光网组网方案研究与实践
    【学习笔记】字符串
  • 原文地址:https://blog.csdn.net/weixin_66578482/article/details/125943693