UNIFEI Universidade Federal de Itajubá IESTI - Instituto de Engenharia de Sistemas e Tecnologia da Informação ELT031 Aprendizado Baseado em Projeto I Instalação de ambiente de desenvolvimento para a série NXP LPC111x Prof. Rodrigo de Paula Rodrigues 10 de Setembro de 2014 A série LPC111x A série LPC111x faz parte série de microcontroladores ARM LPC11xx. Esta série, fornecida pela NXP Semiconductros N.V, emprega um núcleo de processamento ARM em uma arquitetura Cortex-M0. Dentre as aplicações de destino para a série LPC111x, estão as que requerem baixo consumo, baixa quantidade de pinos em uma estrutura que proporcione poder de processamento superior aos processadores de 8 bits cotados para as mesmas aplicações. LPC111x Instalação de ambiente de desenvolvimento 1/16
Conteúdo 1. Recursos necessários... 3 2. Instalação do ambiente EmBlocks... 4 3. Instalação do programador serial FlashMagic... 5 4. Criação de projetos no EmBlocks... 6 5. Implementação do programa embarcado... 12 6. Programação do dispositivo por meio do carregador de arranque serial... 14 7. Programa de exemplo: pisca LED... 16 LPC111x Instalação de ambiente de desenvolvimento 2/16
1. Recursos necessários - Ambiente de desenvolvimento EmBlocks, versão 2.20 (www.emblocks.org); - Programador serial FlashMagic, versão 8.18 (http://www.flashmagictool.com/); - Ponta de depuração SWD (JTAG) J-Link (para o caso de depuração em tempo real). Opções de instalação Os microcontroladores ARM da série LPC11x podem ser programados tanto por meio de sua interface SWD (JTAG) quanto por meio de um carregador de arranque (bootloader). A interface SWD permite tanto a programação do dispositivo quanto a depuração do código, mas exige, para tanto, um circuito programador externo no padrão SWD. Já para a programação por meio de seu carregador de arranque, apenas um conexão serial (RS232, UART) e um software de programação serial compatível são necessários. Opções de instalação em função da necessidade de programação: - programação do dispositivo por meio de seu carregador de arranque: EmBlocks + FlashMagic; - programação e depuração do dispositivo: EmBlocks + J-Link. LPC111x Instalação de ambiente de desenvolvimento 3/16
2. Instalação do ambiente EmBlocks O ambiente de desenvolvimento integrado EmBlocks é uma ótima opção de desenvolvimento livre para a plafatormas ARM Cortex (NXP e ST, principalmente). Ele incorpora o compilador ARM GCC (bare metal) e possui suporte às pontas de depuração JTAG J-Link e ST-Link, dentre muitos outros bons recursos e funcionalidades. Passos para efetuar a instalação: a) Execute o arquivo de instalação EmBlocks_2.20.exe; b) No passo relativo à escolha de componentes, selecione o tipo Custom e, na opção de compiladores, mantenha apenas o ArmGCC EmBlocks Embedded selecionado. Mantenha todas as demais opções selecionadas (Contributions, Default install e Plugins); c) Para os passos seguintes, opte pelas opções apresentadas pela interface e prossiga até finalizar a instalação. LPC111x Instalação de ambiente de desenvolvimento 4/16
3. Instalação do programador serial FlashMagic Um programador serial é necessário para efetuar a programação do microcontroladores da série LPC111x por meio de seu carregador de arranque (bootloader). Caso a programação seja efetuada por meio de circuito JTAG (J-Link), não é necessário instalar o programador serial. a) Execute o arquivo de instalação FlashMagic.exe; b) Seguir as opções padrão apresentadas pela interface até finalizar a instalação. LPC111x Instalação de ambiente de desenvolvimento 5/16
4. Criação de projetos no EmBlocks Os passos para a criação de projetos no ambiente EmBlocks são os seguintes: a) Com o ambiente de desenvolvimento aberto, selecione a opção File > New > Project no menu de opções; b) Na interface de escolha da categoria do projeto, opte por NXP-ARM. c) Na interface seguinte, simplesmente prossiga. LPC111x Instalação de ambiente de desenvolvimento 6/16
d) Selecione um título (1), caminho (2) e nome do arquivo de projeto (3) para o projeto em criação. e) Para a seleção do compilador associado ao projeto, mantenha as opções no padrão apresentado pela interface. LPC111x Instalação de ambiente de desenvolvimento 7/16
f) Efetua a escolha da série como LPC111x (1) e marque ambas as opções Create hex file (.hex) e Set device settings at target level (2). Ao fim, clique no botão Finish. g) Na interface que se abre, na aba Target settings, marque a opção Run to main( ) para ambos os perfis Debug e Release. LPC111x Instalação de ambiente de desenvolvimento 8/16
h) Se não for utilizar um circuito de depuração SWD J-Link, então salte para o item j). Já se for fazê-lo, prossiga até a aba GDB Server e realize as seleções segundo a figura seguinte. Ao fim, clique sobre o botão Settings >>. É necessário realizar as operações especificados neste item para ambos os perfis Debug e Release. i) Na interface de configuração do circuito SWD (JTAG), na aba Settings, realize as seleções listadas abaixo. Ao fim, clique sobre o botão Ok para fechar a interface e então no botão Ok da interface que se manteve aberta. a. Device: selecione o modelo do microcontrolador LPC111x em uso (ex: LPC1114/102); b. Interface: SWD; c. Jtag speed: 500; d. Auto speed: não selecione; e. Reset type: 0; f. Load program: selecione; g. Flash download: selecione; h. Flash breakpoint: selecione; i. Execute from RAM: não selecione. LPC111x Instalação de ambiente de desenvolvimento 9/16
j) No painel de arquivos de projeto, encontre o arquivo startup_lpc111x.s e o remova do projeto. Este é um arquivo presente no modelo de projetos para a arquitetura ARM que não é necessário para o compilador com o qual trabalhamos. k) Ainda no painel de arquivos de projeto, selecione o arquivo gcc_arm.ld. Este é um arquivo de linker que precisa refletir a quantidade de memória RAM e ROM presente no microcontrolador selecionado para o projeto. Abra tal arquivo para edição e procure, ao seu início, dela diretiva MEMORY. LPC111x Instalação de ambiente de desenvolvimento 10/16
Altere tal diretiva para refletir a quantidade de memória de seu dispositivo. Como exemplo, as diretiva memory apresentada na figura abaixo foi atualizada para refletir a memória do dispositivo LPC1114/102. Os informações necessárias para tal atualização constam no mapa de memória presente na folha de dados da série LPC111x (LPC111X.pdf). Nas figuras abaixo o arquivo gcc_arm.ld é modificado de forma a refletir a memória do dispositivo LPC1114/102. A figura que contém o mapa de memória foi retirada da folha de dados do dispositivo. Salve a atualização realizada no arquivo gcc_arm.ldd. Pronto! A partir deste ponto, o desenvolvimento pode ser iniciado. LPC111x Instalação de ambiente de desenvolvimento 11/16
5. Implementação do programa embarcado O projeto criado pelo ambiente EmBlocks segue um padrão chamado CMSIS. Este padrão é sugerido pela ARM e contém todos os arquivos necessários para se configurar a operação inicial de um dispositivo ARM, cobrindo, dentre outras coisas, a estipulação de fontes dos sinais de sincronismos do núcleo e de periféricos (clock, temporizadores e afins) como também inicializa recursos como a posição de pilhas de dados e direciona vetores de interrupções. Respeitando-se o padrão CMSIS, o projeto criado possui a relação de arquivos presente na tabela abaixo. Arquivo Source\Src\ main.c system_lpc11xx.c Headers\Inc\ LPC11xx.h power_profiles.h system_lpc11xx.h ASM Sources\Src\ startup_armcm0.s Others\ gcc_arm.ld readme.txt Função/aplicação Código-fonte para a aplicação a ser desenvolvida Rotinas de inicialização do dispositivo Definições de registradores e afins do dispositivo Definições de perfis de consume de energia Definições relativas às rotinas de inicialização Rotinas de inicialização em baixo nível Arquivo de definições para o linker Arquivo de informações sobre o linker Para implementar o programa embarcado a ser desenvolvimento, utilize o arquivo principal de chamadas, o main.c e, quando necessário, implemente arquivos adendos para tornar o desenvolvimento modular, mais organizado e funcional. Os demais arquivos presentes na estrutura do projeto são utilizados para se configurar a operação básica do dispositivo. Dentre eles, os arquivos LPC11xx.h e system_lpc11xx.h possuem todas as definições dos registradores e rotinas de inicialização básica do microcontrolador, respectivamente. Em especial, o arquivo system_lpc11xx.c, que assim como os anteriores respeitam o padrão citado, possui a implementação das rotinas de inicialização básica do microcontrolador: SystemInit e LPC111x Instalação de ambiente de desenvolvimento 12/16
SystemCoreClockUpdate. A rotina SystemInit é chamada após um evento de reinício (reset) e mesmo antes da chamada à rotina main() pois, em respeito ao padrão CMSIS, está atrelada do vetor de reset do dispositivo (vide arquivo em assembly startup_armcm0.s). Para compilar um programa desenvolvido e mesmo gerar arquivos de gravação e depuração do código relacionado, acesse as opções presentes na barra de acesso rápido. Uma descrição das ações é apresentada na figura subseqüente. Após uma compilação, os resultados e possíveis erros podem ser acessados no painel Build messages, localizado na porção inferior da interface do ambiente de desenvolvimento. Para saber mais sobre o padrão CMSIS e entender como configurar a operação inicial do dispositivo, acesse o endereço http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-softwareinterface-standard.php. Para obter mais informações sobre a programação da série LPC111x, consulte o documento LPC111x/LPC11Cxx User manual (UM10398). LPC111x Instalação de ambiente de desenvolvimento 13/16
6. Programação do dispositivo por meio do carregador de arranque serial Para utilizar o carregador de arranque da série LPC111x, é necessário que seu circuito de aplicação disponibilize conexão ao periférico serial do microcontrolador que possua um botão de reinício (reset), e que haja alguma forma de alternar o nível lógico em um pino do microcontrolador relacionado à operação de seu carregador de arranque, geralmente o pino PIO0_1. Mais informações sobre o carregador de arranque da série LPC111x podem ser obtidas no documento LPC111x/LPC11Cxx User manual (UM10398). Uma vez compilado e gerado o arquivo de gravação do aplicativo embarcado (arquivo.hex relativo ao projeto desenvolvimento), os passos para programação do dispositivo por meio de seu carregador de arranque são os seguintes: a) Abra o aplicativo FlashMagic e o configure da seguinte forma: a. Área 1 (Step 1): i. Selecione o modelo de microcontrolador utilizado (ex: LPC1114/102); ii. Selecione a porta serial (COM Port), no computador, conectada ao circuito do LPC111x; iii. Estipule a taxa de transferência (Baud Rate) para 57600; iv. Selecione a interface como None (ISP) ; v. Estipule a freqüência do oscilador para 12 MHz. b. Área 2(Step 2): i. Marque a opção Erase all Flash+Code RD Prot. c. Área 3(Step 3): i. Selecione o arquivo.hex a ser programado no microcontrolador; d. Área 4(Step 4): i. Marque apenas a opção Verify after programming. LPC111x Instalação de ambiente de desenvolvimento 14/16
b) Com a interface devidamente configurada para gravação, aplique nível lógico baixo ao pino de controle do carregador de arranque do microcontrolador (PIO0_1) e aplique um sinal de reinício (pulso negativo no pino de reset) ao microcontrolador; c) Neste momento, inicie o processo de gravação por meio do botão Start na área Step 5 do FlashMagic; d) Após certo tempo, deve surgir na interface do FlashMagic um sinal de fim e de sucesso da operação de gravação; e) Uma vez finalizada a operação de gravação com sucesso, para que o microcontrolador possa executar o programa gravado é necessário que um sinal de nível lógico alto seja estipulado no controle do carregador de arranque do microcontrolador (PI0_1) e um novo sinal de reinício (pulso negativo no pino de reset) seja aplicado ao microcontrolador. LPC111x Instalação de ambiente de desenvolvimento 15/16
7. Programa de exemplo: pisca LED O seguinte trecho de programa é um exemplo de arquivo main.c que faz com que o pino PT0_3 de um microcontrolador da série LPC111x tenha seu estado lógico alternado continuamente. Por ele, pode-se verificar como é configurada a direção de tal como saída e como seu estado lógico de saída pode ser acessado e alterado. Todos os demais parâmetros são configurados pela rotina SystemInit presente no arquivo system_lpc11xx.c pertencente ao projeto. main.c /* ** ** Main.c ** ** **********************************************************************/ /* Last committed: $Revision: 00 $ Last changed by: $Author: $ Last changed date: $Date: $ ID: $Id: $ **********************************************************************/ #include <LPC11xx.h> /* LPC11xx Peripheral Registers */ #include "system_lpc11xx.h" #define LED_PORT LPC_GPIO0 #define LED_PIN 3 int main(void) { unsigned int x; // Configurar o pino PT0_3 como saída LED_PORT->DIR = (1 << LED_PIN); while (1) { }; // Alternar o nível lógico no pino PT0_3 LED_PORT->DATA ^= (1 << LED_PIN); // Gerar um pequeno atraso para simular um "delay" for( x = 0; x < 0x002fffff; x++); } return 0; LPC111x Instalação de ambiente de desenvolvimento 16/16