首页 > 其他分享 >STM32的IO复用详解

STM32的IO复用详解

时间:2024-07-27 17:24:17浏览次数:9  
标签:SPI3 Initure 引脚 复用 STM32 IO GPIO

前言

最近在STM32的IO复用上面吃了一个亏,所以把问题记录下来并且将IO复用的原理再深刻理解一下。

起因就是自己做的项目需要用一个SPI读取数据的功能,我是用的STM32F429的HAL库,所以就将SPI的例子复制过来,之前SPI读的是开发板上面的spiflash,用的是SPI5,我自己的项目用的是SPI3,所以这里偷了个懒,直接把SPI5全部替换成了SPI3,但是运行的时候就出问题了,用示波器量SPI的SCK引脚没有时钟,读出来数据都是0x00,排查了半天线路和代码,感觉哪哪都没问题,最后偶然发现了这行代码:

GPIO_Initure.Alternate=GPIO_AF5_SPI3;

是不是这里有哪不对劲,F12进去以后,发现除了GPIO_AF5_SPI3以外,还存在一个GPIO_AF6_SPI3,我本来以为AF复用只能有一种呢,是我太年轻了。。。然后赶紧查了STM32F426的芯片数据手册。

原来我用的PA15/PB3/PB4/PB5引脚对应的SPI3,是AF6的复用,赶忙修改了,然后时钟和通讯都正常了,看来还是自己对复用理解不深刻,所以导致了这个问题的发生,下面详细分析一下IO的复用功能。

一、什么是IO复用

STM32的IO复用是指STM32微控制器中的通用输入输出(GPIO)引脚可以配置为执行除了基本的输入输出功能之外的其他特定功能。这些特定功能通常与STM32的内置外设(如ADC、TIM、USART等)相关联。当GPIO引脚被配置为执行这些特定功能时,就称为引脚复用。

具体来说,STM32的每个GPIO引脚都通过一个复用器连接到多个内置外设或模块。这个复用器允许一次只选择一个复用功能(AF)连接到对应的IO口,从而确保共用同一个IO引脚的外设之间不会发生冲突

二、IO复用控制寄存器

 上图是STM32F429的0到7引脚对应的GPIOx_AFRL寄存器,控制前7脚的复用,对于引脚 8-15,控制寄存器为 GPIOx_AFRH。我们配置相应的寄存器 GPIOx_AFRL 或者 GPIOx_AFRH,让对应引脚通过复用器连接到对应的复用功能外设。32 位寄存器 GPIOx_AFRL 每四个位控制一个 IO 口,所以每个寄存器控制32/4=8 个 IO 口。寄存器对应四位的值配置决定这个 IO 映射到哪个复用功能 AF

三、代码实现

void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
    GPIO_InitTypeDef GPIO_Initure;
    
    __HAL_RCC_GPIOB_CLK_ENABLE();       //使能GPIOB时钟
    __HAL_RCC_SPI3_CLK_ENABLE();        //使能SPI3时钟
    
    //PB345
    GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FAST;             //快速            
    GPIO_Initure.Alternate=GPIO_AF6_SPI3;           //复用为SPI3
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}

贴出了自己SPI引脚的使能,复用的配置分别为

GPIO_Initure.Mode=GPIO_MODE_AF_PP;        //复用推挽输出

以及

GPIO_Initure.Alternate=GPIO_AF6_SPI3;           //复用为SPI3

注意,GPIO_Initure.Alternate如何选择要看芯片对应的手册,除了ADC和DAC设置GPIO_Initure.Mode为模拟通道意外,其它外设都像这样配置成复用模式。

标签:SPI3,Initure,引脚,复用,STM32,IO,GPIO
From: https://blog.csdn.net/qq_38072731/article/details/140736482

相关文章

  • 1251 - Client does not support authentication protocol requested by server; cons
    错误记录:1251-Clientdoesnotsupportauthenticationprotocolrequestedbyserver;considerupgradingMySQLclient错误原因:mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。解决方案:解决:①升级navicat驱动;②......
  • std::optional
    mutable在C++中,mutable关键字的主要作用是允许类的成员变量在常量成员函数中被修改。常量成员函数是用const关键字修饰的成员函数,通常不允许修改类的成员变量。然而,有时我们希望在这些常量成员函数中修改某些特定的成员变量,比如缓存、调试信息等。为了实现这一需求,可以使用mu......
  • STM32自定义协议串口接收解析指令程序
    1、在使用串口接收自定义协议指令时,需要串口解析收到的是什么指令,举例通信报文为上位机->单片机名称长度备注帧头1Byte0x5A0x5A帧长度1Byte数据包的长度0x00-0xFF数据包命令字1Byte功能标识数据可以为空校验1Byte数据包所有字节按位异......
  • ClearCLIP: Decomposing CLIP Representations for Dense Vision-Language Inference
    Motivation&Abs文章关注的任务为用VLM(如CLIP)做开放词汇分割,motivation主要来自于作者的一个观察:分割图中的噪声主要来自于残差连接,这会导致在文本-图像预训练更加强调全局特征,从而牺牲了局部判别能力,从而导致了分割结果中的噪声。为此作者提出了ClearCLIP,对CLIP的特征进行解耦,......
  • 运行 Github Action 测试 Docker 镜像时退出代码 137
    我正在学习Testdriven.io:使用FastAPI和Docker进行测试驱动开发课程,目前正在学习持续集成部分。在本节中,您将使用github操作来构建docker映像并运行测试和linting等。在流程的测试Docker映像步骤中,当尝试进行pytest时,我收到以下错误:错误:进程已完成并退出代码......
  • tortoise.exceptions.OperationalError:运行测试时关系不存在
    我正在学习TDDfastapi、docker和pytest课程的第一部分。我遇到了一个奇怪的问题,需要您的帮助。当我创建第一个使用torotoise的测试时,它工作正常,将记录添加到数据库,并从fastapi获取它,没有任何问题。分钟我添加另一个测试(添加的测试,然后读取记录),我收到此错误:tor......
  • Python 与 Visual Studio Professional 2022(64 位)- 预览版本 5.0 交互窗口挂起
    我正在MicrosoftVisualStudioProfessional2022(64位)-预览版17.11.0预览版5.0上运行Python开发工作负载。我正在关注VisualStudio中的Python教程https://learn.microsoft.com/en-us/visualstudio/python/tutorial-working-with-python-in-visual-studio-st......
  • STM32 串行FLASH W25Q64 移植文件系统FatFs ——(2)
    引言简述本篇文章目标:介绍如何将FatFs文件系统移植到STM32平台上的W25Q64串行FLASH。回顾上篇内容:软件模拟SPI驱动的实现。一、FatFs文件系统简介文件系统相对庞大且复杂,需要根据具体应用的文件系统格式进行编写。通常,文件系统与底层驱动分离,便于移植。因此,在实际工程应......
  • 带你学习通过GitHub Actions如何快速构建和部署你自己的项目,打造一条属于自己的流水线
    本文主要讲解通过github的actions来对我们项目进行ci/cd一、actions简介GitHubActions是一种持续集成和持续交付(CI/CD)平台,可用于自动执行生成、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。GitHubActions......
  • 【AppStore】IOS应用上架Appstore的一些小坑
    前言上一篇文章写到如何上架IOS应用到Appstore,其中漏掉了些许期间遇到的小坑,现在补上审核不通过原因5.1.1Guideline5.1.1-Legal-Privacy-DataCollectionandStorage5.1.1(ii)PermissionAppsthatcollectuserorusagedatamustsecureuserconsentforthec......