Upload
ljmnunes
View
25
Download
5
Embed Size (px)
DESCRIPTION
Fat Fs
Citation preview
FatFsUtilização da biblioteca FatFs para manipulação de arquivos em um cartão de memória SD pelo LM3S6965
1
Introdução Características de hardware:
Pinagem:
2
Introdução A FatFs é uma API desenvolvida para sistemas embarcados simples, podendo ser
utilizada em diversos microcontroladores.
Foi desenvolvida de modo a ser o mais independente possível da plataforma de hardware utilizada, necessitando que o usuário forneça as funções básicas para a comunicação serial entre MCU e cartão SD.
Possui suporte ao FAT12,FAT16 e FAT32
Diagrama de blocos:
Aplicação
FatFs
Disk I/OComunicação com o cartão SD
Dependente do HardwareRTC
O usuário deve
desenvolver esta parte
3
Características A Luminary desenvolveu todas as rotinas de comunicação serial entre o
LM3S6965 e o cartão SD, permitindo a utilização imediata da FatFs. Verifique o arquivo mmc-ek-lm3s6965 .
Existem versões prontas do Disk I/O , no site do desenvolvedor, para os MCUs : AVR, PIC24, LPC2000, V850ES, H8/300H, SH-2A, RX62N.
Algumas informações úteis sobre o sistema de arquivos FAT:
• Cada cartão SD comum possui N setores (dependendo de sua capacidade) de 512 bytes.
• O sistema de arquivos FAT utiliza um sistema de clusters, que é um agrupamento de setores. O tamanho de cada cluster durante a formatação do cartão SD no Windows pode ser de 32 KB ou 64 KB.
• O FAT16 trabalha com clusters de 32KB, como o endereçamento é de 16 bits, pode-se acessar até por partição.
• O FAT32 pode trabalhar com clusters de 32KB ou 64KB, permitindo endereçar no máximo por partição.
4
Memória Uso de memória da FatFs em diversos MCUs:
ARM732bit
ARM7Thumb
Cortex-M3Thumb-2
AVR H8/300H PIC24 V850ES SH-2A RX62N IA-32
Compiler GCC GCC GCC GCC CH38 C30 CA850 SHC RXC VC6
_WORD_ACCESS 0 0 0 1 0 0 1 0 1 1
text (Full, R/W) 10495 7205 6661 12646 10686 11430 7732 8752 5747 7545
text (Min, R/W) 6523 4749 4335 8306 6986 7413 4938 5576 3746 4923
text (Full, R/O) 4539 3183 2893 5960 4876 5250 3554 3804 2659 3450
text (Min, R/O) 3307 2495 2191 4366 3770 3939 2684 2940 2025 2664
bss D*4 + 2 D*4 + 2 D*4 + 2 D*2 + 2 D*4 + 2 D*2 + 2 D*4 + 2 D*4 + 2 D*4 + 2 D*4 + 2
Work area(_FS_TINY == 0)
V*560 +F*550
V*560 +F*550
V*560 +F*550
V*560 +F*544
V*560 +F*550
V*560 +F*544
V*560 +F*544
V*560 +F*550
V*560 +F*550
V*560 +F*550
Work area(_FS_TINY == 1)
V*560 +F*36
V*560 +F*36
V*560 +F*36
V*560 +F*32
V*560 +F*36
V*560 +F*32
V*560 +F*36
V*560 +F*36
V*560 +F*36
V*560 +F*36
5
Funções A API fornece as seguintes funções de manipulação no sistema de arquivos FAT:
Note que algumas funcionalidades mais avançadas como Defrag ou Fdisk não foram implementadas, a API também não possibilita a formatação de um cartão SD
unlink - Remove a file or directoryf_chmod - Change attributef_utime - Change timestampf_rename - Rename/Move a file or directoryf_mkfs - Create a file system on the drivef_forward - Forward file data to the stream directlyf_chdir - Change current directoryf_chdrive - Change current drivef_getcwd - Retrieve the current directoryf_gets - Read a stringf_putc - Write a characterf_puts - Write a stringf_printf - Write a formatted stringf_tell - Get the current read/write pointerf_eof - Test for end-of-file on a filef_size - Get size of a filef_error - Test for an error on a file
f_mount - Register/Unregister a work areaf_open - Open/Create a filef_close - Close a filef_read - Read filef_write - Write filef_lseek - Move read/write pointer, Expand file sizef_truncate - Truncate file sizef_sync - Flush cached dataf_opendir - Open a directoryf_readdir - Read a directory itemf_getfree - Get free clustersf_stat - Get file statusf_mkdir - Create a directory
6
Limites Suporta: FAT12, FAT16 and FAT32.
Número de arquivos abertos: Depende da memória disponível do MCU
Número de volumes: 10
Tamanho do arquivo: até 4 GB (FAT32)
Tamanho do volume (FAT16): Até 2 GB (considerando 512 bytes/setor)
Tamanho do volume (FAT32): Até 2 TB (considerando 512 bytes/setor)
Tamanho do cluster: Até 64 KB (considerando 512 bytes/setor)
Tamanho do setor: Até 4KB
7
Manipulação de arquivos Passos para desenvolver uma aplicação, utilizando a FatFs, de modo a manipular
um arquivo do tipo txt.
1- Montar a unidade:Inicialmente deve-se montar a unidade para que a FatFs seja iniciada. Esta função prepara o sistema para a interface com determinado cartão de memória SD, iniciando o cartão de memória , identificando o sistema de arquivos presente e preparando toda a API; existe a possibilidade de interface de mais de um cartão SD ao mesmo tempo ( suporte a múltiplos volumes ).
Função : FRESULT f_mount ( Byte Drive, FATFS* FileSystemObject) ;
Drive : Qual drive será utilizado, pode variar entre 0 e 9FileSystemObject : Ponteiro para a área de trabalho da FatFs Retorna : FR_OK ou FR_INVALID_DRIVEExemplo:f_mount(0, &wFatFs);
wFatFs deve ser declarada como FATFS : static FATFS wFatFs;
8
Manipulação de arquivos 2- Abrir o arquivo
O próximo passo consiste em abrir o arquivo .txt em questão, para isso utiliza-se a função f_open:
FRESULT f_open ( FIL* FileObject, const TCHAR* FileName, BYTE ModeFlags);
FileObject irá representar a manipulação do arquivo, contem uma estrutura de dados que armazena todas as informações do mesmo, muito útil pois permite ao usuário escrever ou ler dados na posição que desejar em um determinado arquivo.
FileName é o nome do arquivo a ser aberto.
9
Manipulação de arquivosModeFlag representa o tipo de acesso a ser atribuído ao arquivo:
ModeFlag Descrição
FA_READ Coloca o arquivo em modo de leitura. Pode ser combinada com FA_WRITE. (FA_READ | FA_WRITE) .
FA_WRITE Coloca o arquivo em modo de escritaPode ser combinada com FA_READ. (FA_READ | FA_WRITE) .
FA_OPEN_EXISTING Abre um arquivo que já existe no disco
FA_OPEN_ALWAYS Tenta abrir o arquivo, se o mesmo não existir, cria o arquivo.
FA_CREATE_NEW Cria um novo arquivo
FA_CREATE_ALWAYS Cria um novo arquivo, se o mesmo existir o arquivo será sobrescrito
10
Manipulação de arquivosExemplo :
f_mount(0, &wFatFs); // monta a unidade /* abre o arquivo ti.txt */resultado = f_open(&fobj, "ti.txt", FA_OPEN_EXISTING | FA_READ);
Considerando que a função f_mount obteve sucesso, inicializando o cartão SD e detectando o sistema de arquivos nele presente, a função f_open irá tentar abrir o arquivo ti.txt, como nenhuma função de manipulação de diretórios foi utilizada, a função irá procurar o arquivo no diretório raiz.A variável resultado deverá resultar em FR_OK se tudo ocorreu bem.
Observe que o arquivo será colocado em modo de leitura.
As variáveis fobj , wFatFs e resultado devem ser declaradas:FRESULT resultado;FATFS wFatFs;FIL fobj;
11
Manipulação de arquivos 3 - Ler dados do arquivo
Com o arquivo devidamente aberto em modo de leitura, a função f_read pode ser utilizada para a leitura de dados.Cada vez que esta função é executada, uma nova parte do arquivo será lido, obedecendo a sequencia início -> fim do arquivo (eof).
Função: FRESULT f_read ( FIL* FileObject, void* Buffer, UINT ByteToRead, UINT* ByteRead);
Buffer: Onde os dados serão armazenados.
ByteToRead: Quantidade de bytes a serem lidos.
ByteRead: Quantidade de bytes lidos.
Importante: FileObject é incrementado conforme o número de bytes que foram lidos, portando caso a função seja chamada novamente, é garantido que novos dados serão lidos ao menos que haja um eof.
12
Manipulação de arquivosExemplo:
f_mount(0, &wFatFs); // monta a unidade /* abre o arquivo ti.txt */resultado = f_open(&fobj, "ti.txt", FA_OPEN_EXISTING | FA_READ);
/* le uma parte do arquivo, a quantidade depende do tamanho do buffer ! */resultado = f_read(&fobj, buffer, sizeof(buffer), &bytesLidos);
Buffer deve ser declarado como um array de caracteres, bytesLidos como WORD (tipo definido pela API).
Observe se bytesLidos for igual a zero, temos um fim de arquivo (eof).
13
Manipulação de arquivos 4 - Escrever dados no arquivo
Com o arquivo devidamente aberto em modo de escrita, a função f_write pode ser utilizada para a escrita de dados.
Função: FRESULT f_write ( FIL* FileObject, void* Buffer, UINT ByteToWrite, UINT* ByteWritten);
Buffer: Dados que serão escritos.
ByteToWrite: Quantidade de bytes a serem escritos.
ByteWritten: Quantidade de bytes escritos.
Importante: FileObject também é incrementado conforme o número de bytes escritos, portando caso a função seja chamada novamente, é garantido que os novos dados não irão sobrescrever os anteriores ao menos que os dados já estavam no txt e FileObject ainda não está em uma posição adequada.
14
Manipulação de arquivosExemplo:
f_mount(0, &wFatFs); // monta a unidade /* abre o arquivo ti.txt */resultado = f_open(&fobj, "ti.txt", FA_OPEN_EXISTING | FA_WRITE);
/* Escreve “Ola Mundo” no buffer*/strcpy( buffer , ”Ola Mundo”);bytes = strlen( buffer );
/* Escreve no começo do arquivo “ti.txt” */f_write(&fobj,buffer, bytes, &bytesEscritos);
Buffer deve ser declarado como um array de caracteres, bytesEscritos e bytes como WORD (tipo definido pela API).
15
Manipulação de arquivos 5 - Fechar o arquivo
Para fechar o arquivo utiliza-se a função f_close:
Função: FRESULT f_close ( FIL* FileObject);
16
Considerações Finais Site do Desenvolvedor : http://elm-chan.org/fsw/ff/00index_e.html
Duvidas: [email protected]
17