Este é outro artigo que apresenta a programação do microcontrolador ARM Cortex-M3 LPC1768. A maioria dos tutoriais usará bibliotecas pré-fabricadas nos tutoriais a seguir. Às vezes é necessário criar uma nova biblioteca para o seu próprio projeto. Este tutorial explica como fazer uma biblioteca customizada em Keil e também inclui uma biblioteca construída para as funções GPIO do LPC1768. A configuração do ambiente para o desenvolvimento do ARM córtex M3 é bem discutida neste artigo.
O LPC 1768 é um microcontrolador baseado em ARM Cortex-M3 para recursos de aplicação embarcados com baixo consumo de energia e alto nível de integração. O ARM Cortex M3 foi projetado de forma a aprimorar os recursos de depuração e um nível mais alto de integração do sistema. Ele funciona a uma frequência de CPU de 100 MHz e incorpora um pipeline de 3 estágios e usa uma arquitetura Harvard com instruções locais separadas e barramentos de dados para periféricos de terceiro barramento. A CPU ARM Cortex-M3 possui uma unidade interna de pré-busca para suportar ramificações especulativas. Os componentes periféricos incluem 512 KB de memória flash, 64 KB de memória de dados, Ethernet MAC, USB OTG, 4 UARTs, controlador DMA de uso geral de 8 canais, 2 controladores SSP, DAC de 10 bits, interface de codificador de quadratura, interface SPI, 3 barramentos I2C interface, interface de barramento I2S de 2 entradas mais 2 saídas, 4 temporizadores de uso geral, relógio em tempo real (RTC) de consumo ultrabaixo com fonte de bateria separada e até 70 pinos de E/S de uso geral, PWM de uso geral de 6 saídas. Os LPC1768/66/65/64 são compatíveis com os pinos da série de microcontroladores baseados em LPC236x ARM7 de 100 pinos.
Bibliotecas:
Existe uma biblioteca de dois arquivos, um arquivo de código e um arquivo de cabeçalho. Eles deveriam ter o mesmo nome, mat_lib por exemplo. O arquivo de código é chamado mat_lib.c e o arquivo de cabeçalho mat_lib.h. O arquivo de código é o arquivo que contém o código real que deve ser executado e os arquivos de cabeçalho são apenas uma lista com todas as instruções da biblioteca dentro. Para adicionar novos arquivos a um projeto:
Fig. 1: Adicionar novos arquivos para projeto em LPC1768
Para este exemplo, faremos o seguinte código em uma biblioteca:
UMA = UMA * 2;
UMA = UMA + 2;
O código simplesmente multiplica uma variável por 2 e depois adiciona 2. A instrução será nomeada A = Multiplicar soma2(A); Para a biblioteca é necessário criar 2 arquivos no projeto. Arquivo AC e um arquivo H conforme explicado acima.
O código da biblioteca deve ser colocado em uma função como esta:
vazio Multiplyadd2( vazio )
{
//instrução
}
Void significa vazio, se uma instrução não precisar enviar nenhum dado de volta, void pode ser usado. A variável que queremos modificar precisa ser enviada com a instrução e a instrução deve enviar um valor de volta. Para alterar a instrução pode-se usar variáveis do código principal para o qual deve ser alterado:
void Multiplyadd2 (variável uint32_t)
Em vez de uint32_t qualquer variável pode ser usada. Múltiplas variáveis também podem ser usadas:
(Variável uint32_t, Variável uint16_t2, Char char3)
O comando para a linha acima é: A = Multiplicaradicionar2(Variável, Variável2, Caráter3); Para o comando multiplicar e adicionar 2 a uma variável basta usar 1 variável, aquela que precisa ser multiplicada etc.
A instrução também deve enviar o valor de volta após a conclusão dos cálculos. Para fazer isso, o void no início deve ser alterado em uma variável:
uint32_t Multiplyadd2(variável uint32_t)
{
}
Agora o código real pode ser adicionado à instrução:
uint32_t Multiplyadd2(variável uint32_t)
{
Variável = Variável * 2;
Variável = Variável + 2;
variável de retorno;
}
A instrução de retorno envia a variável de volta após a conclusão dos cálculos. O arquivo .c também precisa de algumas inclusões. No topo do arquivo .c, os seguintes includes precisam ser adicionados:
#incluir “lpc17xx.h”
#incluir “tipos.h”
#incluir “mat_lib.h”
Essas inclusões são necessárias para que a biblioteca saiba qual microcontrolador é usado e que variáveis podem ser usadas na biblioteca. Também é possível adicionar outras inclusões para outras bibliotecas para que possam ser utilizadas na nova biblioteca.
A única coisa que resta é adicionar o código do arquivo .h. Nos arquivos .h estão listadas todas as instruções que podem ser usadas. Esta biblioteca de exemplo possui apenas uma instrução, então o código é:
uint32_t Multiplyadd2(variável uint32_t);
Para utilizar a biblioteca basta incluir Tutlibrary.h no código principal e ela estará pronta para uso. Criar bibliotecas para o LPC1768 funciona da mesma forma que criar bibliotecas para qualquer linguagem de programação C.
Crie um projeto usando Keil uvision4 para microcontrolador LPC1768:
Nesta seção, começaremos a criar um projeto no Keil MDK, já instalamos Keil µVision e Co-MDK Plug-in + CoLinkEx Drivers necessários para o adaptador de programação CoLinkEx. Você pode começar baixando os arquivos do projeto e experimentar a biblioteca feita para GPIO do LPC1768.
Código.rar
Descrição do código:
A programação ARM requer um bom manuseio da manipulação de bits na linguagem C. Aqui está uma pequena nota na introdução da manipulação de bits para um novato. C tem suporte direto para operações bit a bit que podem ser usadas para manipulação de bits. Nos exemplos a seguir, n é o índice do bit a ser manipulado dentro da variável bit_fld, que é um caractere não assinado sendo usado como campo de bit. A indexação de bits começa em 0, não em 1. O bit 0 é o bit menos significativo.
Defina um pouco
bit_fld = (1 <
Limpe um pouco
bit_fld &= ~(1 <
Alterne um pouco
bit_fld ^ = (1 << n)
Teste um pouco
bit_fld & (1 <
A biblioteca GPIO fornecida acima inclui um total de 7 funções que podem ser usadas para completar as ações do GPIO facilmente.
· GPIOSetDir(uint32_t númeroporta, uint32_t bitPosi, uint32_t dir);
· GPIOSetValue(uint32_t númeroporta, uint32_t bitPosi, uint32_t bitVal);
· GPIOSetPull(uint32_t portNum, uint32_t bitPosi, uint32_t dir);
· GPIOGetValue (uint32_t portNum, uint32_t bitPosi);
· GPIOSetInterrupt (uint32_t portNum, uint32_t bitPosi, uint32_t dir);
· GPIOClearInterrupt(void);
· uint32_t GPIOCheckInterrupts ( uint32_t portNum, uint32_t dir);
As portas GPIO podem ser usadas como entrada ou saída, para este tutorial a porta GPIO é usada como saída. As instruções para configurar uma porta GPIO:
GPIOSetDir(portnum, bitposi, dir);
Portnum é o número da porta, pode ser de 0 a 4 dependendo da porta IO usada. Bitposi é a posição do bit do número da porta; isso pode ser de 0 a 31 dependendo da porta IO usada. Dir é a direção, 0 para entrada e 1 para saída. Também é possível digitar Entrada ou Saída. A porta IO usada neste tutorial é GPIO-1.25 e é usada como saída. A instrução correta para configurar a porta IO é:
GPIOSetDir(1, 25, SAÍDA); ou:
GPIOSetDir(1, 25, 1);
Para aumentar ou diminuir um IO, o comando: GPIOSetValue(portnum, bitposi, valor);
Portnum e bitposi são iguais ao comando GPIOSetDir. O valor determina se um IO está ligado ou desligado, 0 de Baixo para desligado e 1 ou Alto para ligado. Para ativar o pino IO 1.25 no comando é:
GPIOSetValue(1, 25, ALTO); ou
GPIOSetValue(1, 25, 1);
O próprio nome das demais funções dará as explicações para sua utilização. Você pode comparar essas funções da biblioteca com a folha de dados do LPC1768 para melhor compreensão.
Código-fonte do projeto
###
Diagramas de circuito
Diagrama de Circuito Criando Biblioteca para LPC1768 |