sexta-feira, 30 de outubro de 2015

Começando pela placa STM32F0Discovery

A STMicroeletronics possui uma série de microcontroladores baseados nos processadores ARM Cortex. Possui também disponível algumas placas de desenvolvimento de fácil utilização. Comecemos com a placa STM32F0Discovery baseada no microcontrolador STM32F051R8T6 possuindo 64 KB de memória Flash e 8 KB de memória RAM .
STM32F0discovery
Como recursos, ela possui um botão de RESET, dois LEDs e um botão para uso do usuário, interface ST-LINK/V2 para debug e programação do microcontrolador alem de dezenas de pinos de entrada e saída do microcontrolador diretamente acessíveis por terminais externos da placa. O manual de usuário da placa STM32F0Discovery está disponível aqui. Caso o link não retorne o manual, basta procurar pelo documento UM1525 da STMicroelectronics.

Ao conectar a placa via cabo USB ao computador, a mesma será reconhecida automaticamente pelo WINDOWS, como mostrado na figura abaixo.

Placa STM32F0Discovery conectada

O microcontrolador é acessível pela interface ST-LINK/V2 através dessa conexão USB. Para programar, depurar ou mesmo visualizar registradores e áreas de memória do microcontrolador, é necessário o software STM32 ST-LINK utility. Ele pode ser encontrado aqui ou, caso seja necessário, procure por STSW-LINK004. Só há as versão para MS-WINDOWS. Sua instalação é simples e ele pode ser visto na figura seguinte.

Utilitário STM32 ST-LINK
Ao se clicar no botão , o utilitário se comunica com o microcontrolador e traz suas informações além da imagem do conteúdo da memória flash.

Conectado ao microcontrolador
Podemos ver que o microcontrolador é da família STM32F0 (ARM Cortex M0) e possui 64 KBytes de memória flash.
Algumas informações do microcontrolador
A interface ST-LINK/V2 embarcada na placa suporta apenas comunicação bidirecional a dois fios SWD (Serial Wire Debug) para microcontroladores da família STM32. A frequência é de 1,8 MHz e isso pode ser comprovado nas informações de configuração padrão do utilitário STM32 ST-LINK mostradas abaixo:


Alguns recursos e estados do microcontrolador alem da memória flash podem ser observados na tela MCU Core onde temos registradores e estado do microcontrolador. Esse painel possui ainda botões de comandos que usaremos mais adiante.


Finalmente, vamos às documentações obrigatórias para se trabalhar com esse microcontrolador. O manual de usuário da placa já mostrado acima é o primeiro documento útil. Nele temos a disposição dos pinos, LEDs, botões, jumpers e suas funções. 
O próximo manual indicado é o datasheet desse microcontrolador que pode ser encontrado aqui. Da mesma forma, caso não esteja disponível, procurar por DM00039193. Junto com esse, o manual de referência desse microcontrolador é de uso obrigatório e pode ser encontrado aqui ou procurando por RM0091.
Primeira informação relevante que obtemos é o mapeamento de memória como visto na figura abaixo:
Mapeamento de memória do microcontrolador STM32F05xx 
Nota-se que a memória flash, que é a disponível para o programa residir, está mapeada na faixa de endereços 0x08000000 a 0x0800ffff no caso desse microcontrolador que possui 64 KBytes de memória flash. Também nota-se que a memória RAM está mapeada na faixa de 0x20000000 a 0x20001fff para esse microcontrolador (4 KBytes de RAM).
O espaço inicial de memória (0x0000000) possui um mapeamento dependente da configuração de boot. Algumas implementações do processador AMR Cortex M0 possuem um pequeno programa chamado boot-loader. Esse programa é preparado com a fabricação do microcontrolador e possui algumas funções dentre as quais a possibilidade de remapeamento de memória. No caso da placa STM32F0Discovery o pino BOOT0 vem de fábrica com valor zero o que, segundo o manual de referência no capítulo 2.5, a memória flash é remapeada como área de boot. Dessa forma, a memória flash é vista pelo microcontrolador tanto no endereço 0x08000000 original como no endereço 0x00000000. Isto pode ser comprovado pela figura abaixo onde observa-se o conteúdo do endereço 0x00000000 idêntico ao mostrado anteriormente no endereço 0x08000000.


Como curiosidade, segundo o documento AN2606 do fabricante, a versão do boot loader para esse microcontrolador está presente na posição de memória 0x1ffff7a6 e tem o valor 0x21 que representa versão 1 e com uso de 2 interfaces USART para a carga de programa.



REFERÊNCIAS:
"The Definitive Guide to the ARM Cortex-M0",Joseph Yiu
UM1525 - "User manual STM32F0DISCOVERY Discovery kit for STM32 F0 microcontrollers"
http://www.arm.com/products/system-ip/debug-trace/coresight-soc-components/serial-wire-debug.php
STM32F051xx microcontrollers datasheet
AN2606-Application note-"STM32 microcontroller system memory boot mode"

quarta-feira, 28 de outubro de 2015

Preparando-se para programar os microcontroladores ARM Cortex M0 e M4

Programar um processador ARM Cortex M0 ou M4 é, aparentemente, uma tarefa complicada. Muitos detalhes são necessários mas, o ideal, é começar da forma mais simples. A figura abaixo mostra um fluxo básico de desenvolvimento de aplicações para o processador ARM Cortex M0 o qual é o mesmo para o modelo M4.
Fluxo básico de desenvolvimento
Programa-se, idealmente, através de código C, C++ ou Assembly. Uma vez compilado, o código gerado dever ser preparado para a carga no processador através de um linker. Esse último processo toma as saídas dos compiladores mais arquivos de configuração, que veremos adiante, e gera o arquivo final de carga ou executável o qual possui formatos diferentes conforme o uso: simulação, carga da memória flash ou depuração.
Para iniciarmos o entendimento desse fluxo ao mesmo tempo que entendemos o funcionamento dos processadores ARM Cortex M0 e M4, precisamos de algumas ferramentas ou, no jargão da área: um toolchain. Muitas das ferramentas de desenvolvimento ARM Cortex são proprietárias o que dificulta o seu uso para aplicações não comerciais. Existe porém, um conjunto de ferramentas abertas desenvolvida para processadores ARM que é totalmente compatível com eles e plenamente utilizável.
O site GCC ARM Embedded (https://launchpad.net/gcc-arm-embedded) possui o conjunto completo de compiladores e ferramental necessário para compilar e gerar aplicações para carga, simulação e depuração desses processadores. Como a maioria dos fornecedores de microcontroladores que utilizam esses processadores possuem suas ferramentas baseadas em MS-Windows, utilizaremos o toolchain para esse SO.

Baixemos a versão executável para win32 conforme a figura acima e, após sua conclusão, instalemo-la.  


Siga os passos de instalação e, ao final, não esqueça de ligar a opção "Add path to environment variable" conforme indicado abaixo.


Feche as janelas e abra uma nova janela de linha de comando e execute o comando arm-none-eabi-gcc -v. Se tudo correu bem, a resposta deve ser semelhante à mostrada abaixo:


Uma pausa aqui. O último comando retornou uma informação importante: Target: arm-none-eabi .

O compilador GCC pode gerar executáveis para diversas arquiteturas como: x86, ARM v4/v5/v6/v7 entre outras. Em computadores pessoais, GNU GCC é um compilador voltado para aplicações escritas para LINUX X86 para PC. Quando desenvolvemos em uma plataforma como por exemplo MS-Windows para uma plataforma destino distinta como, por exemplo, ARM Cortex, temos um ferramental denominado cross compiler. Devido à diversidade de arquiteturas diferentes toolchains existem. A convenção para a denominação desses ferramentais é a seguinte:

arch [-vendor] [-os] - eabi

  • arch: corresponde à arquitetura destino (no caso aqui: ARM)
  • vendor: corresponde ao fornecedor do ferramental
  • os: refere-se ao sistema operacional destino
  • eabi: significa Embedded Application Binary Interface ou Interface Binária de Aplicações Embarcadas

Dessa forma, estamos trabalhando com um toolchain de arquitetura destino ARM, sem fornecedor e sem sistema operacional e para aplicações binárias embarcadas: arm-none-eabi.

Finalmente, por estarmos em ambiente de desenvolvimento em MS-Windows, precisamos de algumas ferramentas auxiliares nativas do ambiente Linux. Uma publicação dessas ferramentas suficiente para o que precisamos é a Minimalist GNU for Windows cujo download está em http://sourceforge.net/projects/mingw/files/ . Baixemos o instalador e procedamos à instalação.
Certifique-se de selecionar as opções mingw-development-kit e msys-base na tela do MinGW Intallation Manager. 



 Selecione Apply changes na no menu Intallation.


E novamente Apply.


Ao final da instalação, feche as janelas e abra uma nova janela de linha de comando. Direcione ao diretório de executáveis do MinGW através do comando: cd C:\MinGW\msys\1.0\bin.
Execute os comandos: make -v e dd --version. Uma resposta semelhante à abaixo deve aparecer:


Por último, acrescente o diretório C:\MinGW\msys\1.0\bin à variável PATH do Windows.

REFERÊNCIAS:
"The Definitive Guide to the ARM Cortex-M0",Joseph Yiu
https://launchpad.net/gcc-arm-embedded
https://en.wikipedia.org/wiki/Application_binary_interface
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.swdev.abi/index.html
http://www.mingw.org/

sexta-feira, 23 de outubro de 2015

Microcontroladores ARM Cortex M0 e M4

Uma família de microcontroladores muito difundida no mercado possui processadores ARM-CORTEX de 32 bits. São processadores de baixo consumo e alta performance. Com resposta rápida a interrupções, são ideais para equipar microcontroladores. Possuem um reduzido conjunto de instruções (da ordem de 60 para o processador CORTEX-M0), permitindo economia de memória de programa, desejável para aplicações embarcadas. Esses processadores são licenciados para fabricantes que incorporam periféricos e produzem microcontroladores para diversos fins 

Licenciamento do processador ARM Cortex para um microcontrolador
Os processadores da família ARM possuem dois tipos de arquitetura de barramento: Von Neumann e Harvard. Na primeira, dados e código residem na memória acessada pelo mesmo barramento permitindo alteração do código pelo próprio código. É o caso da arquitetura usada no processador ARM CORTEX M0 mostrada abaixo. Nota-se que o mesmo barramento AHB dá acesso a toda a memória.
Arquitetura básica do processador ARM Cortex M0
Já para os processadores ARM CORTEX M3 e M4, a arquitetura de barramento é Harvard possuindo um barramento AHB para acesso da memória ROM, onde reside o código, e outro barramento AHB para acesso à memória RAM usada para dados.

Arquitetura básica do processador ARM Cortex M4
Para facilitar o desenvolvimento de aplicações entre diversos fornecedores de microcontroladores com o processador ARM Cortex, utiliza-se a camada de desenvolvimento CMSIS (Cortex Microcontroller Software Interface Standard) conforme a figura abaixo.  Isso permite o rápido porte de um microcontrolador para outro,
Abstração do hardware pela camada CMSIS
Essa camada é, na verdade, uma abstração das áreas que dão acesso aos periféricos, registradores de controle, memória e vetores de interrupção facilitando o trabalho de programação ao mesmo tempo que permite conhecer o funcionamento do microcontrolador.

Programando em C, normalmente é necessário apenas a inclusão de um header disponibilizado pelo fornecedor do microcontrolador para o modelo específico usado. Também é necessário incluir o código de inicialização compatível com o CMSIS.

Veremos nos próximos posts exemplos de uso e acesso aos diversos periféricos de um microcontrolador ARM CORTEX.

REFERÊNCIAS:
"The Definitive Guide to the ARM Cortex-M0",Joseph Yiu
http://www.arm.com/products/processors/cortex-m/cortex-m-system-design-kit.php
http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php