Mapa da Memória do SAM3X8E - clique para ampliar |
Memória
O SAM3X8E possui uma grande quantidade de Ram (96K) e de Flash (512K), porém não possui EEProm. A figura acimamostra o mapa da memória:
A SRAM totaliza 100K no SAM9X8E: um bloco de 64K em SRAM0, um bloco de 32K em SRAM1 e um bloco de 4K no controlador de NAND Flash e que pode ser usado por aplicações já que o Arduino DUE não tem uma NAND Flash externa.
A ROM interna possui dois programas gravados na Flash: SAM-BA e FFPI. O SAM-BA é um bootloader que suporta comunicação pela UART e pela USB. Como veremos adiante, é através dele que a IDE do Arduino carrega sketches. O FFPI é um outro bootloader, voltado para a gravação em paralelo de múltiplos SAM3X8E fora da placa final. Seu uso típico é a gravação em volume na linha de produção.
A execução sempre começa no endereço 0 (Boot memory na figura), o SAM3X8E pode ser configurado para manear a Flash0 ou a RAM interna neste endereço.
Os 512K de Flash são divididos em dois bancos de 256K (Flash 0 e Flash 1). Cada banco, por sua vez, é divido em 1024 páginas de 256 bytes. Uma página é o mínimo que pode ser apagado de cada vez. A Flash suporta entre 10 e 30 mil apagamentos, dependendo da temperatura. Além do apagamento por programa, o SAM3X8E possui um pino que apaga toda a Flash e coloca a configuração no estado padrão. O Arduino DUE possui um botão ligado a este pino.
Carga de Programas
Existem várias estratégias possíveis para carga de programas no SAM3X8E. A opção usada no Arduino DUE é usar o pino de ERASE para apagar a Flash e selecionar a configuração padrão e em seguida dar um Reset. Nestas condições o SAM3X8E irá executar o SAM-BA contido na Rom, permitindo a carga do programa pela serial ou pela USB nativa.
Os sinais ERASE e Reset são controlados pelo ATmega16U2 que está conectado à serial do SAM3X8E e à USB identificada como Programming. O ATmega16U2 se comporta para o host ligado ao USB como dispositivo de comunicação - uma porta serial virtual. Normalmente, quando uma conexão é feita pela USB o SAM3X8E é ressetado, simulando o auto-reset do Arduino Uno e inciando a execução do sketch. Entretanto, se a conexão for feita a 1200 bps, o ATmega16U2 considera isto como uma solicitação de preparo para carga de sketch. Para isto ele aciona o sinal ERASE e, posteriormente, o Reset.
Uma vez colocado o SAM3X8E no "modo SAM-BA", a IDE do Arduino usa um programa externo para fazer a carga (de forma semelhante ao uso do avrdude para gravar sketches nos Arduinos baseados nos microcontroladores AVR). O programa utilizado é o BOSSA (ugh!).
DMA
O recuso de DMA (Direct Memory Access) é bastante comum em microprocessadores, mas não costuma estar disponível nos microcontroladores mais simples (como os ATmega).
Em um processador sem recurso de DMA, a movimentação de dados entre a memória e um periférico é feita de uma sequência de instruções do tipo
- Espera o periférico estar pronto
- Movo o proximo byte entre a memória e o periférico
Com DMA o periférico transfere o byte diretamente de ou para a memória, sem envolver a CPU. Dependendo da arquitetura e da velocidade da memória, os ciclos para o DMA podem ser "roubados" da CPU, reduzindo o seu desempenho. Mesmo assim, é muito mais eficiente.
O SAM3X8E possui recursos bem completos de DMA:
- Pode ser usado com ADC, DAC, PWM e interfaces seriais (I2C, SPI, UART e USART)
- Suporta conexões unidirecionais e bidirecionais
- Gera interrupção de final de transferência
- Possibilita programar o endereço e tamanho da próxima transferência antes de finalizar a atual.
Referências
http://www.atmel.com/Images/Atmel-11057-32-bit-Cortex-M3-Microcontroller-SAM3X-SAM3A_Datasheet.pdf
http://playground.arduino.cc/Bootloader/DueBootloaderExplained
Nenhum comentário:
Postar um comentário