“Ampliando” a memória dos MSP430

Estou utilizando o MSP430F2001 em um projeto particular e me deparei com um problema bastante comum: o programa ficou maior que a memória do micro! Neste artigo mostro como extrair um pouco mais da memória destes micrinhos!

O MSP430F2001, fabricado pela Texas Instruments, é um microcontrolador RISC de 16 bits, dotado de 1kibibyte de memória flash de programa, 128 bytes de memória RAM, um timer de 16 bits e dois canais e comparador analógico. A linha MSP430 é bastante conhecida pelo sua eficiência energética e baixo consumo. No encapsulamento TSSOP de 14 pinos, estes micros são realmente pequenos e ao mesmo tempo bastante úteis.

Além da memória flash de 1kibibyte, os MSPs possuem também uma outra área de memória flash, conhecida como information memory. Trata-se de uma porção de memória flash (normalmente 256 bytes) destinada ao armazenamento de dados não voláteis da aplicação (além de alguns parâmetros de calibração do chip). Esta área é dividida em páginas de 64 bytes, ao passo que a memória de programa é normalmente dividida em páginas de 512 bytes.

Não precisa pensar muito para observar que num micro com apenas 1k de memória, 256 bytes a mais fariam bastante diferença! Imagine então num MSP430G2001, que possui apenas 512 bytes de memória de programa!!!

Se a sua aplicação não faz uso da área de memória de informação para o armazenamento de dados, por que não utilizá-la para o armazenamento de código? Atenção: a última página da memória de informação (0x10C0 a 0x10FF) é utilizada para o armazenamento das informações de calibração do oscilador interno do chip. Se você pretende utilizar e calibrar o DCO, mantenha esta área intacta!

Para utilizar a information memory como parte da memória de programa, bastam algumas modificações no arquivo de controle do linker (no IAR EW430 é o arquivo lnk430F2001.xcl): remova e modifique a distribuição da information memory e modifique a alocação da memória de código. Veja abaixo:

Antes:

// -------------------------------------
// Information memory
//

-Z(CONST)INFO=1000-10FF
-Z(CONST)INFOA=10C0-10FF
-Z(CONST)INFOB=1080-10BF
-Z(CONST)INFOC=1040-107F
-Z(CONST)INFOD=1000-103F

Depois:

// -------------------------------------
// Information memory
//

-Z(CONST)INFO=1080-10FF
-Z(CONST)INFOA=10C0-10FF
-Z(CONST)INFOB=1080-10BF

Com isso reduzimos a área de memória de informação para apenas 128 bytes (0x1080 a 0x10FF), liberando os outros 128 bytes (0x1000 a 0x107F). Mas eles ainda não serão utilizados automaticamente pelo linker. Para isso é necessário modificar a área alocada para o segmento de código:

Antes:

// -------------------------------------
// Constant data
//
-Z(CONST)DATA16_C,DATA16_ID,TLS16_ID,DIFUNCT,CHECKSUM=FC00-FFDF
// -------------------------------------
// Code
//
-Z(CODE)CSTART,ISR_CODE,CODE_ID=FC00-FFDF
-P(CODE)CODE=FC00-FFDF

Depois:

// -------------------------------------
// Constant data
//
-Z(CONST)DATA16_C,DATA16_ID,TLS16_ID,DIFUNCT,CHECKSUM=1000-107F,FC00-FFDF

// -------------------------------------
// Code
//
-Z(CODE)CSTART,ISR_CODE,CODE_ID=1000-107F,FC00-FFDF
-P(CODE)CODE=1000-107F,FC00-FFDF

Agora basta escrever o seu programa e desfrutar dos 1152 bytes de flash 🙂 Até a próxima!

Leave a Reply