如何在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
相关产品推荐
相关产品推荐

