Como e por que ler datasheets, se microcontroladores são seu hobby

Como e por que ler datasheets, se microcontroladores são seu hobby

A microeletrônica se tornou uma paixão popular nos últimos anos, graças ao mágico Arduino. Mas, veja, quando há verdadeiro interesse, é fácil ultrapassar o DigitalWrite() rapidamente, e o que fazer em seguida não está tão claro. Os desenvolvedores do Arduino fizeram bastante para baixar a barreira de entrada em seu ecossistema, mas além dele ainda existe uma floresta densa de circuitos complexos, pouco acessível para os entusiastas.

Por exemplo, os datasheets. À primeira vista, eles parecem ter tudo que você precisa, é só pegar e usar. Mas seus autores claramente não têm a intenção de popularizar os microcontroladores; às vezes parece, que eles abusam de termos obscuros e abreviações para descrever coisas simples, a fim de confundir ainda mais o iniciante. Porém, não está tudo tão ruim, se houver vontade, a solução se revela.

Neste artigo, compartilharei a experiência de um humanista ao lidar com datasheets para fins de hobby. O texto é destinado a entusiastas que cresceram além do Arduino, e assume alguma compreensão dos princípios de funcionamento dos microcontroladores.

Começarei com o tradicional

Blinking LED on Arduino

E aqui está o código:

void setup() {
DDRB |= (1<<5);
}

void loop() {
PINB = (1<<5);
for (volatile uint32_t k=0; k<100000; k++);
}

“O que é isso? – Perguntará o leitor experiente. – Por que você escreve algo no registrador de entrada PINB? Ele é apenas para leitura!” De fato, a documentação do Arduino, como a maioria dos artigos didáticos na internet, afirma que esse registrador é somente leitura. Eu pensava assim também, até reler o datasheet do Atmega328p, enquanto preparava este artigo. E lá está:

Como e por que ler datasheets, se microcontroladores são seu hobby

Este é um recurso relativamente novo, que não existia no Atmega8, e nem todos sabem disso ou mencionam por questões de compatibilidade retroativa. Mas é uma boa maneira de demonstrar que vale a pena ler datasheets, para aproveitar todas as funcionalidades do chip, incluindo as menos conhecidas. E essa não é a única razão.

Por que mais ler datasheets

Normalmente, os entusiastas do Arduino, após brincar com LEDs e AnalogWrites, começam a conectar diferentes módulos e chips à placa, para os quais já existem bibliotecas prontas. Tarde ou cedo, uma biblioteca aparece que não funciona como deveria. Então, o entusiasta começa a revirá-la para consertar, e lá...

Lá acontece algo completamente incompreensível, então é necessário ir ao Google, ler inúmeros tutoriais, pegar segmentos do código de alguém que se encaixe e finalmente alcançar o objetivo. Isso proporciona uma forte sensação de realização, mas na verdade o processo é semelhante a inventar a bicicleta por meio da engenharia reversa de uma motocicleta. E, além disso, não aumenta a compreensão de como essa bicicleta funciona. Sei disso porque fiz isso por muito tempo.

Se eu tivesse passado alguns dias estudando a documentação do Atmega328 em vez dessa atividade fascinante, teria economizado uma quantidade enorme de tempo. Afinal, é um microcontrolador bastante simples.

Portanto, é necessário ler as folhas de dados, mesmo que seja apenas para ter uma ideia de como o microcontrolador é estruturado e o que ele pode fazer. E mais:

  • para verificar e otimizar as bibliotecas de outras pessoas. Elas são frequentemente escritas por entusiastas que estão inventando a roda; ou, ao contrário, os autores deliberadamente adicionam proteção excessiva contra erros. Que seja três vezes maior e mais lento, mas que funcione com certeza;

  • para poder usar chips em projetos para os quais ninguém escreveu uma biblioteca;

  • para facilitar a migração de uma linha de microcontroladores para outra;

  • para finalmente otimizar meu código antigo, que não cabia de jeito nenhum na Arduino;

  • para aprender a controlar qualquer chip diretamente através de seus registradores, sem se preocupar em estudar a estrutura de suas bibliotecas, se existirem.

Por que escrever diretamente nos registradores quando existem HAL e LL?

Glossário
HAL, High Abstraction Layer – biblioteca para controlar um microcontrolador com alto nível de abstração. Se você precisa usar a interface SPI1, basta configurá-la e ativá-la, sem se preocupar com quais registradores correspondem a quê.
LL, Low Level API – biblioteca que contém macros ou estruturas com endereços de registradores, permitindo que você acesse-os pelo nome. DDRx, PORTx, PINx no Atmega são considerados LL.

Disputas sobre "HAL, LL ou registradores" ocorrem regularmente nos comentários do Habr. Sem pretender acesso ao conhecimento astral, apenas compartilharei minha experiência e reflexões como entusiasta.

Depois de entender mais ou menos o funcionamento do Atmega e ler artigos sobre as maravilhas do STM32, comprei uma dúzia de placas diferentes – tanto Discovery quanto as "Pílulas Azuis", e até mesmo chips soltos para meus projetos. Todos eles ficaram guardados na caixa por dois anos. Às vezes, me dizia: "OK, neste fim de semana vou aprender STM", abria o CubeMX, gerava a configuração para SPI, olhava para a parede de texto resultante, repleta de copyrights da STM, e decidia que era um pouco demais.

Como e por que ler datasheets, se microcontroladores são seu hobby

É claro que dá para entender o que o CubeMX escreveu aqui. Mas ao mesmo tempo, é evidente que memorizar todas as formulações, para depois escrevê-las manualmente, é impossível. E depurar isso, caso eu esqueça de marcar alguma opção no Cube, é completamente complicado.

Passaram-se dois anos, e eu ainda olhava com desejo para o ST MCU Finder em busca de chips saborosos, mas que estavam além da minha compreensão, até que acabei encontrando um artigo maravilhoso, ainda que sobre STM8. E de repente percebi que todo esse tempo bati na porta aberta: os registradores do STM são organizados da mesma forma que os de qualquer outro MCU, e para trabalhar com eles, o Cube não é obrigatório. O que, eu poderia fazer isso?..

O HAL e especificamente o STM32CubeMX – são ferramentas para engenheiros profissionais que trabalham intensamente com chips STM32. A principal característica é o alto nível de abstração, permitindo migrações rápidas de um MCU para outro e até entre diferentes núcleos, enquanto permanece dentro da linha STM32. Os entusiastas se deparam com essas tarefas raramente – nossa escolha de MCU geralmente é limitada ao que encontramos no AliExpress, e frequentemente migramos entre chips radicalmente diferentes – mudamos do Atmega para o STM, do STM para o ESP, ou o que quer que nossos amigos chineses nos apresentem de novo. O HAL aqui não ajudará, e o tempo para estudá-lo não é pouco.

Resta o LL – mas da LL até os registradores são apenas um passo. Pessoalmente, acho útil escrever meus próprios macros com os endereços dos registradores: eu estudo mais atentamente o datasheet, penso no que vou precisar no futuro, o que de fato não é necessário, melhor estruturo meus programas, e, de modo geral, enfrentar isso ajuda na memorização.

Além disso, há uma questão com o popular STM32F103 – existem duas versões incompatíveis do LL, uma oficial da STM e a outra da Leaf Labs, utilizada no projeto STM32duino. Se for escrever uma biblioteca open-source (e eu tinha exatamente esse tipo de tarefa), é necessário criar duas versões ou acessar os registradores diretamente.

Finalmente, a eliminação da LL, na minha opinião, simplifica a migração, especialmente se for considerada desde o início do projeto. Um exemplo extremo: vamos escrever um blink de Arduino no Atmel Studio sem LL:

#include <stdint.h>

#define _REG(addr) (*(volatile uint8_t*)(addr))

#define DDR_B 0x24
#define OUT_B 0x25

int main(void)
{
    volatile uint32_t k;

    _REG(DDR_B) |= (1<<5);

    while(1)
    {
        _REG(OUT_B) |= (1<<5);
        for (k=0; k<50000; k++);
        _REG(OUT_B) &= ~(1<<5);
        for (k=0; k<50000; k++);
    } 
}

Para que esse código faça o LED piscar em uma placa chinesa com STM8 (do ST Visual Desktop), basta trocar dois endereços:

#define DDR_B 0x5007
#define OUT_B 0x5005

Sim, estou usando uma característica de conexão do LED na placa específica, ele vai piscar muito devagar, mas vai piscar!

Quais são os tipos de datasheets

Em artigos e fóruns, tanto em russo quanto em inglês, 'datasheets' se refere a qualquer documentação técnica sobre chips, e assim faço também neste texto. Formalmente, eles são apenas um dos tipos dessa documentação:

Datasheet – Especificações Táticas e Técnicas. Sempre disponível para qualquer componente eletrônico. Informação de referência, é útil ter à mão, mas não vale a pena ler com muita atenção. No entanto, chips mais simples costumam se limitar ao datasheet para não gerar documentos desnecessários; nesse caso, Manual de Referência é incluído aqui também.

Manual de Referência – a própria instrução, um livro longo com 1000+ páginas. Ela descreve detalhadamente o funcionamento de tudo que foi embutido no chip. O principal documento para entender o microcontrolador. Diferente do datasheet, as instruções são escritas para uma ampla gama de MCs, contendo muita informação sobre a periferia que pode não estar presente no seu modelo específico.

Manual de Programação ou Manual do Conjunto de Instruções – instruções sobre comandos únicos do microcontrolador. Destinada àqueles que programam em Assembly. Os autores de compiladores a utilizam ativamente para otimizar o código, portanto, em geral, não precisaremos dela. Mas é útil consultar para uma compreensão geral, especialmente em alguns comandos específicos, como saída de interrupção, e ao usar um depurador ativamente.

Nota de Aplicação – dicas úteis para resolver problemas específicos, muitas vezes com exemplos de código.

Errata – descrição de casos de comportamento não padrão do chip com opções de solução, se houver.

O que há nos datasheets

Diretamente em Datasheet podemos precisar de seções como:

Resumo do Dispositivo – a primeira página do datasheet resume o dispositivo. Muito útil em situações em que você encontrou um chip em algum lugar (viu na loja, desoldou, encontrou uma menção) e deseja entender do que se trata.

Descrição Geral – uma descrição mais detalhada das capacidades dos chips da linha.

Pinouts – diagramas de pinos para todos os possíveis invólucros do chip (qual pino em qual perna).

Descrição do Pino – descrição da função e capacidades de cada pino.

Mapa de Memória – o mapa de endereços na memória provavelmente não será necessário, mas às vezes inclui também a tabela de endereços dos blocos de registradores.

Mapa de Registradores – a tabela de endereços dos blocos de registradores geralmente está exatamente no datasheet, e no Manual de Referência – somente deslocamentos (endereço dos deslocamentos).

Características Elétricas – nesta seção, estamos principalmente interessados em classificações máximas absolutas, listando as cargas máximas para o chip. Ao contrário da indestrutível Atmega328p, a maioria dos MCs não permite conectar cargas significativas aos pinos, o que se torna uma surpresa desagradável para os usuários do Arduino.

Informações do Pacote – desenhos dos invólucros disponíveis, úteis ao projetar suas placas.

Manual de Referência é estruturado em seções dedicadas à periferia específica indicada em seus cabeçalhos. Cada capítulo pode ser dividido em três partes:

Visão Geral, Introdução, Recursos – uma visão geral das capacidades da periferia;

Descrição Funcional, Guia de Uso ou simplesmente o bloco principal da seção – uma descrição textual detalhada dos princípios de funcionamento da periferia e das maneiras de utilizá-la;

Registradores – descrição dos registradores de controle. Em casos simples como GPIO ou SPI, isso pode ser suficiente para começar a usar a periferia, mas muitas vezes é necessário ler as partes anteriores.

Como Ler Datasheets

Datasheets podem assustar com seu volume e a abundância de palavras incompreensíveis. Na verdade, não é tão assustador se você conhecer algumas dicas.

Instale um bom leitor de PDF. Datasheets são escritas nas gloriosas tradições dos manuais em papel, é ótimo imprimi-los, colocar marcadores de plástico e encaderná-los. O hipermídia nelas é observado em quantidades mínimas. Felizmente, pelo menos a estrutura do documento é formatada com marcadores, portanto, um bom leitor com navegação conveniente é muito necessário.

Um datasheet não é um livro de texto de Stroustrup, nele não é necessário ler tudo em sequência. Se você seguiu a dica anterior – simplesmente encontre na barra de marcadores a seção desejada.

Datasheets, especialmente Manuais de Referência, podem descrever as capacidades não de um chip específico, mas de toda a linha. Isso significa que metade ou até dois terços das informações não têm relação com o seu chip. Antes de estudar os registradores TIM7, verifique se você Descrição Geral, possui um.

Saber inglês o suficiente em um nível básico. As fichas técnicas são compostas em metade por termos desconhecidos para um falante médio da língua e na outra metade por construções conectivas simples. Existem também ótimas fichas técnicas em chinês inglês, onde metade são termos e a outra metade é uma coleção aleatória de palavras.

Se você encontrar uma palavra desconhecida, não tente traduzi-la usando um dicionário inglês-russo. Se você ficar confuso com histerese, a tradução "histerese" não te deixará mais confortável. Use o Google, Stack Overflow, Wikipedia, fóruns, onde o conceito necessário será explicado em termos simples com exemplos.

A melhor maneira de entender o que você leu é testar na prática. Portanto, tenha à mão a placa de depuração com a qual você está se familiarizando, ou melhor ainda, tenha duas — por precaução, caso você ainda não tenha compreendido algo e veja uma fumaça mágica.

É útil ter a ficha técnica à mão quando você lê o tutorial de alguém ou estuda a biblioteca de outra pessoa. É bastante possível que você encontre uma solução mais otimizada para sua tarefa nela. E ao contrário — se não conseguir entender como o registrador funciona pela ficha técnica, pesquise: provavelmente alguém já descreveu tudo em termos simples ou deixou um código claro no GitHub.

Glossário

Algumas palavras e notações úteis que ajudam a se familiarizar mais rapidamente com as fichas técnicas. O que veio à mente nos últimos dias, adições e correções são bem-vindas.

Eletricidade
Vcc, Vdd – "positivo", alimentação
Vss, Vee – "negativo", terra
corrente – corrente
tensão – tensão
para drenar corrente – funcionar como "terra" para a carga externa
para fornecer corrente – alimentar a carga externa
pino de alta capacidade de drenar/fornecer – pino com alta "toleração" à carga

IO
H, Alto – no pino Vcc
L, Baixo – no pino Vss
Alta Impedância, Hi-Z, flutuante – no pino não há nada, "alta resistência", ele é na verdade invisível para o mundo exterior.
fraco pull up, fraco pull down – resistor pull-up/pull-down embutido, análogo aproximado a 50 kOhm (veja a ficha técnica). Usado, por exemplo, para que o pino de entrada não fique solto no ar, causando disparos falsos. Fraco – porque é fácil de "substituir".
push pull – modo de saída do pino, no qual ele alterna entre Alto e Baixo – saída comum com Arduino.
drain aberta – designação do modo de saída, onde o pino pode ser Baixo, ou Alta Impedância / Flutuante. Isso geralmente não é um "drain aberto" verdadeiro, existem diodos de proteção, resistores, e assim por diante. É apenas uma designação de modo terra/nada.
drain aberto verdadeiro – isso sim é um verdadeiro drain aberto: o pino vai diretamente para o terra se estiver aberto, ou permanece em estado flutuante se fechado. Isso significa que, se necessário, pode-se aplicar uma tensão maior do que Vcc, mas o máximo ainda é especificado no datasheet na seção Limites Máximos Absolutos / Tensão.

Interfaces
em série – conectados em sequência
para encadear – agrupar chips em uma cadeia por conexão sequencial, aumentando o número de saídas.
deslocamento – shift, normalmente indica um deslocamento de bits. Portanto, para deslocar para dentro e para deslocar para fora – receber e transmitir dados bit a bit.
trava – mecanismo que cobre o buffer enquanto os bits estão sendo deslocados através dele. Quando a transmissão termina, a trava se abre e os bits começam a funcionar.
para sincronizar entrada – realizar transmissão bit a bit, deslocar todos os bits para os lugares desejados.
buffer duplo, registro sombra, registro de pré-carregamento – designações históricas, onde o registro deve ser capaz de receber novos dados, mas mantê-los até um determinado momento. Por exemplo, para o funcionamento correto do PWM, seus parâmetros (duty cycle, frequência) não devem mudar até que o ciclo atual termine, mas novos parâmetros podem já ter sido transmitidos. Assim, os atuais são mantidos em registro sombra, enquanto os novos vão para registro de pré-carregamento, sendo gravados no registro correspondente do chip.

Diversos
pré-divisor – divisor de frequência
para definir um bit – definir o bit como 1
para limpar/resetar um bit – resetar o bit para 0 (resetar – recurso dos datasheets STM)

O que vem a seguir

Na verdade, estava planejada uma parte prática com a demonstração de três projetos em STM32 e STM8, realizados especialmente para este artigo utilizando os datasheets, com lâmpadas, SPI, temporizadores, PWM e interrupções:

Como e por que ler datasheets, se microcontroladores são seu hobby

Mas o texto já está bastante longo, portanto os projetos serão enviados para a segunda parte.

A habilidade de ler datasheets ajudará você com seu hobby, mas dificilmente substituirá a interação ao vivo com colegas de interesse em fóruns e chats. Para isso, é importante melhorar seu inglês. Portanto, para aqueles que lerem até aqui – um prêmio especial: duas aulas gratuitas no Skyeng na primeira compra com o código HABR2.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster