[STM32H7] 高性能实时控制:基于STM32H743的I2C数据采集设计与实现

[复制链接]
 楼主| Uriah 发表于 2024-11-30 07:43 | 显示全部楼层 |阅读模式
在嵌入式系统中,I2C总线作为一种简单、高效的串行通信方式,广泛应用于传感器数据采集等领域。本文基于ST的高性能微控制器STM32H743,设计并实现了一个I2C通信的完整案例,展示如何快速、高效地采集传感器数据。
项目背景STM32H743以其高达480MHz的主频、丰富的外设支持及低功耗特性,成为高性能应用的首选。在数据采集场景中,I2C的主从结构为连接多种传感器提供了极大的便利性。本文通过模拟温湿度传感器的通信过程,介绍STM32H743如何通过I2C获取传感器数据,并在终端输出。
硬件连接我们使用以下硬件完成实验:
  • STM32H743 Nucleo开发板
  • HTU21D温湿度传感器
  • 若干连接线
将HTU21D的SCL、SDA分别连接至STM32H743的PB6和PB7(I2C1接口),并确保电源和地正确连接。
软件设计使用STM32CubeMX生成初始化代码,并在Keil MDK中编写主程序。以下是完整代码:
  1. #include "main.h"  
  2. #include "i2c.h"  
  3. #include "usart.h"  
  4. #include "gpio.h"  

  5. #define HTU21D_ADDRESS 0x40  
  6. #define TEMP_MEASURE_NO_HOLD 0xF3  

  7. void SystemClock_Config(void);  
  8. float Read_Temperature(void);  

  9. int main(void) {  
  10.     HAL_Init();  
  11.     SystemClock_Config();  
  12.     MX_GPIO_Init();  
  13.     MX_I2C1_Init();  
  14.     MX_USART1_UART_Init();  
  15.    
  16.     while (1) {  
  17.         float temperature = Read_Temperature();  
  18.         char buffer[50];  
  19.         sprintf(buffer, "Temperature: %.2f C\r\n", temperature);  
  20.         HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);  
  21.         HAL_Delay(1000);  
  22.     }  
  23. }  

  24. float Read_Temperature(void) {  
  25.     uint8_t cmd = TEMP_MEASURE_NO_HOLD;  
  26.     uint8_t data[2];  
  27.     HAL_I2C_Master_Transmit(&hi2c1, HTU21D_ADDRESS << 1, &cmd, 1, HAL_MAX_DELAY);  
  28.     HAL_Delay(50);  
  29.     HAL_I2C_Master_Receive(&hi2c1, HTU21D_ADDRESS << 1, data, 2, HAL_MAX_DELAY);  
  30.    
  31.     uint16_t raw_temp = (data[0] << 8) | data[1];  
  32.     raw_temp &= 0xFFFC;  
  33.     return -46.85 + 175.72 * ((float)raw_temp / 65536.0);  
  34. }  

  35. void SystemClock_Config(void) {  
  36.     // CubeMX自动生成的时钟配置代码  
  37. }  
代码解读
  • 初始化模块
    系统初始化包括GPIO、I2C和UART模块的配置。STM32CubeMX工具自动生成这些代码,极大地减少了开发时间。
  • I2C通信实现

    • 使用HAL_I2C_Master_Transmit发送命令以启动温度测量。
    • 等待数据准备好后,调用HAL_I2C_Master_Receive读取返回的两字节数据。
  • 数据处理与输出
    传感器返回的原始数据经过公式转换,计算出实际温度,并通过UART接口打印到串口终端。

注意事项
  • 硬件连接时注意I2C线的上拉电阻配置,通常为4.7kΩ。
  • 如果出现通信问题,可通过逻辑分析仪查看波形,检查时序是否正确。
  • 温湿度传感器通常需要短暂延时等待数据稳定,实际项目中可根据数据手册调整延时。
扩展应用本文的实现可直接拓展至更多I2C传感器,例如压力传感器、气体传感器等。同时,STM32H743的强大性能也适合复杂的实时控制和数据处理任务,如FFT分析和图像处理。

公羊子丹 发表于 2024-11-30 07:44 来自手机 | 显示全部楼层
太棒了!STM32H743性能确实强大,这个案例很实用!
周半梅 发表于 2024-11-30 08:13 来自手机 | 显示全部楼层
有没有测试过采集频率的极限性能?
帛灿灿 发表于 2024-11-30 08:16 | 显示全部楼层
温湿度传感器可以换成其他型号吗?适配起来复杂吗?
童雨竹 发表于 2024-11-30 08:17 | 显示全部楼层
I2C通信里延时如何精准控制?对实时性要求高的项目会有影响吗?
万图 发表于 2024-11-30 08:17 | 显示全部楼层
看了代码,HAL库封装得确实方便,学习了!
Wordsworth 发表于 2024-11-30 08:17 | 显示全部楼层
UART输出的波特率设置可以调高点,会不会更快?
Pulitzer 发表于 2024-11-30 08:17 | 显示全部楼层
这种实时数据采集能否同步保存到SD卡?
Bblythe 发表于 2024-11-30 08:18 | 显示全部楼层
I2C总线挂多个传感器时,地址冲突该怎么解决?
Clyde011 发表于 2024-11-30 08:18 | 显示全部楼层
你有用STM32H743跑过FreeRTOS吗?和裸机比有啥体验?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

5820

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部