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

前言

引用参考:

  1. Clion开发STM32之HAL库GPIO宏定义封装(最新版)

头文件

c 复制代码
/*******************************************************************************
 Copyright (c) [scl]。保留所有权利。
 ******************************************************************************/
#ifndef STM32_F1XX_TEMPLATE_BSP_I2C_H
#define STM32_F1XX_TEMPLATE_BSP_I2C_H

#include "bsp_include.h"

#define I2C_DEFAULT_CNF {\
                .ClockSpeed = 100000,\
                .DutyCycle = I2C_DUTYCYCLE_2,\
                .OwnAddress1 = 0,\
                .AddressingMode = I2C_ADDRESSINGMODE_7BIT,\
                .DualAddressMode = I2C_DUALADDRESS_DISABLE,\
                .OwnAddress2 = 0,\
                .GeneralCallMode = I2C_GENERALCALL_DISABLE,\
                .NoStretchMode = I2C_NOSTRETCH_DISABLE,\
        }
//   PB6------> I2C1_SCL  PB7------> I2C1_SDA
#define I2C1_SCL PB6
#define I2C1_SDA PB7
void i2c1_gpio_msp_init();
void i2c1_gpio_msp_de_init();
//   PB10------> I2C2_SCL  PB11------> I2C2_SDA
#define I2C2_SCL PB10
#define I2C2_SDA PB11
void i2c2_gpio_msp_init();
void i2c2_gpio_msp_de_init();
void bsp_I2cSimpleInit(I2C_HandleTypeDef *handle);

sys_force_static_inline void bsp_I2cInit(I2C_HandleTypeDef *handle, uint32_t own_addr) {
    handle->Init.OwnAddress1 = own_addr;
    bsp_I2cSimpleInit(handle);
}

#endif //STM32_F1XX_TEMPLATE_BSP_I2C_H

源文件

c 复制代码
/*******************************************************************************
 Copyright (c) [scl]。保留所有权利。
 ******************************************************************************/
#include "bsp_i2c.h"

void HAL_I2C_MspInit(I2C_HandleTypeDef *i2cHandle) {
    if (i2cHandle->Instance == I2C1) {
        __HAL_RCC_I2C1_CLK_ENABLE();
        i2c1_gpio_msp_init();


    } else if (i2cHandle->Instance == I2C2) {
        __HAL_RCC_I2C2_CLK_ENABLE();
        i2c2_gpio_msp_init();

    }
}

void HAL_I2C_MspDeInit(I2C_HandleTypeDef *i2cHandle) {

    if (i2cHandle->Instance == I2C1) {
        __HAL_RCC_I2C1_CLK_DISABLE();
        i2c1_gpio_msp_de_init();

    } else if (i2cHandle->Instance == I2C2) {
        __HAL_RCC_I2C2_CLK_DISABLE();
        i2c2_gpio_msp_de_init();

    }
}

void bsp_I2cSimpleInit(I2C_HandleTypeDef *handle) {
    if (HAL_I2C_Init(handle) != HAL_OK) {
        error_handle();
    }
}


__weak void i2c1_gpio_msp_init() {

    stm32_pin_define_mode_set(stm_get_pin(I2C1_SCL), pin_mode_af_od);
    stm32_pin_define_mode_set(stm_get_pin(I2C1_SDA), pin_mode_af_od);
}

__weak void i2c1_gpio_msp_de_init() {
    stm32_pin_define_reset(stm_get_pin(I2C1_SCL));
    stm32_pin_define_reset(stm_get_pin(I2C1_SDA));
}

__weak void i2c2_gpio_msp_init() {
    stm32_pin_define_mode_set(stm_get_pin(I2C2_SCL), pin_mode_af_od);
    stm32_pin_define_mode_set(stm_get_pin(I2C2_SDA), pin_mode_af_od);

}

__weak void i2c2_gpio_msp_de_init() {
    stm32_pin_define_reset(stm_get_pin(I2C2_SCL));
    stm32_pin_define_reset(stm_get_pin(I2C2_SDA));
}
相关推荐
奋斗的牛马1 小时前
FPGA—ZYNQ学习GPIO-EMIO,MIO,AXIGPIO(五)
单片机·嵌入式硬件·学习·fpga开发·信息与通信
Shylock_Mister1 小时前
ESP32事件组替代全局变量:高效控制任务循环
c语言·单片机·物联网
武文斌772 小时前
PCB画板:电阻、电容、电感、二极管、三极管、mos管
单片机·嵌入式硬件·学习
齐落山大勇3 小时前
STM32的ADC(遥杆的控制)
stm32·单片机·嵌入式硬件
EVERSPIN3 小时前
国产MCU-灵动微MM32F0050系列微控制器的简单分享
单片机·微控制器·mm32f0050系列
huaijin6223 小时前
ESP32在arduino环境下的离线安装 -- 理论上多个版本都有效
stm32·单片机·嵌入式硬件
Shylock_Mister3 小时前
FreeRTOS事件组全解析:多任务同步核心技巧
c语言·单片机·物联网
三佛科技-134163842123 小时前
SI13213L/H,SI13215L/H 非隔离降压恒压芯片5V/3.3V典型应用资料
单片机·嵌入式硬件·智能家居·pcb工艺
云山工作室8 小时前
基于单片机的牧场奶牛养殖系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
三佛科技-134163842129 小时前
制冰机方案,家用制冰机MCU控制方案开发设计
单片机·嵌入式硬件·智能家居·pcb工艺