STM32 CubeMX 是一款由 STMicroelectronics 提供的图形化配置工具,用于生成 STM32 微控制器的初始化代码和项目框架。在 STM32 开发中,使用 CubeMX 可以大大简化初始化过程,并帮助开发者快速构建应用程序。其中,SPI(串行外设接口)是一种常用的通信协议,它在连接外部设备时非常有用。本文将介绍如何使用 CubeMX 结合 SPI HAL 库进行 STM32 SPI 的初始化和编程。
首先,选择任意的一个SPI
接下来,把SPI的参数调成下面这样:
SPI对应的引脚如下:
但是这里并没有片选引脚,片选引脚需要我们自己去选择一个GPIO作为片选引脚。
选择一个GPIO作为CS片选引脚,GPIO模式为输出模式:
接下来生成代码即可。
在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:超时
使用中断方式读写 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);
使用 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 编程的基本方法,为自己的项目开发提供了便利。