ÍNDICE DE CONTEÚDO
No mercado, hoje, há diversas opções de microcontroladores, de diversos fabricantes. Cada fabricante, geralmente, oferece um SDK para facilitar o desenvolvimento de firmwares para esses dispositivos. Entretanto, migrar o microcontrolador de sua solução pode acabar se tornando uma verdadeira odisseia, exatamente, porque as SDKs de fabricantes diferentes – e às vezes de famílias diferentes – não são compatíveis a nível de código. Esse problema, exige um esforço extra de equipes de desenvolvedores, que terão que aprender a usar uma SDK nova a cada migração. Outro problema enfrentado por essas equipes, é o gerenciamento de licenças, pois nem sempre essas SDK estão disponíveis sob licenças “open source” ou livres de royalties. Para quem trabalha com a linha Cortex-M da ARM há uma solução para esses problemas: a biblioteca LibOpenCM3.
O projeto procura facilitar o desenvolvimento de aplicações oferecendo uma API de abstração de hardware comum para diversos microcontroladores com núcleos ARM Cortex-M0/M0+/M3/M4 de diversos fabricantes. Assim, poucas modificações são necessárias caso uma equipe decida migrar de fabricante, ou mesmo de linha, como de Cortex-M0 para Cortex-M4, por exemplo.
Outro ponto interessante é a licença. Todo código fonte está disponível sob licença LGPLv3, comumente utilizada por bibliotecas, a exemplo do Qt. Assim, a tomada de decisão e as questões legais de distribuição e venda da sua firmware ficam bem definidas.
Características
Revisando o código, percebe-se que cada plataforma suportada possui o seu diretório em include e em library. Nesses diretórios os periféricos suportados são expostos através de seus endereços na header memorymap.h. Cada plataforma possui seu mapeamento, bem como uma implementação de funções de acesso a esses periféricos (gpio, uart, adc, dac, etc), mantendo a assinatura dessas funções iguais entre as implementações, ou pelo menos muito parecidas, a fim de garantir a característica de portabilidade e diminuir o “overhead” em caso de migração.
A documentação da biblioteca é outro grande diferencial. A maioria as funções e definições possuem marcações do doxygen, ferramenta muito comum de documentação de API e SDK, o que é um auxílio extra na hora de programar, pois a maioria dos desenvolvedores possui alguma familiaridade com esse tipo de documentação.
Hands-On com a LibOpencm3
Os fontes podem ser encontrados na conta do github do projeto. No arquivo README encontram-se listados as plataformas suportadas. No momento, por exemplo, são suportadas os seguintes microcontroladores:
- ST STM32F0xx/F1xx/F2xx/F30x/F37x/F4xx/L0xx/L1xx
- Atmel SAM3A/3N/3S/3U/3X
- NXP LPC1311/13/17/42/43
- Stellaris LM3S (descontinuado)
- TI (Tiva) LM4F (continuado como TM4F, compatível com LM4F)
- EFM32 Gecko (suporte somente do núcleo)
- Freescale Vybrid VF6xx
Perceba que há suporte a LM4F da Texas Instruments. Assim, vamos gerar um exemplo de pisca-led para rodar na Launchpad.
Primeiro, necessitamos das ferramentas de build. Para instalá-las no Fedora (>23), use o dnf:
1 |
$ sudo dnf install arm-none-eabi-gcc-cs arm-none-eabi-binutils-cs arm-none-eabi-newlib openocd |
Em seguida, clonaremos o repositório de exemplos:
1 |
$ git clone https://github.com/libopencm3/libopencm3-examples.git |
A libopencm3 é instalada como um submódulo dos repositório de exemplos:
1 2 3 4 5 |
$ cd libopencm3-examples $ git submodule init $ git submodule update |
Para compilar os exemplos, basta rodar o make na raíz do projeto:
1 |
$ make |
Para gravar o binário no dispositivo, acesse o diretório do exemplo desejado, e rode o make flash:
1 2 3 |
$ cd examples/tiva/lm4f/stellaris-ek-lm4f120xl/miniblink $ make flash |
Nesse momento, deve-se observar que o led D1 pisca e troca de cor. Ao pressionar o botão SW2, o divisor do PLL é alterado, alterando a frequência de clock e, consequentemente, a frequência em que o led pisca. Ao pressionar o botão SW1, o PLL é ignorado e o clock do processador é setado na mesma frequência do cristal da placa (16MHz).
Conclusão
Para quem trabalha no desenvolvimento de firmware, este é um projeto a se considerar. Alguns projetos já o utilizam, inclusive comercialmente, o que demonstra que a maturidade do projeto vem aumentando.