STM32 HAL库SPI函数学习指南

发布者:Jinyu521最新更新时间:2025-09-28 来源: cnblogs关键字:STM32  HAL库 手机看文章 扫描二维码
随时随地手机看文章

1、HAL_StatusTypeDef HAL_SPI_Init (SPI_HandleTypeDef * hspi)


 配置SPI通信的所有参数,主要是区分SPI的四种工作模式。


最终使用此函数初始化SPI外设,注意还要使用__HAL_SPI_ENABLE();函数开启SPI外设。


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

void SPI2_Init(void)

{

    SPI2_Handler.Instance=SPI2;                      //SP2

    SPI2_Handler.Init.Mode=SPI_MODE_MASTER;          //设置为主机

    SPI2_Handler.Init.Direction=SPI_DIRECTION_2LINES;//设置SPI单向或者双向的数据模式:SPI设置为双线模式

    SPI2_Handler.Init.DataSize=SPI_DATASIZE_8BIT;    //设置SPI的数据大小:SPI发送接收8位帧结构

    SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平

    SPI2_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;      //串行同步时钟的第二个跳变沿(上升或下降)数据被采样

    SPI2_Handler.Init.NSS=SPI_NSS_SOFT;              //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

    SPI2_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256

    SPI2_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;     //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始

    SPI2_Handler.Init.TIMode=SPI_TIMODE_DISABLE;     //关闭TI模式

    SPI2_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验

    SPI2_Handler.Init.CRCPolynomial=7;               //CRC值计算的多项式

    HAL_SPI_Init(&SPI2_Handler);

    

    __HAL_SPI_ENABLE(&SPI2_Handler);                 //使能SPI2

}


2、HAL_StatusTypeDef HAL_SPI_DeInit (SPI_HandleTypeDef * hspi)


复位SPI外设的参数配置。适用方法同上。


3、void HAL_SPI_MspInit (SPI_HandleTypeDef * hspi)


SPI硬件初始化回调函数,自动被函数1调用,注意SPI中的CS 管脚是需要单独配置的,不能和MSIO、SCK、MOSI配合到一起。


void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)

{

    GPIO_InitTypeDef GPIO_Initure;

    

    __HAL_RCC_GPIOF_CLK_ENABLE();       //使能GPIOF时钟

    __HAL_RCC_SPI5_CLK_ENABLE();        //使能SPI5时钟

    __HAL_RCC_SPI2_CLK_ENABLE();        //使能SPI2时钟

    __HAL_RCC_GPIOH_CLK_ENABLE();       //使能GPIOH时钟

    //SPI5引脚初始化PF7,8,9

    GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;

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

    GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉

    GPIO_Initure.Speed=GPIO_SPEED_FAST;             //快速            

    GPIO_Initure.Alternate=GPIO_AF5_SPI5;           //复用为SPI5

    HAL_GPIO_Init(GPIOF,&GPIO_Initure);

    

    //SPI2引脚初始化PB13,14,15

    GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;   

    GPIO_Initure.Alternate=GPIO_AF5_SPI2;           //复用为SPI2

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);             //初始化

GPIO_Initure.Pin=GPIO_PIN_7;   

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;           //RST

    HAL_GPIO_Init(GPIOH,&GPIO_Initure);             //初始化

  GPIO_Initure.Pin=GPIO_PIN_12;   

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;           //SPI2 CS

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);             //初始化

}


4、void HAL_SPI_MspDeInit (SPI_HandleTypeDef * hspi)


使用方法同上。


5、HAL_StatusTypeDef HAL_SPI_Transmit (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size, uint32_t Timeout)


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

uint8_t data[] = 'SPI Send Data'

HAL_SPI_Transmit (&SPI2_Handler, data, sizeof(data),100);

SPI发送数据的函数(只发送数据)。通过阻塞的形式向外发送数据。



6、HAL_StatusTypeDef HAL_SPI_Receive (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size, uint32_t Timeout)


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

uint8_t data = 0;

HAL_SPI_Receive (&SPI2_Handler, &data, 1,100);

//接收一个字节的数据到data变量中存储

SPI接收数据函数(只接收数据)。通过阻塞的形式接收数据。


7、HAL_StatusTypeDef HAL_SPI_TransmitReceive (SPI_HandleTypeDef * hspi, uint8_t * pTxData, uint8_t * pRxData, uint16_t Size, uint32_t Timeout)



SPI收发一体函数,重点函数,发送数据和接收数据都可以使用此函数。


u8 SPI2_ReadWriteByte(u8 TxData)

{

    u8 Rxdata;

    HAL_SPI_TransmitReceive(&SPI2_Handler,&TxData,&Rxdata,1, 1000);       

  return Rxdata;              //返回收到的数据

}

8、HAL_StatusTypeDef HAL_SPI_Transmit_IT (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size)


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

uint8_t data[] = 'SPI Send Data'

HAL_SPI_Transmit_IT (&SPI2_Handler, data, sizeof(data));



SPI发送数据的函数(只发送数据)。通过发送中断的形式向外发送数据。


9、HAL_StatusTypeDef HAL_SPI_Receive_IT (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size)


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

uint8_t data = 0;

HAL_SPI_Receive_IT (&SPI2_Handler, &data, 1);

SPI接收数据函数(只接收数据)。通过接收中断的形式接收数据。


10、HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT (SPI_HandleTypeDef * hspi, uint8_t * pTxData, uint8_t * pRxData, uint16_t Size)


关键字:STM32  HAL库 引用地址:STM32 HAL库SPI函数学习指南

上一篇:stm32学习笔记 GPIO通用输入输出口
下一篇:STM32外设DAC实战指南:使用DMA输出正弦波

推荐阅读最新更新时间:2026-03-25 11:02

STM32 HAL库 模拟SPI驱动 DAC8560
网上关于DAC8560相关的模拟SPI驱动的资料少的可怜,甚至连DAC8560的中文资料都不多,更不要提用HAL库进行编程的了,这实在是一块冷门芯片,本文主要是介绍讲解STM32 HAL库使用模拟SPI驱动DAC8560。 首先是SPI相关的简介: SPI通信 高冠避役 · 800阅读 然后是用STM32CubeMx初始化模拟SPI的引脚: STM32CubeMx的GPIO输出的配置可以参考: STM32CubeMx GPIO口输出 高冠避役 · 960阅读 这里之所以是只用开三个GPIO输出来模拟SPI是因为它只用到了半双工通信。 我所用到的三个输出口分别对应8560上的三个SPI通信口。 SYNC:PA6 SCLK
[单片机]
<font color='red'>STM32</font> <font color='red'>HAL库</font> 模拟<font color='red'>SPI</font>驱动 DAC8560
STM32定时器中断详解(HAL库实战讲解)
1、定时器简单介绍 以STM32F103C8T6中几个定时器为例: TIM1:这是一个高级定时器,不仅具备基本的定时中断功能,还拥有内外时钟源选择、输入捕获、输出比较、编码器接口以及主从触发模式等多种功能。这使得TIM1能够适用于各种复杂的应用场景,为开发者提供强大的时间控制和信号处理能力。 TIM2、TIM3和TIM4:这些是通用定时器,同样具有定时功能,但在功能上与高级定时器有所区别。通用定时器通常用于实现一些基本的定时任务,如LED闪烁、脉冲宽度测量等。 每个定时器都由一个**16位计数器、预分频器和自动重装寄存器的时基单元组成。**预分频器可以对时钟进行分频,计数器则对预分频后的时钟进行计数。当计数器的值达到设定值时,
[单片机]
<font color='red'>STM32</font>定时器中断详解(<font color='red'>HAL库</font>实战讲解)
STM32核心知识入门指南:标准库、HAL库与STM32CubeMX零基础详解
初识STM32,那肯定要先了解它是什么,长话短说进入正文! STM32是什么,是一款来自意法半导体公司生产的32位微控制器系列产片,这里小楽就不多介绍了。 那刚接触嵌入式或其他同学就该疑惑了,为什么叫STM32?32位是什么?微控制器(MCU)又是什么?那小楽将一一解答。 各位,各位集中注意力! 一.STM32的介绍 一.微控制器(MCU)是什么 咱来先解决微控制器! 微控制器呢!是一种集成了多种功能模块的 嵌入式专用计算机芯片,广泛应用于各类电子设备的控制场景中。它将很多部件(这里的部件暂时先不急着介绍,容量有点大)集成在单个芯片上,具备完整的最小系统能力,可独立实现特定控制任务。 二.为什么叫STM32与32位是什么
[单片机]
<font color='red'>STM32</font>核心知识入门指南:标准库、<font color='red'>HAL库</font>与STM32CubeMX零基础详解
STM32 HAL库中的弱定义回调函数解析:为何不使用函数名指针作为功能函数的参数?
回调函数的意义和背景: 回调函数其实是设计反转,意思是相较于普通函数是设计者(框架开发者)设计函数而调用者(也是就是用户)调用函数的思路,而回调函数则变成了调用者(也是就是用户)设计,由于是调用者(也是就是用户)设计而设计者(框架开发者)调用这种是反的所以叫回调。Callback英文就是回电、回拨的含义,就像留下电话号码让对方回电,这里是将函数留给系统在需要时回调。 核心概念 回调函数本质是控制权反转的编程模式,目的是实现以下关系: 框架开发者定义接口规范 应用开发者实现具体逻辑 框架在特定时机自动调用用户函数 代码示例 #include stdio.h // 定义回调函数类型 typedef void (
[单片机]
<font color='red'>STM32</font> <font color='red'>HAL库</font>中的弱定义回调<font color='red'>函数</font>解析:为何不使用<font color='red'>函数</font>名指针作为功能<font color='red'>函数</font>的参数?
STM32 HAL库、标准外设库、LL库(STM32 Embedded Software)
STM32 Embedded Software   工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库。到目前为止,有标准外设库(STD库)、HAL库、LL库 三种。前两者都是常用的库,后面的LL库是ST最近才添加,目前支持的芯片也偏少。各库如下所示: 其中,STD库和HAL库两者相互独立,互不兼容。几种库的比较如下: 目前几种库对不同芯片的支持情况如下: 上图中,LL库目前有部分芯片不支持,官方计划2017年逐步完善。 STM32Snippets   它是代码示例的集合,直接基于STM32外设寄存器,可在文档和软件包中使用。由于处在最底层,因此需要开发者直接操作外设寄存器,对开发者要求
[单片机]
<font color='red'>STM32</font> <font color='red'>HAL库</font>、标准外设库、LL库(<font color='red'>STM32</font> Embedded Software)
STM32 HAL库 IIC 协议库函数
/* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超时时间 */ HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF),0x10); HAL_I2C_Mem_Write_IT(); HAL_I2C_Mem_Read(); HAL_I2C_Mem_Read_IT(); HAL_I2C_Mem_Read_DMA(); HAL_I2C_Mem_Write_DMA(); HAL_I2C_Mas
[单片机]
STM32Cumebx HAL库实现STM32 USB虚拟串口的收发
  这里记录一下用STM32Cumebx实现USB虚拟串口的过程,以F072为例大家可以一起学习讨论一下。 1.新建工程      这里选择SW烧录调试,看个人习惯,如果不习惯用SW的你们可以换其他的也行。   我这里因为直接使用MCU的内部时钟就没有勾选RCC了,然后直接配置时钟树,具体如下:   最后一点比较重要点的就是要配置USB堆的大小,把它改大一点,不然容易出现电脑实现出现黄色感叹号情况,这里选的编译软件是MDK-ARM。   最后编译生成代码 2.用keil打开工程编辑   找到usb_cdc_if.c文件,在文件开始处添加接收USB转串口数
[单片机]
STM32Cumebx <font color='red'>HAL库</font>实现<font color='red'>STM32</font> USB虚拟串口的收发
STM32 HAL库使用中断实现串口接收不定长数据
以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:ATrnOKrn,就只能接收到ATr,导致没有接收完成,具体原因还没搞懂,有了解的,希望可以告知一下,DMA不定长接收方法传输门:https://www.cnblogs.com/xingboy/p/9714907.html。 好了,不多说了,现在进入正文。首先建立一个STM32Cumebx的工程,打开串口中断,完成配置,具体的配置流程就不细说了,没什么难度就只是打开串口跟中断而已。 生成工程代码后,先定义好一些变量: //串口4中断接收定义 #define MAX
[单片机]
<font color='red'>STM32</font> <font color='red'>HAL库</font>使用中断实现串口接收不定长数据
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved