본문 바로가기

WCH/CH32V003

CH32V003 - MAX31855 온도 센서 테스트(플래시 메모리 문제 발생)

 

CH32V003에서 Arduino IDE에서 MAX31855 예제를 컴파일 하면 에러가 발생 한다.

https://nexp.tistory.com/2500

 

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

 

온도값은 정상적으로 출력이 되지만 메모리 문제는 극복하기 힘들것 같다. '쉽고 간단하게' 는 조금 문제가 있을것 같아 보인다.

 

반응형