Clion开发STM32之HAL库SPI封装(基础库)

前言

引用参考:

  1. 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 Configuration
 PA5     ------> SPI1_SCK
 PA6     ------> SPI1_MISO
 PA7     ------> SPI1_MOSI
 */
#define SPI1_SCK PA5
#define SPI1_MISO PA6
#define SPI1_MOSI PA7

void spi1_gpio_msp_init();

void spi1_gpio_msp_de_init();

/********************************SPI2 配置**********************************************/
#define SPI2_SCK PB13
#define SPI2_MISO PB14
#define SPI2_MOSI PB15

void 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));
}

你可能感兴趣的:(基础外设,stm32,单片机,嵌入式硬件)