Técnicas de Programação - Freescale Flash
Autor: Jorge d'Avila | Publicado: 2012-03-22T05:47:00-07:00

Tenho utilizado bastante os MCUs Freescale S08.&nbsp; São componentes robustos, e sua relação custo/benefício é muito boa.&nbsp; Hoje é possível comprar um MCU MC9S08SH8, com 18 linhas de IO, 3 timers e conversor AD por menos de R$&nbsp;2,00, colocado no Brasil!

Os S08 dispõem de uma enorme variedade de periféricos, o que facilita em muito sua utilização nas mais variadas aplicações.&nbsp; Por exemplo, um MC9S08AC32, comprado no Brasil por cerca de R$&nbsp;8,00, dispõe de 54 linhas de IO (!!!), 32kB de Flash, 2kB de RAM, 29 interrupções distintas, conversor AD com 28 entradas multiplexadas e sensor interno de temperatura, clock interno com ou sem referência cristal, interfaces IIC, SCI e SPI,&nbsp;3 timers&nbsp;com PWM, captura e comparação com um total de 10 canais... UFA!!!&nbsp; São MUITOS periféricos para um componente de menos de US$&nbsp;5,00!

No entanto, em um pequeno aspecto, eu ainda não estava satisfeito.&nbsp; Muitas famílias de MCUs dispõem de uma Flash ou EEPROM dedicada a dados, e isso é muito útil especialmente para se guardar dados de configuração de software.&nbsp; Para grande volume de dados é comum se utilizar uma Flash externa, 24LC512 ou similar, mas a gravação de uns poucos bytes de configuração não justifica o preço e complexidade de adicionar essa Flash externa ao circuito.&nbsp; E a família S08 não dispõe de uma Flash desse tipo.

No entanto existe uma solução, apresentada nos próprios manuais da Freescale: utilizar parte da Flash de código para armazenar dados.&nbsp; Pensando bem, isso é mais interessante do que dispor de uma Flash separada para dados.&nbsp; Com a solução&nbsp;Freescale a configuração da Flash fica muito mais flexível, o programador decide quanto de Flash vai utilizar para código, e quanto para dados!

A gravação da Flash de código é um procedimento relativamente simples.&nbsp; No entanto apresenta um complicador: não se pode gravar a Flash e acessá-la para leitura de código simultaneamente.&nbsp; Como fazer, então, para executar um programa (normalmente residente na Flash) para gravar essa mesma Flash?

A solução é dada pela arquitetura Von Neumann dos S08.&nbsp; Nessa arquitetura o barramento de memória é único.&nbsp; RAM e Flash compartilham o mesmo espaço de endereçamento.&nbsp; É, assim, viável preparar todo o procedimento de gravação, copiar a pequena parte do programa que vai executar a gravação para RAM, e executá-la em RAM.

Esse algoritmo de gravação é bastante pequeno - consegui escrever a rotina para operações simples em 23 bytes. e a rotina para "burst" (gravação sequencial) em 44 bytes.

O próprio manual sugere que se utilize o espaço de Stack na RAM para executar o código de gravação.&nbsp; No entanto, o exemplo encontrado no manual é escrito em Assembler, e eu tenho por hábito utilizar C.&nbsp; Assim, escrevi as rotinas necessárias em C, criei um módulo de programa para isso, e... voilá!&nbsp; Posso agora utilizar parte da Flash para dados.

Não há limite para quanta área de Flash se utiliza com dados.&nbsp; No entanto escolhi utilizar apenas uma página - 512 bytes.&nbsp; O S08 não permite apagar áreas menores do que uma página, portanto essa é a granularidade da área de dados que vamos utilizar.

Na próxima postagem descreverei em detalhes como implementar esse método de gravação.