CH32V003에서 Arduino IDE에서 MAX31855 예제를 컴파일 하면 에러가 발생 한다.
region `FLASH' overflowed by 10576 bytes
플래시 메모리 용량이 부족하다.
CH32V003과 같이 메모리가 부족한 MCU에서 Arduino 코드로 작성하면 문제가 될것 같다.
라이브러리를 사용하지 않고 직접 작성해 보자
#include <SPI.h>
#define MAX31855_CS_BIT PC0
#define MAX31855_CS_LO() digitalWrite(MAX31855_CS_BIT, 0)
#define MAX31855_CS_HI() digitalWrite(MAX31855_CS_BIT, 1)
#define MAX31855_SpiRecvData(x) SPI.transfer(x)
unsigned long MAX31855_Read32(void)
{
int i;
union bytes_to_uint32 {
unsigned char bytes[4];
unsigned long integer;
} buffer;
MAX31855_CS_LO();
delay(1);
for (i=3;i>=0;i--)
{
buffer.bytes[i] = MAX31855_SpiRecvData(0x00);
}
MAX31855_CS_HI();
return buffer.integer;
}
float MAX31855_readCelsius(void)
{
unsigned long v;
v = MAX31855_Read32();
if (v & 0x7)
{
return 0.0;
}
if (v & 0x80000000)
{
v = 0xFFFFC000 | ((v >> 18) & 0x00003FFFF);
}
else
{
v >>= 18;
}
float centigrade = v;
centigrade *= 0.25;
return centigrade;
}
void setup() {
pinMode(MAX31855_CS_BIT, OUTPUT);
Serial.begin(115200);
Serial.println("MAX31855 Test");
SPI.begin();
SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
}
void loop()
{
float temp;
temp = MAX31855_readCelsius();
Serial.println((float)temp,3);
}
그래도 여전히 메모리가 부족하다.
region `FLASH' overflowed by 7008 bytes
플로팅 포인트를 시리얼로 출력해서 그런가?
온도 값에 1000을 곱해서 인티저로 변경해 보자
void loop()
{
int temp;
temp = (int)(MAX31855_readCelsius()*1000);
Serial.println(temp);
delay(3000);
}
이제 에러 없이 컴파일 된다.
하지만 용량이 거의 90%가 넘는다.
Sketch uses 15212 bytes (92%) of program storage space. Maximum is 16384 bytes.
온도 출력 결과
14500
14500
15000
온도값은 정상적으로 출력이 되지만 메모리 문제는 극복하기 힘들것 같다. '쉽고 간단하게' 는 조금 문제가 있을것 같아 보인다.
반응형