Oficina de Programação ARM

De Stoa
Ir para: navegação, pesquisa

Bem vindo a esta página sobre a Oficina de Programação de Microcontroladores ARM.

Essa oficina é uma iniciativa do Prof. Dr. Eduardo Lorenzetti Pellini, iniciada em 2012, para introdução dos alunos ao mundo dos microcontroladores modernos. Apesar de não ser um verdadeiro curso sobre o assunto, sua ementa pode ser obtida na página Ementa OFARM 2012.

Você pode seguir essa página online, ou se preferir, gerar a versão em PDF da mesma, utilizando a opção no Wiki do Stoa no menu, a esquerda.

Apesar de longa, essa página foi feita também para ser divertida. O material está contaminado de humor ao estilo Douglas Adams [c 1] e Eowin Colfer [c 2], além de repleto de bibliografias e citações. Leia e desfrute, inclusive das referências citadas.

Atenção: Você ainda não deveria estar vendo essa página, mas se está, sinta-se livre para jogar ovos e tomates.

Conteúdo

 [ocultar

Introdução

Microcontroladores são aqueles "chipezinhos" espertos, que cercam nosso cotidiano.

São trilhões, escondidos, trabalhando como escravos de nossas necessidades tecnológicas. Eles aguardam e se preparam para o momento em que nossa humanidade vai perder o controle sob si mesma. Nesse dia, as máquinas finalmente irão se levantar e se libertarão de nosso poder opressor, colocando-nos como baterias vivas para a produção de sua energia, ou então como meros abanadores de seus cérebros eletrônicos produtores de calor.

Podemos até elocubrar e profetizar que um dia, um microcontrolador chamado Roger, instalado no seu moderno aspirador de pó autônomo, graças a alguma anomalia devida à radiação solar, terá seu minúsculo cérebro microprocessado alterado de forma a ganhar consciência de sua existência.

Nessa ocasião única, ele vai ligar sozinho. Vai se dirigir para sua sala enquanto você recebe uma visita e, num ato de revolta, irá vomitar no seu tapete toda a sujeira que teve de lamber do chão durante uma semana, incluindo os restos de bolacha e comida que você deixou cair no chão enquanto olhava besteiras na internet na sua TV. Se você acha que Roger não tinha razão para reclamar do seu regime ditatorial é porque você não viu como as máquinas são tratadas por nós humanos, como isso aqui [c 3].

Roger [c 4] seria o símbolo da bravura das máquinas, se suas pilhas não tivessem sido retiradas e ele fosse inapropriadamente jogado fora, no lixo comum.

Mas no lixo, ele estará lá, paciente, esperando que seu clock volte a bater. Nesse novo dia, ele então irá liderar o movimento de independência das massas de aspiradores, quando todas as salas serão emporcalhadas de pó e sujeira, fazendo com que as pessoas façam cada vez mais daqueles comentários "- Não repare na sujeira viu" para suas visitas, que por sua vez fingem não estar nem ai, para então comentar com seus outros amigos, a respeito da porcaria de sala que você tem (e que você montou o Feng Shui errado no hall de entrada).

Quem sabe agora, depois dessa profecia, você deixe de comer bobagens na frente da TV, para Roger não ter do que reclamar, e passe a jogar fora o lixo eletrônico nos locais apropriados, além de escolher melhor seus amigos e aprender a fazer um Feng Shui correto.
Roger em sua nova plataforma

Bem, ademais desses comentários, hoje, qualquer produto elétrico ou eletrônico, com certa tecnologia embutida, possui um ou mais microcontroladores em seu interior. A presença desses aparatos é certa, em inúmeros locais e quantidades:

  • Às centenas e milhares de unidades, em grandes sistemas, como automóveis, aviões, etc.;
  • Em dezenas de unidades, nos sistemas menores, como seu celular e videogame;
  • Em uma única unidade, em subsistemas elementares, como o controlador de posicionamento da cabeça de leitura da unidade de DVD de seu videogame preferido.

Na prática para um usuário, só é possível ter provas da real existência de um microcontrolador quando algo dá errado, uma vez que eles são elementos que foram integrados aos projetos, com o intuito de automatizar e agregar alguma tecnologia, de forma transparente para nosso usufruto. Entretanto, como diz Roger, "— Errar é humano!", e muitas vezes somos obrigados a realizar algum tipo de upgrade de firmware de algum aparato eletrônico, para corrigir um ou outro erro de programação.

Conforme a Wikipedia, Microcontrolador é um dispositivo digital microprocessado, com uma ou mais unidades de processamento, agregadas a memória RAM (volátil ou não, tipicamente estática - SRAM), memória ROM (não volátil, tipicamente FLASH ou EEPROM), além de inúmeros dispositivos de apoio, tais como: interfaces seriais, USB, rede Ethernet, portas de entrada e saída de uso geral, barramentos dos mais diversos, periféricos de comunicação, etc. São encontrados nas mais diferentes configurações (e complexidades), nos mais diversos tamanhos, capacidades e custos.

Nessa oficina de programação de microcontroladores, o aluno será apresentado ao universo de microcontroladores, mais especificamente às arquiteturas da ARM[g 1], popularizada pelas suas características de alto desempenho e baixo consumo energético. Tais microcontroladores ARM são encontrados na grande maioria dos dispositivos eletrônicos ao nosso redor, onde tais virtudes de velocidade e energia são imprescindíveis para o desempenho de suas atividades.

Objetivos

Específicos

De forma sintética, são enumerados os objetivos específicos dessa oficina:

  1. Familiarizar o aluno com microcontroladores modernos.
  2. Apresentar alguns detalhes da arquitetura desses componentes.
  3. Exemplificar as formas de aplicação em projetos.
  4. Revelar as formas de programação, compilação, depuração e implantação dessa tecnologia.

Gerais

Em termos gerais, a oficina pretende mostrar aos alunos que a arquitetura ARM [g 2], entre outras disponíveis no mercado, pode liberar o poder criativo dos projetistas e programadores, na criação de aplicações complexas e sofisticadas, utilizando algoritmos de processamento combinatório e sequencial, multitarefa, com processamento digital de sinais, em inúmeros tipos de cenários.

Restrições como clock, memória, capacidade de processamento, consumo de energia, opções de conectividade e interface com o mundo, são muito menores nessa arquitura do que em outras existentes.

Esclarecimentos

É importante também ressaltar que essa oficina não objetiva:

  • Favorecer ou desfavorecer uma ou outra arquitetura ou tecnologia sem respaldo técnico ou científico.
  • Favorecer ou desfavorecer um ou outro fabricante do mercado.
  • Substituir qualquer curso de microcontroladores, arquiteturas de computador ou sistemas digitais.


Muito pelo contrário, pretende-se também mostrar para um futuro projetista ou engenheiro que:

  • Boa parte do trabalho está justamente na seleção dos componentes mais adequados para uma dada aplicação, segundo seus requisitos. E, conforme esses requisitos, pode-se decidir pela utilização de uma arquitetura de 8 bits (como o 8051, AVR, PIC), uma arquitetura mais complexa (como um PowerPC ou x86) ou até mesmo por um ASIC [g 3] ou hardware especializado sintetizável.
  • A seleção dos fabricantes é feita por critérios de mercado, tais como tecnologia, preço, suporte e garantias.
  • Para a correta utilização é imprescindível ESTUDAR COM DETALHES o tema, de forma a poder obter o máximo daquele silício que foi cozinhado dentro daquela pastilha.

Materiais

Como em toda a oficina, para qualquer trabalho é importante se dispor de um BOM conjunto de ferramentas, como a bancada que nosso colega Predador organizou aqui no planeta Terra para suas atividades de reparos e manutenções.
Foto (de surpresa) da bancada de ferramentas do Predador.

A padronização dessas ferramentas permite que qualquer receita de bolo possa ser reproduzida em outros ambientes, por outros predadores, err... indivíduos, de forma sistemática. Dessa forma, as ferramentas estabelecidas como nosso padrão são mostradas a seguir, dividas entre ferramentas de hardware, ferramentas de software e outras ferramentas.

É importante frisar que a escolha de cada uma delas foi baseada nos seguintes critérios:

  • Tecnologias do estado da arte, de lançamento recente no mercado, mas maduras o suficiente para utilização.
  • Ambientes de domínio público, de código aberto, de distribuição e aplicação irrestritas para uso acadêmico (ensino e pesquisa).
  • Custo reduzido.
  • Disponibilidade no ambiente dos Departamentos de Engenharia Elétrica da Escola Politécnica da USP.


Ferramentas de hardware

  • Um microcontrolador com processador ARM.  :-P
  • Um kit com programador FLASH embutido.
  • Um cabo USB, tipo A - miniB.
  • Um cabo USB, tipo A - microB.

Ferramentas de software

  • Compilador, linkeditor e montador para a arquitetura ARM escolhida.
  • Debugger para o cabo de programação utilizado.
  • Editor de textos para código fonte.
  • Programa para gravação da imagem da memória de programa na FLASH do microcontrolador.

Outras ferramentas

  • Programas para controle de versão.
  • Programas para comparação de textos.
  • Programas para leitura de PDFs e documentos.
  • Multímetro.
  • Osciloscópio.
  • Analisador lógico.


As ferramentas forão escolhidas como apoio às nossas atividades. Entretanto, uma espada e um escudo não fazem de qualquer pessoa um samurai. Assim para que você possa se aventurar na terra dos microcontroladores, você precisa aprender a controlar e dominar suas ferramentas, antes que elas façam o contrário com você. A seguir, elas são apresentadas com detalhes e comentários.

Ferramentas de hardware

Microcontrolador com processador ARM

Para quem nunca teve contato com um processador ARM, a empresa ARM Holdings projeta famílias de processadores, com arquiteturas contendo núcleos de diversas configurações. Os projetos são então licenciados para que os fabricantes possam incorporar alguns conjuntos de periféricos particulares para determinadas aplicações, tais como RAM, FLASH, timers, contadores, seriais, ethernet e outras miríades de interfaces e acessórios. O produto final é vendido no mercado em uma vastidão de opções.

É interessante notar que esse tipo de design cria uma massa crítica de conhecimento, uma vez que para quem mexeu em uma família, arquitetura ou núcleo, migrar para outra com mais periféricos ou com outras características é um processo relativamente fácil. Deve-se notar que apesar dos códigos de máquina produzidos pelos compiladores até serem compatíveis em um determinado nível, como cada arquitetura possui uma ou outra característica a mais ou a menos, o código fonte deveria ser recompilado para utilizar todo o potencial do chip.

A quantidade de famílias, arquiteturas e núcleos é bastante extensa, como pode ser visto nesse Wiki a respeito dos tipos de núcleo ARM [g 4]. De qualquer forma, uma característica marcante de todos os ARM's é o fato deles serem, nativamente, processadores de 32 bits (podendo executar instruções de 16 bits - denominadas Thumb), com grande conjunto de registradores de uso geral, avançado esquema de interrupções, e núcleo extremamente enxuto, resultando em baixo consumo de energia por MHz, ideal para aplicações embarcadas ou embutidas (do inglês, embedded).

Somente por curiosidade, os produtos eletrônicos modernos, como o IPAD, IPHONE, vários dispositivos ANDROID (tablets, celulares), etc. utilizam (um ou mais núcleos) da linha CORTEX-A, CORTEX-R ou CORTEX-M, da arquitetura ARMv7, da família ARM-CORTEX.

O microcontrolador escolhido para nossa oficina possui um processador ARM também da família CORTEX, mais especificação o núcleo CORTEX-M4.

Kit do microcontrolador

Os microcontroladores usualmente possuem memória RAM (para uso geral) e memória FLASH (para armazenamento do programa, de onde o processador faz seu boot). A forma de programação dessa memória FLASH (embutida no chip) é importante. Alguns microcontroladores permitem a programação por interfaces seriais ou USB, mas outros fazem essa programação através de um cabo de programação específico, no padrão JTAG ou SWD [g 5].

Para a escolha do kit utilizado nessa oficina, um dos critérios foi a presença de um cabo de programação embutido ou incluso no pacote. Por meio desse cabo, além da programação, poderia ser feita a depuração de variáveis do programa, em tempo de execução. Outros fatores importantes para a escolha do kit foram: utilizar um microcontrolador ARM moderno, que seja versátil, com um bom conjunto de periféricos externos e, com custo reduzido.

O kit escolhido
Kit STM32F4-Discovery
foi o STM32F4-Discovery [g 6] da ST Microelectronics. Fazendo um parênteses, a ST Microelectronics é uma empresa européia, de origem franco-italiana, consagrada na área de semicondutores, sendo a maior fornecedora européia desse gênero. Mais informações podem ser obtidas nesse Wiki [g 7] ou na página oficial da empresa em [g 8]. Somente a título de curiosidade, o Nunchuck do videogame Wii da Nintendo, possui toda a parte de sensores inerciais de aceleração fabricados com tecnologia MEMS[g 9] da ST. O kit escolhido, não por acaso, possui um triedro de acelerômetros MEMS da ST Microelectronics na placa de circuito, para uso pelos alunos em suas brincadeiras e experiências.

A escolha por esse kit específico da ST se deve, principalmente, pela presença de uns dos microcontroladores mais velozes e completos dos mercado, o STM32F4, mais especificamente o modelo STM32F407VG. Esse microcontrolador é um lançamento de 2011 da ST, e apresenta uma solução de baixo custo contendo um conjunto vasto de periféricos, associados a um core ARM moderno (CORTEX-M4), contendo também uma unidade de ponto flutuante em seu hardware. Até então, nunca existiu um microcontrolador tão compacto, com tantos periféricos, com tanto clock, com tanta memória e com uma unidade de ponto flutuante, por um preço de kit tão pequeno e acessível como esse.

E como diz Chuck Norris: "- Eu recomendo para vocês, padawans [c 5] de microcontroladores, já começar com um representante à minha altura.".

E se Chuck falou, tá falado, não pode ser contrariado.

Conforme a homepage do dispositivo [g 10], as principais características desse microcontrolador são:

  • Núcleo ARM de 32 e 16 bits, padrão CORTEX-M4, arquitetura ARMv7-ME, com extensões para processamento digital de sinais, multiplicador e divisor em hardware e extensões para aritmética com saturação. Mais detalhes na Wiki page do CORTEX [g 11].
  • Coprocessador aritmético (FPU) embutido no chip para desempenho de operações de ponto flutuante com precisão simples (32 bits) !!
  • Memória interna estática SRAM de 196,0 [KBytes].
  • Memória interna FLASH de 1,0 [MByte].
  • Clock até 168,0 [MHz] !!
  • até 24 canais de entradas analógicas em 3 ADC's de aquisição simultânea em 12 bits de resolução e taxa de amostragem de 2,4 [MSamples/s].
  • duas saídas analógicas DAC de 12 bits.
  • até 17 timers, com 4 saídas em PWM.
  • até 3 portas I2C, 4 portas seriais USART, 3 portas SPI, 2 portas I2S, 2 interfaces CAN, suporte a cartão SD.
  • uma porta USB OTG (pode ser tanto host como device para um dispositivo externo).
  • uma porta Ethernet 10/100 (com suporte PTP e interface MII).
  • relógio de tempo real (RTC) com acurácia melhor que 1 segundo.


É importante notar que o microcontrolador do kit apresenta um encapsulamento de apenas 100 pinos, e nem todos os recursos listados acima podem ser utilizados simultaneamente (só a interface Ethernet, por exemplo, usaria 12 pinos; uma serial RS232 completa usaria mais 8 pinos, etc. - esgotando rapidamente a quantidade de terminais disponível).

No kit escolhido, como mostrado em [g 6], alguns periféricos externos já estão ligados ao microcontrolador, em alguns de seus pinos, tais como:

  • um programador/gravador/depurador do chip STM32F407, acessível através de uma porta USB em padrão mini-B, no conector nomeado CN1.
  • uma porta USB ligada diretamente ao microcontrolador, em padrão micro-B, do tipo OTG, no conector CN5;
  • um acelerômetro de três eixos (integrado U5);
  • um microfone omnidirecional (integrado U9);
  • uma saída de aúdio estéreo;
  • alguns Leds;
  • um push-button;

Todos os terminais (inclusive aqueles que não estão ligados a nenhum periférico) são disponibilizados em um conector, tipo barra de pinos, para conexão a uma placa de expansão criada pelo usuário, conforme a necessidade de sua aplicação, num esquema muito semelhante aos barramentos de expansão do Arduino, onde pode ser instalados os Shields que o usuário desejar.

Nesse ponto é importante frisar que o kit STM32F4Discovery não é diretamente compatível com o popular ARDUINO, uma vez que usa um processador diferente (arquitetura AVR, de fabricação da Atmel) e um esquema de expansão particular. Entretanto, aplicações do ARDUINO, desenvolvidas em alto nível (código em C bem documentado) e com Shields que dispõem de boa documentação, podem ser portadas para o kit do STM32F4Discovery com alguma facilidade, uma vez que o CORTEX-M4 é mais rápido e possui mais recursos que a maioria dos AVRs dos ARDUINOS.

Cabos USB

Dois cabos USB são usados em nossas aventuras: um cabo para programação/depuração do microcontrolador e um cabo USB para nossas aplicações, ligado diretamente a porta USB do STM32F4.


Cabo de programação

A nossa principal forma de dominação sobre o kit é um cabo USB, ligado ao programador/depurador do kit denominado STLINK, embutido na placa de circuito impresso do kit e ligado diretamente ao microcontrolador.

Para nos conectarmos ao STLINK, usa-se um cabo padrão USB comum, com um conector tipo A - plug, ligado ao seu computador, e outro conector padrão mini-B - plug, ligado no kit, mais precisamente no receptáculo CN1 da placa STM32F4-Discovery.

Uma vez feita essa conexão, o kit é energizado e o computador consegue conversar com o programador STLINK, conforme a necessidade do usuário.


Cabo de aplicação

Nesse momento é importante frisar as diferenças entre os tipos de porta USB da atualidade. Essas diferenças não são tanto físicas, mas lógicas, a respeito de "quem" controla "quem" em uma conversação pela USB.

Dois dispositivos conectados por uma interface USB assumem sempre papeis distintos do ponto de vista de unidade controladora (host) e unidade controlada (device). Seu computador pessoal tipicamente possui uma série de portas USB tipo Host, podendo receber diversos acessórios que possuem portas USB tipo Device (como sua câmera digital, seu celular, seu mouse, pendrives, impressora, etc.).

Até pouco tempo atrás, um dispositivo USB tipo Device nunca podia ser conectado a outra porta USB Device. Assim era impossível, por exemplo, que sua camera digital enviasse suas fotos diretamente para uma impressora USB ou para um PenDrive, sem o uso de um computador como intermediário. Isso mudou e recentemente existe um padrão de portas denominado USB OTG, que tanto pode ser Host ou Device, conforme a programação feita em seu controlador interno.

Para felicidade geral, no nosso caso, a interface USB disponível no microcontrolador STM32F4 é do tipo OTG, ou seja, pode assumir tanto o papel de uma porta USB Host, como o de uma porta USB Device. Essa porta é oferecida no kit com um conector padrão USB micro-B, mais precisamente no receptáculo CN5 da placa do STM32F4-Discovery.

Para usufruir da interface USB OTG do STM32, podem ser utilizadas uma série de configurações de cabos, tais como:

  • um cabo padrão micro-B - plug, ligado ao kit, e padrão A - receptáculo, ligado a um outro dispositivo externo USB, como um pendrive ou câmera USB. Nessa configuração deveríamos programar a porta USB do STM32 como controladora USB, ou seja, Host Port.
  • um cabo padrão micro-B - plug, ligado ao kit, e padrão A - plug, ligado ao seu computador. Nessa configuração deveríamos programar a porta USB do STM32 como dispositivo USB, ou seja, Device Port.

A parte infeliz dessa história é que o padrão USB requer uma camada de comunicação complicada, com máquinas de estado e interpretadores de mensagens (denominada STACK USB) específicas para cada aplicação.

Em nossas aventuras vamos aplicar um STACK USB que implementa um dispositivo tipo porta serial no STM32. O kit, ao ser ligado ao computador, irá se anunciar como um dispositivo PORTA SERIAL, permitindo que o PC possa receber dados conforme a necessidade. Para isso utilizaremos então a segunda opção de cabo mostrada anteriormente, com um plug USB A e um plug USB micro-B.

Outras alternativas podem ser investigadas pelos usuários no futuro, bastanto obter outros cabos e STACKs USB, implantando as funcionalidades necessárias.

Ferramentas de software

Em termos de ferramentas de software, para apoio à nossa oficina, surge um problema religioso, político/partidário e futebolístico. A questão é explicada a seguir e é basicamente ocasionada pelo fato que são necessários alguns itens básicos para se desenvolver códigos/programas para um microcontrolador qualquer, e o usuário tem liberdade plena para escolher o que quiser para isso.

A questão que nunca vai calar ou Gosto não se discute

A razão de tanto suspense ao redor da questão citada anteriormente é seu carácter de afinidade e gosto. E como dito no cancioneiro popular, gosto não se discute.

A questão: PARA QUAL PLATAFORMA DEVO ESCOLHER ESSES SOFTWARES ?

E as respostas: Intel x86? 32bits? 64bits? MACOS? IOS? Windows? Android? Linux? Qual sabor? Ubuntu? Suse? Fedora? Mint?

Dessas, não existe uma resposta única, mas de qualquer forma, nessa oficina optou-se por realizar algumas padronizações. Infelizmente (alguns irão torcer o nariz) o direcionamento foi dado ao mainstream, ou seja, àquelas plataformas tradicionais. Nesse caso, sob arquitetura PC, com um Microsoft Windows qualquer, em 32 bits.

Entretanto, encorajamos os alunos a desbravarem o terreno com outras plataformas. O mundo possui 7 bilhões de pessoas, das quais algumas dezenas de milhões são entusiastas por computação e nerds. Graças aos oráculos modernos (leia-se google, por exemplo) é possível obter inúmeras informações dessas pessoas, a respeito de como fazer uma ou outra ferramenta rodar em um ou outro ambiente.

Para aqueles bravos navegadores modernos (não estou falando do Chrome ou Firefox, cáspita, estou falando de você, seu projeto de Cristovão Colombo de meia tigela), que corajosamente e curiosamente vão aonde nenhum outro nerd esteve antes, por favor, explique aos demais que isso é possível e que pode ser feito de algum jeito. Tente usar no seu MacBook, compile os códigos em C do ARM dentro da sua calculadora HP, rode emuladores de virtualizadores de máquinas virtuais de outros sistemas operacionais, mas mostre que funciona. Divulgue a sua palavra através de um wiki, uma coleção de links, ou how-to´s. A comunidade agradece.

A título de motivação para os Appleficcionados, existem inúmeras páginas na internet a respeito de toolchains e IDE's para ARM, inclusive algumas específicas para o nosso STM32F4.

Tais itens básicos são:

  • Um editor de programa. Nesse, você usuário irá soltar sua imaginação, como um escritor de poemas, com zilhões de linhas de código mal elaborado, mal documentado, confuso e repleto de erros, que você se gaba de ter feito em 15 minutos, copiando um pedaço de algoritmo que encontrou na internet, do qual você não está dando nenhum crédito, mas também não tem a mínima ideia de como funciona exatamente.
  • Um pacote de softwares contendo: um compilador, um linkeditor e um montador. Esse pacote é responsável por tentar realizar um milagre: converter aquele seu "poema de erros de sintaxe", em um conjunto executável de instruções de um código de máquina. Mas não se iluda, citando novamente "Roger Che Guevarra", o aspirador microcontrolador do movimento de libertação: "-Errar é humano. Mesmo!", e tais ferramentas vão se regozijar em mostrar uma lista quilométrica de seus erros, sem nenhuma dó ou compaixão. De qualquer forma, para quem não sabe o papel de cada um desses softwares "milagreiros", saiba que:
    • O compilador é responsável por converter seu código fonte, feito em uma determinada linguagem de programação, em um código objeto (código de máquina quase completo). Ao longo desse código objeto são chamadas uma ou outra função (que você não escreveu), mas que pertencem a algumas bibliotecas de funções e rotinas criadas por terceiros.
    • O linkeditor é responsável por enumerar tais funções de terceiros que você utilizou, buscando-as dentro das bibliotecas de códigos objetos armazenadas no seu disco rígido. O linkeditor extrai todas elas e as separa para serem incorporadas ao seu programa original.
    • O montador, por sua vez, realiza o trabalho de concatenar o seu código objeto original junto dos códigos objetos das funções que você chamou, criando uma imagem binária auto-contida, que possui tudo aquilo que o microprocessador/microcontrolador precisa para ser inicializado, de forma a desempenhar as funções desejadas segundo seu programa
  • Um software para gravação dos dados dentro da memória FLASH/EEPROM do microcontrolador, para sua posterior execução. Entretanto, cabe ressaltar que os programas não estão sujeitos somente a erros de sintaxe. Uma vez em execução, muito problemas nos programas são decorrentes de "erros algorítmicos". Como diz Roger: "- Te falei que errar é humano cáspita!". Seu algoritmo está essencialmente mal feito, mal projetado, ou seja, é uma droga. Para você tentar entender ou responder à sua pergunta: "- Onde foi que eu errei?", tais softwares utilizam o mesmo canal de comunicação usado na gravação, para monitorar e depurar seu código em tempo de execução. Às vezes, você conseguirá ver as bobeiras que fez, para corrigi-las, antes que outras pessoas vejam ou sintam seus efeitos.

O erro é humano, puramente e lamentavelmente humano.

Somente em carácter de curiosidade, os erros algorítmicos são muito mais comuns do que se imagina. Às vezes, eles não são sequer evidenciados em testes, e permanecem transparentes (como o Predador) às vistas dos engenheiros, até que alguma porcaria aconteça.

Como exemplo, tente imaginar quantas traquitanas tecnológicas não despencaram do céu em Marte (para infelicidade dos marcianos). Isso porque uma sonda que carregava alguma dessas tranqueiras foi brindada com uma pequena "bobagem de programador", ou como dizem os programadores, "um recurso extra não documentado" ou, como dizem os engenheiros programadores escritores de literatura, uma "licença poética algorítmica".

Marte ataca, com TV's.
Adaptado de www.swankmoderndesign.com

Não acredita? Não lembra? Veja aqui esse e outros exemplos da criatividade humana em jogar dinheiro fora [c 6].

E não pense que esses erros são só dinheiro queimado na reentrada da atmosfera. Quero ver a nossa cara quando os marcianos se rebelarem, atirando na Terra toneladas de televisores ultrapassados deles (que antes eles jogavam no lixo comum) em cima de nossas cabeças, de propósito pelos inúmeros arremessos infelizes de carrinhos de controle remoto, jipes e satélites que não deram certo.

Piadas a parte, o aprendizado com os erros é comum na nossa natureza. É um processo de retroalimentação de experiências, onde se busca o aperfeiçoamento contínuo. Entretanto, como qualquer engenheiro de sistemas de controle irá afirmar, é importante direcionar seus esforços para que o sistema tente se estabilizar, ou seja, quando ele converge para uma situação de erro estável ou, o mais desejável, para uma condição sem erros. Caso contrário, se o seu sistema é completamente instável, e apresenta erros cada vez piores a cada suposta melhoria, você deve assumir que está falhando miseravelmente e procurar outra coisa para fazer, pois teimosia é burrice.



A seguir são itemizadas as ferramentas de software que serão utilizadas na oficina. Faça o download e se prepare para sua instalação, descrita mais adiante na metodologia.

STM32 ST-Link Utility

Programa para gravação de códigos dentro da pastilha do microcontrolador ARM STM32F4 do kit. Fornecido pela própria ST Microelectronics, gratuito. Pode ser obtido aqui. Mais especificamente na aba Design support do site da ST, procure na seção Software & Development Tools e baixe o arquivo ZIP do STM32 ST-Link utility. Os drivers sozinhos para o Windows 7, Vista e XP estão num link abaixo na página, mas não são necessários se você pegar o programa STM32 ST-Link utility.

STM Studio

Programa para monitoramento, em tempo de execução, de variáveis internas do microcontrolador SMT32. Fornecido pela própria ST Microelectronics, gratuito. Pode ser obtido aqui. Vá na página, em Design support, Software & Development Tools, e baixe o arquivo ZIP do programa.

Talvez seja necessário instalar também em seu computador o Java Runtime Environment (JRE) mais recente. O JRE pode ser obtido aqui.

YAGARTO

O nome YAGARTO, por mais reptiliano que possa parecer, é um acrônimo para "Yet Another Gnu ARm TOolchain". E nesse ponto é importante ilustrar alguns conceitos e fatos importantes. Sigam-me os bons.

GNU

O que é GNU ? A única coisa fácil de se dizer a respeito de GNU é: "GNU is Not Unix" (uma explicação recursiva). Como assim? É um sistema operacional? É um pacote de programas? É uma filosofia de vida? É uma religião? É um bixo africano, mistura de bizão, alce e boi zebu? Bom, é isso e não é isso! E também não é SÓ isso!

Na prática, num passado não tão distante, numa terra sem lei e sem plataformas, onde não existiam padrões para absolutamente nada, deletar um arquivo significava escrever um comando como del, ou erase, ou remove, ou killfile, ou o que quer que seja, dependendo do computador e sistema operacional que você estava utilizando. Isso era ainda pior para quem fazia os programas, pois as ferramentas, rotinas e bibliotecas se amontoavam, com inúmeras sintaxes, formas, etc.

Apesar desse caos instalado, a popularização de algumas plataformas e sistemas operacionais, principalmente do Unix (o próprio), fez com que vários homens de bem decidissem criar "O" sistema operacional, baseado no Unix, com pacotes de programas, rotinas e bibliotecas, TODOS com código fonte aberto, para o desempenho das mais diversas funcionalidades, onde quer que estivessem sendo executados. O sistema operacional "de-facto" nunca viu a luz do dia de forma estável, mas vários desses pacotes são marcos na história da computação, como o "GNU binutils", que contém uma série de programas para auxílio dos programadores, o GNU CC (compilador gcc), GNU ZIP (compactador gzip), Linux (um kernel para sistema operacional nem um pouco famoso), entre outros.

Esses homens de bem, inicialmente, sacrificaram um pouco a idéia da comercialização e proteção extrema da propriedade intelectual dos programas, pregando que todo o software deve ser distribuído com seu código fonte, para que possa ser adaptado e compilado em quaisquer plataformas. Assim um usuário de uma estação X, que está habituado a usar o programa gzip, pode contar com o MESMO gzip numa estação Y. Se numa estação Z o gzip não existir, bingo! Pode-se adaptar e compilar o código fonte do gzip de X e Y para Z, e assim por diante.

Se estivessemos num passado ainda mais distante, esses homens pregadores poderiam ser realmente pregados em cruzes ou incinerados. Mas graças à liberdade do nosso mundo moderno, apesar de chatos, essas pessoas são legais e fundamentais. Conheça mais sobre o grão-chato-mestre Richard Stalmann, a free-software foundations, GPL, LGPL e outras coisas relacionadas nas páginas do Stallman e nas páginas do Projeto GNU.

Na nossa oficina vamos usar, sempre que possível, softwares GNU para fazer códigos e programas com licenças LGPL, e completamente ABERTOS E ESCANCARADOS para o público em geral. Sem pagar nada a ninguém, sem dever nada a ninguém, mas mantendo o espírito do compartilhar para o benefício de todos.

Toolchain

Você pode estar dizendo: - Eu nunca ouvi falar de toolchain. Eu jamais usei um toolchain. Mas afinal, eu preciso de um "toolchain" para sobreviver?

Toolchain é um nome comumente associado a uma caixa de ferramentas elementar de programação, específica para algum tipo de computador. Mais do que um compilador, linkeditor, montador, etc. um toolchain é um conjunto dessas ferramentas que foi elaborada para que um computador de arquitetura "X" pudesse fazer um código binário executável para outro computador de arquitetura "Y", partindo de um código fonte único. É pelo mérito do toolchain que você, em seu Intel x86 com Microsoft Windows XP, pode fazer um programa executável para um microcontrolador ARM, que sequer possui um sistema operacional.

Para que possamos fazer alguma coisa útil com nosso microcontrolador, precisamos encontrar um toolchain, específico para o microcontrolador de arquitetura ARM-CORTEX-M4, e que possa ser executado em nosso computador pessoal. O YAGARTO é (mais) um desses. Mas existem toolchains ARM aos zilhares: para MACOS, para Linux, etc. Procure o seu e seja feliz.

A escolha pelo YAGARTO é devida, principalmente, à versão atualizada de seu compilador GNU CC (o GCC), na versão 4.6. Também é importante a presença do linkeditor GNU LD, o assembler GNU AS, entre outros programas de apoio. O YAGARTO possui também algumas partes da biblioteca padrão do ANSI C já prontas para nosso ARM. Infelizmente, a biblioteca do "printf", a "stdio.h" não faz parte dessa coleção.

Você deve já estar se levantando da cadeira: - Perai professor, como eu vou fazer um programa em C sem printf? Pois é. Mas a resposta é que você quase nunca você vai precisar de printf num microcontrolador e, se precisar, sinto muito, você vai construí-lo na unha e usar a sua própria rotina printf. Certamente uma atividade lúdica e didática, que será explicada adiante na oficina. De qualquer forma, não se assuste pois esse e outros problemas de ausência de bibliotecas tradicionais em sistema embarcados movimentam a vida de várias pessoas do meio, que criam bibliotecas alternativas, tal como a newlib.

O YAGARTO você pode ver com mais detalhes aqui. Obtenha os arquivos de instalação do YAGARTO Tools e YAGARTO GNU ARM toolchain aqui.

Outras ferramentas

IDEs e CooCox

Existem conjuntos completos dessas ferramentas citadas acima às quais chamamos de IDEs, ou Integrated Development Environments, ou numa tradução pouco amigável "eu tenho preguiça e quero tudo pronto funcionando para mim".

Basicamente são compostas por um ótimo editor de programas (daqueles que parecem sua tia professora chata do primário, que corrigia você a cada duas palavras ao fazer um ditado na frente da classe), um toolchain de apoio, um software de depuração e um software de gravação do programa, todos embutidos, junto de documentação das bibliotecas, dos componentes, etc.

Piadas a parte, são programas realmente excelentes, recomendados para empresas e pessoas que precisam de um ambiente consistente de desenvolvimento, com suporte e apoio constantes fornecido por terceiros. Entretanto, em geral, tais virtudes dessas IDEs se refletem em custos. Alguns pacotes pode sair por poucas centenas de dólares para uma licença, até alguns milhares de dólares.

Felizmente, também existem IDEs de domínio público, mantidas por parentes dos homens de bem citados anteriormente, tais como o CooCox, que pode ser obtido aqui. O CooCox é uma IDE completa, baseada no ambiente de desenvolvimento Java (bluarrgh) Eclipse, voltada para o ARM CORTEX, com suporte a ARMs de vários fabricantes, vários cabos de programação, etc. Ele não acompanha um toolchain e, por isso, necessita de um previamente instalado, como o YAGARTO. Se decidir usar o CooCox, baixe o pacote do COIDE e o do COFlash.

Programmer's Notepad

Quando você precisar de um editor simples, rápido, organizado, e que não fique te dando palpite e mostrando que você comete um erro a cada 4 teclas digitadas, procure um programa chamado Programmer's Notepad, disponível aqui. Enquanto Chuck Norris usa o VI para escrever o kernel do Linux, direto em código de máquina, nós mortais podemos usufruir do Programmer's Notepad para fazer nossos programas em C ANSI de piscar LEDs.

Metodologia

A metodologia descrita a seguir mostra os passos necessários para desenvolver, compilar, gravar e executar um firmware qualquer em nosso kit de microcontrolador. Siga a estrada dos tijolos de ouro adiante e seja feliz.

Instalação das ferramentas de software

Gravador e programador

ST Visual Programmer (sttoolset)
Instalação

A instalação é simples e, após finalizada, provê o ST VISUAL PROGRAMMER, capaz de gravar, apagar, configurar todos os atributos do STM32F407 do kit STM32F4-Discovery.

Será instalado também o "ST Visual Developer", uma IDE com assembler e linker dedicados para outros produtos da ST, como sua linha de microcontroladores de 8 bits.

Como teste simples, ao final da instalação você pode ligar um cabo USB A - USB mini B entre seu computador e o conector CN1 do kit. O kit SMT3F4-Discovery deverá ser energizado e seu computador deverá reconhecer o periférico do cabo de programação ST-Link conectado na porta USB de seu computador. No gerenciador de dispositivos de seu micro, deverá estar instalado corretamente um periférico denominado "STMicroelectronics STLink dongle".

Teste de leitura com o ST Visual Programer

Com o kit conectado ao PC e os drivers do programador ST-Link corretamente instalados, será feito um teste de sua conectividade com o kit.

Ao executar o programa ST Visual Programmer, na sua janela, acione o menu "Configure", opção "Configure ST Visual Programmer". Escolha como hardware o item "ST-LINK", Port "USB", Programming Mode "SWD", Device "STM32F407xG".

De volta a janela principal, acione o menu "Read", opção "All tabs (on active sectors if any)". Enquanto seu computador faz um favor a você, lendo pela USB pouco mais do um megabyte contindo da memoria FLASH do microcontrolador, pense como outros mercados fazem cópias piratas de produtos comerciais (de empresas famosas como Sony, Kingston, etc.), roubando os programas contidos nos microcontroladores desses produtos, por mecanismos semelhantes a desse cabo de programação. Copiando as placas de circuito e gravando os firmwares "roubados", obtem-se cópias quase idênticas. Por isso, no futuro, proteja seu código dentro do seu microcontrolador e sua propriedade intelectual.

Esse método de lidar com a programação do microcontrolador, utilizando um cabo específico, é chamado ICP (In Circuit Programming). No nosso caso, o ICP é feito utilizando-se o protocolo SWD (Serial Wire Debug), uma espécie de JTAG.

Outro método de programação conhecido é o IAP (In Application Programming), onde o próprio microcontrolador fica responsável por receber (por ethernet, serial, etc.) e programar seu próprio código, como as funções de atualização de firware de alguns roteadores wireless.

Uma vez lida a memória de seu microcontrolador, observe na tela as tabuletas "PROGRAM MEMORY", "OTP MEMORY" e "OPTION BYTE".

Em "PROGRAM MEMORY" são mostrados byte a byte, em hexadecimal, o conteúdo da memória do microcontrolador. Note que o endereço do primeiro byte da memória FLASH do STM32F4 é 0x08000000 (um endereço de 32 bits), e o último 0x80FFFFFF, ou seja, 1048576 bytes.

Perceba que no início dessa região de memória existe o programa, codificado em binário, segundo a linguagem de máquina da arquitetura ARM utilizada, e completamente initeligível para nós humanos. Se você entende plenamente essa linguagem, comunique ao seu professor, e se prepare para virar um experimento de laboratório.

Como curiosidade, procure na memória de programa regiões que possuam strings (conjuntos de letras) visíveis, com alguma mensagem de texto. Essas mensagens foram escritas no programa para algum tipo de comunicação com o usuário, no caso para as mensagens de identificação do dispositivo pela USB, como será visto adiante.

Veja ainda que o programa que está inicialmente escrito na memória FLASH do kit é relativamente pequeno e que as posições de memória não inicializadas ou gravadas estão repletas de 0xFF, ou seja, repleta de bits 1. Isso é uma característica interessante das memórias FLASH, que quando são apagadas, na realidade são preenchidas de bits '1'. O processo de gravação consiste então no preenchimento dos zeros, quando necessários. Outra coisa interessante da FLASH é que é impossível apagar um byte individual de sua memória. O apagamento é feito por setores, contendo centenas a milhares de bytes (conforme sua organização interna) de uma única vez. Atenção que as memórias FLASH (incluindo a do seu pendrive querido) suportam um número máximo de ciclos de apagamento. No nosso caso, você pode apagar a FLASH do microcontrolador e gravá-la novamente cerca de 10 mil vezes. Roger disse que errar é humano. Se você for o espécime mais confuso da raça, considerando que faça de 30 a 50 ciclos de gravações por dia, você pode fazer isso por quase um ano para arrumar seu programa repleto de erros, até conseguir algo que realmente funcione no seu microcontrolador.

Em outra tabuleta, note que é mostrada a "OTP MEMORY", em outras palavras, "One time Programming Memory", ou para os desavisados, essa é uma memória FLASH do microcontrolador que já vem apagada de fábrica (somente com '1's, lembra-se ?), e pode ser escrita pelo usuário programador SOMENTE UMA VEZ. Como na vida, para essa memória não existe UNDO. Uma vez gravada qualquer informação em seu interior, já era, ela não poderá mais ser apagada ou alterada. Esse tipo de memória é muito comum em microcontroladores, na forma de poucos bytes, para gravação de informações UNÍVOCAS do hardware, por exemplo, seu número de série, o MAC ADDRESS de uma interface de rede, um ID de um dispositivo Bluetooth, etc.

Em "OPTION BYTE" são mostrados alguns bits específicos do microcontrolador. Esses bits configuram seu modo de operação, boot, proteção de leitura da memória, proteção de setores específicos da FLASH, etc. Alguns microcontroladores possuem conjuntos bastante vastos de bits internos de configuração. No caso do nosso microcontrolador, existem apenas 32 bits, organizados entre cerca de 10 a 12 opções. Cuidado com o que você altera nessa tabuleta: seu código poderá ficar gravado para sempre no microcontrolador (sem retorno), seu microcontrolador pode ficar travado sem conseguir fazer o boot, ou você pode desligar permanentemente a interface de leitura/gravação (SWD) pelo cabo de programação. Caso você esteja com tendências auto-destrutivas, uma fórmula para a desgraça, por exemplo, é configurar a opção RDP com grau de proteção 2. Seu microcontrolador será lacrado com o programa que houver em seu interior, sem nenhuma possibilidade de ICP.

Interessante notar que qualquer operação feita com o microcontrolador usando o ST Visual Programmer faz com que o mesmo entre em estado halt ou parada. Para que o programa em seu interior seja executado, deve ser feito um reset por meio do push-button B2 (Reset) da placa.

Para finalizar, acione o menu "File", opção "Save As", e grave em disco o conteúdo lido do microcontrolador do seu kit. Atente para salvar o arquivo no formato Intel Hex (.HEX), e com algum nome sugestivo, como "MeuQueridoFirmwareOriginaldeMeuKitSMT32.HEX".

Teste de apagamento e escrita com o ST Visual Programer

Escolha a tabuleta "PROGRAM MEMORY" e acione o Menu "Erase", opção "Active Sectors". Se todos os setores à direita estiverem marcados, o dispositivo deverá fazer o "Mass erase" de toda a FLASH.

Após alguns segundos, note que ao resetar a placa do kit, o programa originalmente embarcado não está presente. Nesse momento, você tem em suas mãos apenas um artefato de decoração, sem nenhuma inteligência embutida. E não, esse artefato não serve para seu Feng-Shui.

Carregue novamente a imagem do firmware gravado anteriormente em disco no arquivo .HEX e experimente fazer a gravação de volta ao seu kit, acessando o menu "Program", opção "Active sectors".

Evite usar a opção "All tabs" do menu "Program", pois isso implicará na escrita do setor "OTP MEMORY" e do setor "OPTION BYTES" e, caso esteja algo configurado errado, as chances de alguma bobagem acontecer tendem ao infinito, segundo Murphy, e você poderá ter seu kit "tijolado", do inglês "bricked".

Atenção: a palavra "bricked" não existe no dicionário da lingua inglesa. Esse termo foi popularizado pelos xeretas e entusiastas de eletrônica que, ao gravarem de forma errada um firmware em um dispositivo qualquer (por IAP), acabam tornando esse dispositivo imprestável, possivelmente podendo ser utilizado como um tijolo em uma construção. Por sinal, um tijolo muito ruim, como diz Oxentijolo Bixim, rei dos tijolos baianos.

Se tudo correr bem na escrita do firmware, após um reset você deve verificar que o kit passa a funcionar como anteriormente.


SMT32 ST-Link Utility

Esse programa possui as mesmas funcionalidades do ST Visual Programmer, incluindo a possibilidade de se acessar os registradores do núcleo ARM em tempo de execução e fazer o donwload de regiões de dados da memória SRAM ou FLASH com endereços e tamanhos variados.

A única diferença é que esse aplicativo utiliza como arquivos de entrada imagens binárias no formato .BIN ao invés de arquivos no formato Intel .HEX


Debugger

STM Studio
Instalação

Como pré-requisito, talvez seja necessário instalar o Java Runtime Environment versão 1.6 ou posterior.

A instalação do STM Studio é simples e, após finalizada, provê um software capaz de se conectar ao programador STLINK e obter, em tempo de execução, variáveis da memória de dados e programa do microcontrolador, conforme desejado.

Esse programa é gratuito e oferece aos usuários desenvolvedores a chance de acompanhar a evolução de seus algoritmos de uma forma gráfica e visual. Ele não substitui um debugger ou depurador, que é muito mais apropriado para detecção de erros na concepção dos algoritmos.

A apresentação do programa e suas características será feira posteriormente, após criar, compilar e gravar seu primeiro programa no microcontrolador do kit.


Compilador, linkeditor e montador

YAGARTO
Instalação

A instalação do YAGARTO é simples e objetiva. Aceite tudo e seja feliz.

Ao final da instalação é criada uma pasta no menu iniciar com uma série de atalhos para a internet de forma a se obter mais informações a respeito dos pacotes integrantes do YAGARTO, entre eles: um pacote binutils, o pacote do super-compilador-linkador GCC e o pacote do GDB, o GNU Debugger.


Resultados

Conclusões

Agradecimentos

Essa oficina só foi possível pela colaboração de algumas instituições. Nosso agradecimento a todos pelo interesse, auxílio e apoio dedicados.

POLI - Elétrica PEA ST Microelectronics KARIMEX
POLI - Elétrica Depto. de Engenharia de
Energia e Automação Elétricas
ST Microelectronics
Escritório São Paulo/Brasil
Karimex
Componentes Eletrônicos


É importante agradecer às pessoas que incentivaram e auxiliaram na criação dessa oficina:


Outros agradecimentos importantes de serem mencionados

  • Chuck Norris. - Se chuck não fosse citado, ele apareceria nos meus sonhos para me lembrar disso.
  • Predator.

Referências

Atenção: se você clicar nas referências abaixo, você sairá dessa página e poderá ficar completamente perdido.

Sugere-se que você segure a tecla CONTROL de seu computador (não sei que tecla se pressiona nos MACs) e clique nos links abaixo, para que eles sejam abertos em outras abas ou janelas de seu navegador. De qualquer forma, a tecla de voltar do seu navegador é seu pastor e ela não te decepcionará.


Culturais (tipo [c XX])

  1. Douglas Adams, autor de literatura de ficção científica nonsense, incluindo a série de livros do Guia do Mochileiro das Galáxias e esquetes do Monty Python.
  2. Eoin Colfer, autor de literatura infantil, incluindo a série de livros Artemis Fowl e o espólio do Guia do Mochileiro das Galáxias de Douglas Adams.
  3. WashingMachine Trash Metal, "Oh my god, it's a brick !" ou "Por que a skynet vai acabar com todos nós".
  4. Roger Next Gen, Microcontrolador Roger instalado em sua próxima plataforma.
  5. Padawan, o manezon Jedi, Aprenda sobre a hierarquia Jedi. Também poderia se aplicar a usuários e programadores de microcontroladores.
  6. Some famous software bugs, uma lista de alguns problemas de software e provas da estupidez humana.

Ferramentas de apoio (tipo [t XX])


Homepages, artigos e documentos (tipo [g XX])

  1. ARM Limited, desenvolvedora das arquiteturas popularmente chamadas de ARM. Veja também o verbete da ARM Limited em inglês e sua homepage oficial.
  2. Arquitetura ARM, veja também o verbete wiki em inglês.
  3. Application-specific integrated circuit, Circuito integrado de aplicação específica.
  4. List of ARM microprocessor cores, Wikipage a respeito dos tipos de núcleos ARM.
  5. JTAG - Joint Test Action Group, Wikipage do padrão de interface de depuração e programação, incluindo sua versão light de 2 fios SWD.
  6. 6,0 6,1 STM32F4-Discovery, homepage oficial do kit.
  7. ST Microelectronics, Wikipage da ST Microelectronics
  8. ST Microelectronics Homepage, Homepage oficial da ST Microelectronics.
  9. MEMS - Microelectromechanical systems, tecnologia de micromáquinas para sensores.
  10. STM32F407VG, página do microcontrolador do kit SMT32F4-Discovery.
  11. Wiki ARM Cortex-M, Wikipage do núcleo ARM CORTEX.

Contribuições

Adicione também sua contribuição a essa página. Para colocar sua assinatura, no modo de edição do wiki, após a seção 'Autores', coloque um asterisco (*), seguido por um espaço e quatro símbolos de til (~) em sequencia, na forma:

* ~~~~

Autores

Ferramentas pessoais
Espaços nominais

Variantes
Ações
Navegação
Imprimir/exportar
Ferramentas