STM32 CubeMX中使用HAL库编程实现SPI通信

文章目录

  • 前言
  • 一、CubeMX配置SPI Flash
  • 二、SPI HAL编程
  • 2.1 查询方式函数
  • 2.2 使用中断方式
  • 2.3 DMA方式
  • 总结

  • 前言

    STM32 CubeMX 是一款由 STMicroelectronics 提供的图形化配置工具,用于生成 STM32 微控制器的初始化代码和项目框架。在 STM32 开发中,使用 CubeMX 可以大大简化初始化过程,并帮助开发者快速构建应用程序。其中,SPI(串行外设接口)是一种常用的通信协议,它在连接外部设备时非常有用。本文将介绍如何使用 CubeMX 结合 SPI HAL 库进行 STM32 SPI 的初始化和编程。


    一、CubeMX配置SPI Flash

    首先,选择任意的一个SPI

    接下来,把SPI的参数调成下面这样:

    SPI对应的引脚如下:

    但是这里并没有片选引脚,片选引脚需要我们自己去选择一个GPIO作为片选引脚。

    选择一个GPIO作为CS片选引脚,GPIO模式为输出模式:

    接下来生成代码即可。

    二、SPI HAL编程

    2.1 查询方式函数

    在SPI协议中,如果你发送了几个字节,你必定会接收到几个字节,所以HAL库提供了HAL_SPI_TransmitReceive来发送之后同时接收。

    我们可以使用下面这些函数进行发送和接收

    /* 发送同时接收数据 */
    HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t 
    *pRxData, uint16_t Size, uint32_t Timeout);
    /* 发送数据 */
    HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, 
    uint32_t Timeout);
    /* 接收数据 */
    HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, 
    uint32_t Timeout);
    

    参数说明:
    SPI_HandleTypeDef *hspi 使用哪个 SPI 控制器
    uint8_t *pTxData或uint8_t *pData 要发送的数据的 buffer
    uint8_t *pRxData或uint8_t *pData 存储接收到的数据是 buffer
    uint16_t Size 数据个数
    uint32_t Timeout 超时时间,单位是 Tick,一般是 1ms
    返回值 HAL_OK:成功
    HAL_ERROR:错误
    HAL_BUSY:总线忙
    HAL_TIMEOUT:超时

    2.2 使用中断方式

    使用中断方式读写 SPI 设备的函数原型如下:

    /* 发送同时接收数据 */
    HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, 
    uint8_t *pRxData, uint16_t Size);
    /* 发送数据 */
    HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t 
    Size);
    /* 接收数据 */
    HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
    

    这些函数和我们前面的没有中断的是类似的,所以这边不再重复介绍参数

    如果你需要使用回调函数,你需要在CubeMX里面使能NVIC

    如果传输完成或出错,如下回调函数会被调用:

    /* 发送、接收完成回调函数 */
    void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);
    /* 发送完成回调函数 */
    void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);
    /* 接收完成回调函数 */
    void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
    /* 出错回调函数 */
    void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi);
    

    2.3 DMA方式

    使用 DMA 方式读写 SPI 设备的函数原型如下:

    /* 发送同时接收数据 */
    HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, 
    uint8_t *pRxData, uint16_t Size);
    /* 发送数据 */
    HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t 
    Size);
    /* 接收数据 */
    HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t 
    Size);
    

    如果你想要使用DMA方式发送和接收SPI
    你需要在CubeMX里面这样设置:

    如果传输完成或出错,如下回调函数会被调用:

    /* 发送、接收完成回调函数 */
    void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);
    /* 发送完成回调函数 */
    void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);
    /* 接收完成回调函数 */
    void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
    /* 出错回调函数 */
    void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi);
    

    可以在这些回调函数里设置变量,表示传输已经完成。


    总结

    通过本文的介绍,我们了解了如何使用 STM32 CubeMX 结合 SPI HAL 库进行 SPI 接口的初始化和编程。首先,我们使用 CubeMX 配置了 SPI 外设的基本参数,包括模式、时钟极性、数据大小等。然后,我们生成了初始化代码,并在代码中添加了 SPI 的发送和接收功能。在编写代码时,我们使用了 HAL 库提供的函数来控制 SPI 外设的操作,这使得我们可以更加方便地进行 SPI 通信。最后,我们在主函数中调用了相应的 SPI 发送和接收函数,并通过调试工具验证了通信的正确性。通过这篇文章,读者可以掌握使用 CubeMX 和 SPI HAL 库进行 STM32 SPI 编程的基本方法,为自己的项目开发提供了便利。

    作者:人才程序员

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 CubeMX中使用HAL库编程实现SPI通信

    发表评论