【STM32 CubeMX】SPI HAL库编程

文章目录

  • 前言
  • 一、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
【STM32 CubeMX】SPI HAL库编程_第1张图片
接下来,把SPI的参数调成下面这样:
【STM32 CubeMX】SPI HAL库编程_第2张图片
SPI对应的引脚如下:
【STM32 CubeMX】SPI HAL库编程_第3张图片
但是这里并没有片选引脚,片选引脚需要我们自己去选择一个GPIO作为片选引脚。

选择一个GPIO作为CS片选引脚,GPIO模式为输出模式:
【STM32 CubeMX】SPI HAL库编程_第4张图片
接下来生成代码即可。

二、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
【STM32 CubeMX】SPI HAL库编程_第5张图片
如果传输完成或出错,如下回调函数会被调用:

/* 发送、接收完成回调函数 */
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里面这样设置:
【STM32 CubeMX】SPI HAL库编程_第6张图片
如果传输完成或出错,如下回调函数会被调用:

/* 发送、接收完成回调函数 */
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 编程的基本方法,为自己的项目开发提供了便利。

你可能感兴趣的:(stm32,嵌入式硬件,单片机,mcu,c,CubeMX,c++)