前言
引用参考:
- Clion开发STM32之HAL库GPIO宏定义封装(最新版)
头文件
/******************************************************************************** Copyright (c) [scl]。保留所有权利。* 本文仅供个人学习和研究使用,禁止用于商业用途。******************************************************************************/
#ifndef STM32_F1XX_TEMPLATE_BSP_SPI_H
#define STM32_F1XX_TEMPLATE_BSP_SPI_H#include "bsp_include.h"#define SPI_DEFAULT_CNF {\.Mode = SPI_MODE_MASTER, /*主机模式*/\.Direction = SPI_DIRECTION_2LINES, /*全双工*/\.DataSize = SPI_DATASIZE_8BIT,/*数据大小:(字节)*/\.CLKPolarity = SPI_POLARITY_LOW,/*时钟极性, 空闲状态为低*/\.CLKPhase = SPI_PHASE_2EDGE, /*时钟相位, 在第二边沿采集数据*/\.NSS = SPI_NSS_SOFT,/*软件使能*/\.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2,/*波特率分频: 2分频*/\.FirstBit = SPI_FIRSTBIT_MSB,/*数据位传输方式:从高到低*/\.TIMode = SPI_TIMODE_DISABLE, /*TI 模式禁止*/\.CRCCalculation = SPI_CRCCALCULATION_DISABLE,/*CRC校验禁用*/\.CRCPolynomial = 7,/*CRC检验禁用,此值无意义*/\}/*** CPOL: 时钟极性,控制在没有数据传输时,@note 时钟线的电平状态* 0: @note 空闲状态时,时钟线的电平为(低电平)* 1: @note 空闲状态时. 时钟线的电平为 (高电平)* CPHA: 时钟相位,数据采样的位置* 1:@note 在时钟的第2个边沿进行数据采集(CPOL为1: 上升沿采数据,CPOL为0:下降沿采数据)* 0: @note 在时钟的第1个边沿进行数据采集(CPOL为1: 下降沿采数据,CPOL为0: 上升沿采数据)* */
typedef enum {/**模式0 CPOL:0,CPHA:0 ; 时钟空闲状态为(低电平),在第一个时钟边沿采数据(时钟上升沿采数据) */spi_mode_0,/**模式1 CPOL:0,CPHA:1 ; 时钟空闲状态为(低电平),在第二个时钟边沿采数据(时钟下降沿采数据)*/spi_mode_1,/**模式2 CPOL:1,CPHA:0 ; 时钟空闲状态为(高电平),在第一个时钟边沿采数据(时钟下降沿采数据)*/spi_mode_2,/**模式3 CPOL:1,CPHA:1 ; 时钟空闲状态为(高电平),在第二个时钟边沿采数据(时钟上升沿采数据)*/spi_mode_3,
} spi_mode_type;/********************************SPI1 配置**********************************************/
/**SPI1 GPIO ConfigurationPA5 ------> SPI1_SCKPA6 ------> SPI1_MISOPA7 ------> SPI1_MOSI*/
#define SPI1_SCK PA5
#define SPI1_MISO PA6
#define SPI1_MOSI PA7void spi1_gpio_msp_init();void spi1_gpio_msp_de_init();/********************************SPI2 配置**********************************************/
#define SPI2_SCK PB13
#define SPI2_MISO PB14
#define SPI2_MOSI PB15void spi2_gpio_msp_init();void spi2_gpio_msp_de_init();/********************************SPI3 配置**********************************************/
void bsp_SpiHandleInit(SPI_HandleTypeDef *handle, uint32_t BaudRatePrescaler, spi_mode_type mode);#endif //STM32_F1XX_TEMPLATE_BSP_SPI_H
源文件
/******************************************************************************** Copyright (c) [scl]。保留所有权利。* 本文仅供个人学习和研究使用,禁止用于商业用途。******************************************************************************/
#include "bsp_spi.h"void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) {if (hspi->Instance == SPI1) {__HAL_RCC_SPI1_CLK_ENABLE();spi1_gpio_msp_init();} else if (hspi->Instance == SPI2) {/* SPI2 clock enable */__HAL_RCC_SPI2_CLK_ENABLE();spi2_gpio_msp_init();} else if (hspi->Instance == SPI3) {}}void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) {if (hspi->Instance == SPI1) {__HAL_RCC_SPI1_CLK_DISABLE();spi1_gpio_msp_de_init();} else if (hspi->Instance == SPI2) {/* SPI2 clock enable */__HAL_RCC_SPI2_CLK_DISABLE();spi2_gpio_msp_de_init();} else if (hspi->Instance == SPI3) {}
}void bsp_SpiHandleInit(SPI_HandleTypeDef *handle, uint32_t BaudRatePrescaler, spi_mode_type mode) {if (handle == NULL) {error_handle();} else {handle->Init.BaudRatePrescaler = BaudRatePrescaler;switch (mode) {case spi_mode_0:handle->Init.CLKPhase = SPI_PHASE_1EDGE;handle->Init.CLKPolarity = SPI_POLARITY_LOW;break;case spi_mode_1:handle->Init.CLKPhase = SPI_PHASE_2EDGE;handle->Init.CLKPolarity = SPI_POLARITY_LOW;break;case spi_mode_2:handle->Init.CLKPolarity = SPI_POLARITY_HIGH;handle->Init.CLKPhase = SPI_PHASE_1EDGE;break;case spi_mode_3:handle->Init.CLKPolarity = SPI_POLARITY_HIGH;handle->Init.CLKPhase = SPI_PHASE_2EDGE;break;}if (HAL_SPI_Init(handle) != HAL_OK) {error_handle();}}
}
/********************************SPI1 配置**********************************************/
__weak void spi1_gpio_msp_init() {stm32_pin_define_mode_set(stm_get_pin(SPI1_SCK), pin_mode_output_af_pp);stm32_pin_define_mode_set(stm_get_pin(SPI1_MISO), pin_mode_input);stm32_pin_define_mode_set(stm_get_pin(SPI1_MOSI), pin_mode_output_af_pp);
}__weak void spi1_gpio_msp_de_init() {stm32_pin_define_reset(stm_get_pin(SPI1_SCK));stm32_pin_define_reset(stm_get_pin(SPI1_MISO));stm32_pin_define_reset(stm_get_pin(SPI1_MOSI));
}/********************************SPI2 配置**********************************************/
__weak void spi2_gpio_msp_init() {stm32_pin_define_mode_set(stm_get_pin(SPI2_SCK), pin_mode_output_af_pp);stm32_pin_define_mode_set(stm_get_pin(SPI2_MISO), pin_mode_input);stm32_pin_define_mode_set(stm_get_pin(SPI2_MOSI), pin_mode_output_af_pp);
}__weak void spi2_gpio_msp_de_init() {stm32_pin_define_reset(stm_get_pin(SPI2_SCK));stm32_pin_define_reset(stm_get_pin(SPI2_MISO));stm32_pin_define_reset(stm_get_pin(SPI2_MOSI));
}