Integrando a Stack FatFS no FreeRTOS + LPC1768

Postado em

Olá!

Hoje vamos ver como integrar a projetos com freeRTOS a pilha Chan FatFS, que permite ao microcontrolador LPC1768 acessar sistemas com sistema de arquivos FAT32. Aqui não vou focar nas configurações de hardware e nem nas pinagens pois isso pode ser achado facilmente na Internet.

indexPrimeiro você precisa de um Workspace já pronto para trabalhar com FreeRTOS. Como montar tal sistema inicial pode ser visto aqui neste blog. Depois, baixe o arquivo fonte com a pilha FatFs na pagina oficial do projeto AQUI (A versão usada é a v0.11) e descompacte a mesma em uma pasta qualquer em seu computador.

Screenshot from 2015-02-14 20:37:22Vá no seu workspace, no projeto principal onde já tem a pasta do freertos e crie uma pasta com o nome de fatfs e copie tudo que estava na pasta descompactada para cá. neste momento, se você expandir os diretórios, encontrará algo semelhante ao encontrado a esquerda.

Depois, vamos excluir do build tudo aquilo que não importa e só lembrando que aqui não se apaga nada, para tornar facil a atualização da stack e o seu entendimento. Exemplo: Atualizei da Stack v0.10c para a v0.11 somente substituindo seus arquivos que são compilados e não encontrei problemas.

Exclua do BUILD (conforme vimos no post de freeRTOS):

  • diskio.c
  • Na pasta option, exclua tudo exceto o arquivo syscall.c

Agora, crie uma pasta em fatfs com o nome user_config, que armazenará todos os arquivos adicionais para que possamos integrar essa stack no freertos e com os demais periféricos do LPC1768. O conteúdo dessa pasta está disponível no meu Google Code e tem os arquivos de comunicação SPI, configuração RTC, o arquivo de abstração que conecta a stack com as funções de acesso ao SDcard e ao USB. Neste ultimo caso, não estamos usando a diskio.c para o arquivo de abstração mas no futuro corrigirei isso.

As ultimas modificações são na stack diretamente e como na stack freertos, nós vamos mexer o mínimo possível para tornar as atualizações faceis. Os arquivos que modificaremos são:

  • ffconfig.h (Que configura os recursos da stack FatFS) e,
  • Syscall.c (Que configura a integração da FatFS com o FreeRTOS.

No ffconfig.c as modificações que devemos fazer são:

  • Adicionar o cabeçario #include “FreeRTOS.h” e #include “semphr.h” no inicio do arquivo;
  • Mude a opção _FS_REENTRANT  para 1, o _FS_TIMEOUT para 10000 e _SYNC_t para SemaphoreHandle_t;

No syscall.c retire os comentários de todas as funções que falam do FreeRTOS e comente as demais pois por padrão vem descomentado as funções que tratam o Win32 (Bleh!).

Se não quiser ter esse trabalho, vá no meu Google Code e busque os arquivos já modificados.

Finalizando, no seu main.c adicione o código abaixo:

#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif

#include "cr_section_macros.h"
#include "stdio.h"

#include "FreeRTOS.h"
#include "task.h"

#include "ff.h"

void blinkLed(void *pvParameters)
{
    LPC_GPIO0->FIODIR |= (1<<4);

    while(1)
    {
        LPC_GPIO0->FIOSET = (1<<4);
        vTaskDelay(500/portTICK_RATE_MS);
        LPC_GPIO0->FIOCLR = (1<<4);
        vTaskDelay(500/portTICK_RATE_MS);
    }
}

void sdTimerSupport(void *pvParameters)
{
	while(1)
	{
		disk_timerproc();
		vTaskDelay(10/portTICK_RATE_MS);
	}
}

void sdMount(void *pvParameters)
{
	FATFS FatFs;   /* Work area (file system object) for logical drive */
	FIL fil;       /* File object */
	char line[82]; /* Line buffer */
	FRESULT fr;    /* FatFs return code */

        printf("Montando...\r\n");

	/* Register work area to the default drive */
	fr = f_mount(&FatFs, "", 1);

	printf("Abrindo...\r\n");

	/* Open a text file */
	fr = f_open(&fil, "message.txt", FA_READ);
	if (fr)
		printf("Erro..\r\n");

	/* Read all lines and display it */
	while (f_gets(line, sizeof line, &fil))
		printf(line);

	printf("Final!\r\n");

	/* Close the file */
	f_close(&fil);

	while(1);
}

int main(void)
{
   SystemCoreClockUpdate();

   /* create task to blink led */
   xTaskCreate(blinkLed, "ledact", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
   /* Create task to control SD timer */
   xTaskCreate(sdTimerSupport, "tsdsup", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
   /* Create task to mount and read SDCard */
   xTaskCreate(sdMount, "sdmount", configMINIMAL_STACK_SIZE * 7, NULL, tskIDLE_PRIORITY, NULL);

   /* Start the scheduler. */
   vTaskStartScheduler();

   while(1);

   return 0;
}

Compile o projeto e antes de iniciar, adicione o arquivo message.txt em um cartão SD formatado com FAT32 com um texto qualquer dentro dele.

Ao iniciar, o microcontrolador vai montar o cartão e colocar no console o que estiver escrito no arquivo message.txt

Bom, no mais, é só isso… Vamos pensar um pouco!

Até!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s