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:
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:
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:
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:
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.