登录/注册

stm32f407硬件iic

stm32f407硬件iic

更多

STM32F407 的硬件 I²C(IIC)接口使用相对复杂,需严格遵循时序和配置。以下是关键步骤和代码示例(基于 HAL 库):


硬件配置要点

  1. 引脚复用(以 I2C1 为例):

    • SCL:PB6(或 PB8)
    • SDA:PB7(或 PB9)
    • 配置为复用开漏输出模式(GPIO_MODE_AF_OD),启用内部/外部上拉电阻(4.7kΩ)。
  2. 时钟使能

    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_I2C1_CLK_ENABLE();

初始化步骤

1. GPIO 配置

GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置 SCL (PB6) 和 SDA (PB7)
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;      // 复用开漏
GPIO_InitStruct.Pull = GPIO_PULLUP;          // 启用上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;   // 复用功能 AF4
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

2. I²C 参数配置

I2C_HandleTypeDef hi2c1;

hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;             // 100kHz 标准模式
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;     // 50% 占空比
hi2c1.Init.OwnAddress1 = 0x00;              // 主设备地址通常设为 0
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 7 位地址
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
  // 错误处理
}

3. 时钟配置(可选)

// 在 HAL_I2C_MspInit() 中自动调用
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) {
  if(hi2c->Instance == I2C1) {
    __HAL_RCC_I2C1_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    // ... 引脚复用配置
  }
}

常用读写函数

1. 主设备写数据(无寄存器地址)

uint8_t data[] = {0x01, 0x02};
HAL_I2C_Master_Transmit(&hi2c1, DEV_ADDR << 1, data, 2, HAL_MAX_DELAY);

2. 主设备读数据

uint8_t rx_data[2];
HAL_I2C_Master_Receive(&hi2c1, DEV_ADDR << 1, rx_data, 2, HAL_MAX_DELAY);

3. 带寄存器地址的写入

uint8_t reg_addr = 0x10;
uint8_t value = 0xAA;
HAL_I2C_Mem_Write(&hi2c1, DEV_ADDR << 1, reg_addr, I2C_MEMADD_SIZE_8BIT, &value, 1, HAL_MAX_DELAY);

4. 带寄存器地址的读取

uint8_t reg_addr = 0x10;
uint8_t rx_value;
HAL_I2C_Mem_Read(&hi2c1, DEV_ADDR << 1, reg_addr, I2C_MEMADD_SIZE_8BIT, &rx_value, 1, HAL_MAX_DELAY);

常见问题解决

  1. 卡死或超时

    • 检查 SCL/SDA 上拉电阻(必须接 4.7kΩ)。
    • 确保 设备地址正确(7 位地址需左移 1 位)。
    • 降低 ClockSpeed(如 10kHz)调试。
  2. 总线错误

    • HAL_I2C_ErrorCallback() 中处理错误:
      void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) {
      if (hi2c->ErrorCode & HAL_I2C_ERROR_AF) { // ACK 失败
       HAL_I2C_Init(hi2c); // 重新初始化
      }
      }
  3. 多字节传输

    • 使用 HAL_I2C_Mem_Write/Read() 传输连续数据。

关键注意事项

完整示例参考 STM32CubeF4 库中的 I2C 例程(路径:STM32Cube_FW_F4_Vxx/Projects/Board/I2C)。

STM32F407的晶振选型分析

STM32F407的最佳晶振选项

2025-11-07 12:03:28

stm32f407 double类型

STM32F407是意法半导体(STMicroelectronics)推出的一款ARM Cortex-M4内核的微控制器。它是针对智能电动车领域的实时操作、数字信号处理和高性能应用而设计的。在这

2024-01-07 16:45:45

stm32f407 LAN8720A速率调整

STM32F407和LAN8720A的速率是非常重要的,尤其是在网络环境中。下面我将详细介绍如何通过软件和硬件来调整速率。 软件配置: 首先,我们需要在STM

2024-01-05 13:54:13

stm32f407原理图

stm32f407原理图

资料下载 新湖滨 2022-07-14 16:07:38

STM32F407原理图下载

STM32F407原理图下载

资料下载 AloneMonster111 2022-01-17 13:44:59

STM32F407STM32F105 CAN通讯失败的定位解决

STM32F407与STM32F105 CAN通讯失败的定位解决问题的发现问题的现象测试过程硬件调整测试软件调整测试结论基本结论结论扩展验证问题

资料下载 小峰 2021-12-02 16:51:16

[STM32]STM32F407系列教程之四,pwm产生原理

[STM32]STM32F407系列教程之四,pwm产生原理

资料下载 张静 2021-11-29 17:51:03

STM32F407 DCMI摄像头源码

STM32F407 DCMI摄像头源码(电源技术存在的问题总结)-【资源描述】:STM32F407 DCMI摄像头源码【编程语言】:C语言

资料下载 h1654155275.0032 2021-09-16 16:15:00

stm32f407浮点运算速度

支持硬件浮点运算单元(FPU),可以提供快速和高效的浮点运算性能。本文将详细介绍 STM32F407 的浮点运算速度。 浮点运算是很多应用中常用的一种运算类型,特别是对于需要进行较复杂计算的任务,如图像处理、信号处理

2024-01-04 10:58:34

STM32F407 基本定时器使用

介绍STM32F407基本定时器的配置方法,分别介绍轮询方式、中断方式使用定时器完成定时。

2023-07-06 14:32:55

STM32F407 滴答定时器

介绍STM32F407滴答定时器配置方法、使用方式,封装延时函数得到精确的时间。

2023-07-06 14:32:11

STM32F407 串口配置步骤

介绍STM32F407串口配置步骤,完成串口的数据发送与接收、实现中断接收,支持printf重定向。

2023-07-06 14:29:50

STM32F407 GPIO口输入配置配置步骤

介绍STM32F407新建寄存器工程流程,介绍输入模式的配置方式,以按键为例完成按键输入检测。

2023-07-06 14:28:56

国产优秀替代_APM32F407替代STM32F407记录

前言 最近一段时间在玩极海的APM32F407系列的MCU,在研究一段时间后发现其资源和意法半导体的STM32F407不相上下。通过对比两者的数据手册和参考手册,我发现APM32

2022-05-10 11:22:36

stm32f407硬件介绍

【stm32f407】硬件介绍

2020-03-13 11:12:23
7天热门专题 换一换
相关标签