SOBRE

LightBlog
Responsive Ads Here

domingo, 26 de janeiro de 2014

#6 Freedom Board - Hello World na porta Serial

O primeiro tutorial serĂ¡ bem simples, para escrever na porta Serial utilizando a Freedom Board KL25Z. Antes de mais nada, certifique-se que vocĂª jĂ¡ tem instalado o CodeWarrior, caso nĂ£o tenha, aqui possui um tutorial.
Apesar de ser um sistema embarcado, algumas vezes Ă© importante mostrar dados na serial, para monitorar variĂ¡veis. Neste exemplo, vocĂª poderĂ¡ escrever na serial e o programa irĂ¡ imprimir o dado igual.
Primeiro crie um novo projeto: File > New > Bareboard
Obs: Utilizando a opĂ§Ă£o Bareboard significa que nĂ£o serĂ¡ utilizando nenhum sistema operacional embarcado.
Uma nova janela irĂ¡ aparecer, coloque o nome do projeto e  pressione Next. 
Uma nova janela irĂ¡ aparecer, selecione Kinetis L Series > KL2X Family > KL25Z (48MHz) Family > MKL25Z128.
Modelo utilizado neste projeto pode ser visto neste link.
ApĂ³s isso, adicione os seguintes componentes:



Caso, nĂ£o tenha o componente RingBufferUInt8, ele pode ser baixado aqui.  

ConfiguraĂ§Ă£o UART
Como o modelo KL25Z nĂ£o tem um conector UART fĂ­sico, vou utilizar o OpenSDA porta virtual USB CDC P&E. 

Adicione o componente Serial_LDD e configure com interrupĂ§Ă£o ativa usando os TPM2_CH0 e TPM2_CH1 pinos, como mostra a figura abaixo:



O RingBufferUInt8 Ă© configurado da seguinte maneira: 



ApĂ³s configurado Ă© preciso gerar os cĂ³digos, pressione o botĂ£o generate Code, como mostra a figura abaixo: 


Para esta aplicaĂ§Ă£o foram criados dois arquivos, Application.c e Application.h. 

No arquivo Application.h foi colocado o seguinte cĂ³digo: 

#include "PE_Types.h"
#include "PE_LDD.h"
 
typedef struct {
  LDD_TDeviceData *handle; // Dispositivo LDD
  volatile uint8_t isSent; // Quando o bloco for enviado, esta variĂ¡vel vai ser 1
  uint8_t rxChar; // Buffer de caracteres
  uint8_t (*rxPutFct)(uint8_t);
} UART_Desc;
 
void APP_Run(void);


APP_Run() Ă© a funĂ§Ă£o principal (chamado depois que todas as funções do sistemas forem chamadas na funĂ§Ă£o main()).

No arquivo Application.c Ă© colocado o seguinte cĂ³digo:



#include "Application.h"
#include "RxBuf.h"
#include "AS1.h"
 
static UART_Desc deviceData;
 
static void SendChar(unsigned char ch, UART_Desc *desc) {
  desc->isSent = FALSE;  // É definido quando o bloco 1 for enviado
  while(AS1_SendBlock(desc->handle, (LDD_TData*)&ch, 1)!=ERR_OK) {} // Manda o char
  while(!desc->isSent) {} // Aguarda atĂ© receber a confirmaĂ§Ă£o que foi enviado.
}
 
static void SendString(const unsigned char *str,  UART_Desc *desc) {
  while(*str!='\0') {
    SendChar(*str++, desc); //Envia carĂ¡cter por carĂ¡cter
  }
}
 
static void Init(void) {
  //Inicializa a struct
  deviceData.handle = AS1_Init(&deviceData);
  deviceData.isSent = FALSE;
  deviceData.rxChar = '\0';
  deviceData.rxPutFct = RxBuf_Put;
  // Configura para iniciar o Buffer, começar receber
  RxBuf_Init(); // Inicializa o buffer
  // Configura como buffer de byte Ăºnico
  while(AS1_ReceiveBlock(deviceData.handle, (LDD_TData *)&deviceData.rxChar, sizeof(deviceData.rxChar))!=ERR_OK) {} // Inicio para começar receber dados
}
 
void APP_Run(void) {
  Init();
  SendString((unsigned char*)"Hello World\r\n", &deviceData);
  for(;;) {
    if (RxBuf_NofElements()!=0) {
      SendString((unsigned char*)"echo: ", &deviceData);
      while (RxBuf_NofElements()!=0) {
        unsigned char ch;
 
        (void)RxBuf_Get(&ch);
        SendChar(ch, &deviceData);
      }
      SendString((unsigned char*)"\r\n", &deviceData);
    }
  }
}

Como estĂ¡ sendo utilizado interrupĂ§Ă£o Ă© preciso preencher as funções (OnBlockReceived () e OnBlockSent ()) em Events.c:



Por Ăºltimo Ă© sĂ³ abrir o arquivo ProcessExpert.c e adicionar a biblioteca Application.h no topo do cĂ³digo e chamar a funĂ§Ă£o APP_Run() logo apĂ³s a funĂ§Ă£o  PE_low_level_init();

Agora Ă© compilar o programa e passar para sua Freedom Board. Para este exemplo foi utilizado o terminal Termite 2.9 que pode ser baixado aqui

Abaixo uma imagem de um teste realizado.