You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Arduino IDE中实现STM32L476RG的SRAM温湿度数据读写

Arduino IDE下STM32L476RG的SRAM读写实现(搭配HTS221温湿度采集)

一、基础SRAM存储:直接用变量/数组

在Arduino环境中,STM32L476RG的全局变量、静态变量、动态分配的内存默认都存储在SRAM中,无需额外复杂操作。你可以直接定义数组来积累温湿度整数数据:

代码示例:基础数据积累

#include "HTS221Sensor.h"

// 定义SRAM数组,用来存储温湿度数据(最多存100组)
int hum_temp_buffer[100];
int buffer_index = 0;
const int BUFFER_MAX = 100;

// 初始化HTS221传感器
HTS221Sensor hts221(&Wire);

void setup() {
  // 初始化串口(适配蓝牙模块,假设接Serial1)
  Serial1.begin(9600);
  Wire.begin();
  
  // 启动传感器
  hts221.init(NULL);
  hts221.enable();
}

void loop() {
  float humidity, temperature;
  int hum_int, temp_int;
  
  // 采集温湿度并转为整数(示例放大10倍保留精度)
  hts221.getHumidity(&humidity);
  hts221.getTemperature(&temperature);
  hum_int = (int)(humidity * 10); // 45.6% → 456
  temp_int = (int)(temperature * 10); // 23.2℃ → 232
  
  // 将数据存入SRAM数组
  if (buffer_index < BUFFER_MAX) {
    hum_temp_buffer[buffer_index++] = hum_int;
    hum_temp_buffer[buffer_index++] = temp_int; // 每组存湿度、温度两个整数
  }
  
  // 数组存满后通过蓝牙发送数据包
  if (buffer_index >= BUFFER_MAX) {
    // 文本格式发送(可改为二进制提升效率)
    for (int i = 0; i < BUFFER_MAX; i++) {
      Serial1.print(hum_temp_buffer[i]);
      if (i != BUFFER_MAX - 1) Serial1.print(",");
    }
    Serial1.println();
    
    // 重置缓冲区索引
    buffer_index = 0;
  }
  
  delay(1000); // 每秒采集一次
}

二、指定SRAM区域存储(针对特定内存区域需求)

如果需要将数据存入SRAM的指定区域(比如SRAM1、SRAM2),可以通过GCC属性或直接内存指针操作实现:

方法1:用__attribute__指定内存段

STM32L476的SRAM分为SRAM1(0x200000000x2001FFFF,128KB)、SRAM2(0x100000000x10003FFF,16KB)。在Arduino中可以通过__attribute__((section))指定变量存储区域:

// 指定数组存储到SRAM1区域
int custom_buffer[50] __attribute__((section(".sram1_data")));

// 指定数组存储到SRAM2区域
int sram2_buffer[20] __attribute__((section(".sram2_data")));

注:如果链接脚本未定义对应段名,可直接指定内存地址范围,同时保证内存对齐:

int custom_buffer[50] __attribute__((section(".bounce_buffer"))) __attribute__((aligned(4)));

方法2:直接操作SRAM内存地址

通过指针直接读写SRAM物理地址,适合精确控制内存位置:

// SRAM1起始地址(对应内存映射)
#define SRAM1_START 0x20000000
// 偏移地址,避免覆盖系统变量
#define DATA_START_OFFSET 0x1000

// 指向SRAM指定位置的指针
int *sram_data_ptr = (int *)(SRAM1_START + DATA_START_OFFSET);
int data_count = 0;

// 存储数据示例
sram_data_ptr[data_count++] = hum_int;
sram_data_ptr[data_count++] = temp_int;

三、关键注意事项

  • SRAM容量限制:STM32L476RG总SRAM为128KB+16KB,定义数组时不要超出可用内存,避免栈溢出或程序崩溃。
  • 数据特性:SRAM数据断电即失,若需持久化存储需搭配EEPROM或外部存储模块。
  • 发送效率:积累数据后建议用二进制格式打包发送,比文本格式更节省带宽和时间。

内容的提问来源于stack exchange,提问作者Riccardo Simonetti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:03:11