Como e por que ler fichas técnicas, se os microcontroladores são o seu hobby


A microeletrônica é um hobby da moda nos últimos anos, graças ao mágico Arduino. Mas o problema é: com o devido interesse, o DigitalWrite () pode superar rapidamente, mas o que fazer a seguir não está totalmente claro. Os desenvolvedores do Arduino fizeram muitos esforços para diminuir o limiar de entrada em seu ecossistema, mas fora dele ainda existe uma floresta escura de circuitos agressivos, inacessíveis a um amador.


Por exemplo, folhas de dados. Parece que eles têm tudo, pegam e usam. Mas apenas seus autores claramente não se impõem à tarefa de popularizar microcontroladores; às vezes parece que eles intencionalmente abusam de termos e abreviações obscuras ao descrever coisas simples, a fim de confundir os não iniciados o máximo possível. Mas nem tudo é tão ruim, se desejado, o peito se abre.


Neste artigo, compartilharei a experiência de comunicar humanidades com folhas de dados para fins de hobby. O texto é destinado a fãs de calças Arduino que cresceram fora das calças Arduino e fornece algumas dicas sobre como funcionam os microcontroladores.


Vou começar com o tradicional


LED piscando no Arduino


E imediatamente 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? - pergunte ao leitor sofisticado. - Por que você está escrevendo algo no registro de entrada PINB? Ele é apenas para leitura! De fato, a documentação do Arduino , como a maioria dos artigos de treinamento na Internet, afirma que esse registro é somente leitura. Eu próprio pensava assim até reler a folha de dados do Atmega328p, preparando este artigo. E aí:



Essa é uma funcionalidade relativamente nova, não estava no Atmega8, nem todo mundo sabe ou não a menciona por razões de compatibilidade com versões anteriores. Mas é bastante adequado para demonstrar a ideia de que vale a pena ler as folhas de dados para usar todos os recursos do chip, incluindo os pouco conhecidos. E este não é o único motivo.


Por que mais ler planilhas de dados


Normalmente, os drivers do arduino, tendo jogado o suficiente com LEDs e AnalogWrite'ami, começam a conectar todos os tipos de módulos e chips à placa, para a qual já existem bibliotecas escritas. Mais cedo ou mais tarde, aparece uma biblioteca que não funciona como deveria. Então o amador começa a pegá-lo para consertá-lo, e aí ...


E há algo totalmente incompreensível acontecendo, então você precisa acessar o Google, ler vários tutoriais, inserir partes do código adequado de alguém e, finalmente, seguir seu próprio caminho. Isso proporciona uma poderosa sensação de realização, mas, de fato, o processo lembra a invenção de uma bicicleta, por meio da engenharia reversa de uma motocicleta. Além disso, o entendimento de como esta moto funciona não aumenta. Eu sei, já que eu mesmo faço isso há algum tempo.


Se, em vez dessa atividade fascinante, eu passasse alguns dias estudando a documentação do Atmega328, economizaria uma quantidade enorme de tempo. No final, é um microcontrolador bastante simples.


Portanto, é necessário ler as fichas técnicas pelo menos para imaginar como o microcontrolador é geralmente organizado e o que ele pode fazer. E também:


  • para verificar e otimizar as bibliotecas de outras pessoas. Eles são frequentemente escritos pelos mesmos amantes que inventaram a bicicleta; ou, pelo contrário, os autores intencionalmente os tornam proteção excessiva do tolo. Que seja três vezes maior e mais lento, mas definitivamente funcionará;
  • ser capaz de usar chips no projeto em que ninguém escreveu a biblioteca;
  • facilitar a tarefa de migração de uma linha MK para outra;
  • finalmente otimizar o código antigo, que não se encaixava no Arduin;
  • aprender como gerenciar qualquer chip diretamente através de seus registros, sem se preocupar em estudar o dispositivo de suas bibliotecas, se houver.

Por que escrever diretamente nos registros quando há HAL e LL?


Vocabulário
HAL, Hardware Abstraction Layer - uma biblioteca para controlar um microcontrolador com um alto nível de abstração. Se você precisar usar a interface SPI1, simplesmente configuramos e ativamos o SPI1 sem nos preocuparmos com quais registros são responsáveis ​​por quê.
LL, API de baixo nível - uma biblioteca que contém macros ou estruturas com endereços de registro que permite acessá-los por nome. DDRx, PORTx, PINx no Atmega é LL.


Disputas sobre um assunto "HAL, LL ou registradores" ocorrem regularmente nos comentários sobre Habré. Sem reivindicar acesso ao conhecimento astral, simplesmente compartilharei minha experiência e pensamentos amadores.


Mais ou menos resolvendo a questão com a Atmega e tendo lido artigos sobre a linda STM32, comprei meia dúzia de pranchas diferentes - e Discovery, e “Blue Tablets”, e até apenas chips para meus produtos caseiros. Todos eles espanaram em uma caixa por dois anos. Às vezes, dizia para mim mesmo: "Estou dominando o STM neste fim de semana", lançou o CubeMX, gerou uma configuração para o SPI, olhou para a parede de texto resultante, rica em sabor com os direitos autorais do STM, e decidiu que era algo demais.



Para entender o que o CubeMX escreveu aqui, é claro, você pode. Mas, ao mesmo tempo, não é realista lembrar de todas as formulações, para que depois você possa escrevê-las com as mãos. E, se eu esquecer acidentalmente de marcar uma marca em Cuba, oi.


Dois anos se passaram, eu ainda lambia todos os tipos de saborosos, mas inacessíveis ao meu entendimento, fichas no ST MCU Finder , e acidentalmente me deparei com um artigo maravilhoso , embora sobre o STM8. E de repente percebi que, durante todo esse tempo, estava batendo na porta aberta: os registros do STM são organizados da mesma maneira que em qualquer outro MK, e o Cube é opcional para trabalhar com eles. E assim foi possível?


HAL e especificamente o STM32CubeMX é uma ferramenta para engenheiros profissionais que trabalham em estreita colaboração com os chips STM32. O principal recurso é um alto nível de abstração, a capacidade de migrar rapidamente de um MK para outro e até de um núcleo para outro, mantendo-se dentro da linha STM32. Os amadores raramente encontram essas tarefas - nossa escolha de MK geralmente se limita à variedade do AliExpress, e geralmente migramos entre chips radicalmente diferentes - passamos de Atmega para STM, de STM para ESP, ou o que há de novo em nossos amigos chineses. O HAL não ajudará aqui, e seu estudo consumirá muito tempo.


Resta LL - mas a partir dos registros de meio passo. Pessoalmente, acho útil escrever minhas macros com endereços de registro: estudo a folha de dados com mais cuidado, acho que vou precisar dela no futuro e, o que definitivamente não é, melhor estruturo meus programas e, em geral, superar ajuda a lembrar.


Além disso, há uma nuance no popular STM32F103 - para ele existem duas versões incompatíveis do LL, um oficial do STM, o segundo do Leaf Labs usado no projeto STM32duino. Se você escreve uma biblioteca de código aberto (e eu tinha apenas essa tarefa ), você deve criar duas versões ou acessar os registros diretamente.


Finalmente, a rejeição da LL, na minha opinião, simplifica a migração, especialmente se você se apegar a ela desde o início dos trabalhos no projeto. Exemplo exagerado: escreva o piscar de olhos de Arduin 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 pisque um LED em um cachecol chinês com STM8 (do ST Visual Desktop), basta alterar dois endereços nele:


 #define DDR_B 0x5007 #define OUT_B 0x5005 

Sim, eu uso o recurso de conectar o LED em uma placa específica, ele piscará muito lentamente, mas irá!


O que são folhas de dados


Nos artigos e nos fóruns, russo e inglês, por "planilhas de dados" significam qualquer documentação técnica para chips, faço o mesmo neste texto. Formalmente, eles são apenas um tipo de documentação:


Folha de dados - TTX, taticamente especificações técnicas. Certifique-se de ter qualquer componente eletrônico. As informações de referência são úteis para manter à mão, mas não há nada especialmente para ler com atenção. No entanto, chips mais simples geralmente são limitados a folhas de dados, para não produzir documentos desnecessários; neste caso, o manual de referência está incluído aqui.


Manual de referência - o manual atual, um livro saudável com mais de 1000 páginas. O trabalho de tudo o que é inserido no chip é pintado em detalhes. O principal documento para o desenvolvimento do microcontrolador. Diferentemente da folha de dados , as instruções são escritas para uma ampla variedade de MK, elas contêm muitas informações sobre a periferia que não estão disponíveis no seu modelo específico.


Manual de programação ou manual do conjunto de instruções - instruções para os comandos exclusivos do microcontrolador. Projetado para quem programa em Assembler. Os autores dos compiladores o usam ativamente para otimizar o código, portanto, em geral, não precisamos dele. Mas espreitar aqui é útil para uma compreensão geral, por trás de alguns comandos específicos, como sair da interrupção, bem como com o uso ativo do depurador.


Nota de aplicação - Dicas úteis para resolver problemas específicos, geralmente com exemplos de código.


Folha de Erratas - uma descrição dos casos de comportamento de chip não padrão com opções de desvio, se houver.


O que há nas planilhas de dados


Diretamente na folha de dados, podemos precisar das seguintes seções:


Resumo do dispositivo - A primeira página da folha de dados fala brevemente sobre o dispositivo. É muito útil em situações em que você encontrou um chip em algum lugar (viu em uma loja, vypayali, encontrou uma menção) e deseja entender o que é.


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


Pinagens - esquemas de pinagem para todos os casos possíveis de chips (cuja perna possui um pino).


Descrição do Pin - Uma descrição da finalidade e dos recursos de cada pin.


Mapa de memória - dificilmente precisamos de um mapa de endereços na memória, mas às vezes também inclui uma tabela de endereços de blocos de registro.


Mapa de Registros - a tabela de endereços dos blocos de registradores, em regra, está localizada na folha de dados e, no Manual de Ref - apenas compensações de endereços .


Características elétricas - nesta seção, estamos interessados ​​principalmente em classificações máximas absolutas , listando a carga máxima no chip. Diferente do inmovível Atmega328p, a maioria dos MKs não permite conectar cargas sérias aos pinos, o que se torna uma surpresa desagradável para os jogadores de arduino.


Informações sobre o pacote - Desenhos de gabinetes acessíveis, úteis para projetar suas placas de circuito impresso.


O Manual de Referência é composto estruturalmente por seções na periferia específica indicada em seu cabeçalho. Cada capítulo pode ser dividido em três partes:


Visão Geral , Introdução , Recursos - uma visão geral dos recursos periféricos;


Descrição Funcional , Guia de Uso ou apenas o bloco de seção principal - uma descrição textual detalhada dos princípios do dispositivo periférico e como usá-lo;


Registradores - descrição dos registros de controle. Em casos simples, como GPIO ou SPI, isso pode ser suficiente para começar a usar periféricos, mas muitas vezes você ainda precisa ler as partes anteriores.


Como ler folhas de dados


Os datashitas de hábito assustam com seu volume e uma abundância de palavras incompreensíveis. De fato, nem tudo é tão assustador se você conhece alguns hacks da vida.


Instale um bom leitor de PDF . Os datashits são escritos na tradição gloriosa das instruções em papel, é ótimo imprimi-los, colocá-los com marcadores de plástico e costurá-los. O hipertexto neles é observado em quantidades vestigiais. Felizmente, pelo menos a estrutura do documento está marcada, portanto, é necessário um bom leitor com navegação conveniente.


Datashit não é um livro-texto da Straustrup; você não precisa ler tudo nele . Se você usou a dica anterior, basta encontrar a seção na barra de favoritos.


As folhas de dados, especialmente os manuais de referência , podem não descrever os recursos de um chip específico, mas a linha inteira . Isso significa que metade ou até dois terços das informações não estão relacionadas ao seu chip. Antes de estudar os registros TIM7, verifique a Descrição Geral, se você tiver um.


Basta saber inglês em um nível básico . Os datashits são metade compostos por termos não familiares ao falante nativo médio e a metade é composta por estruturas de conexão simples. Ainda existem belas planilhas de dados em chinês no inglês chinês, onde metade também é termos, e a segunda metade é um conjunto aleatório de palavras.


Se você encontrar uma palavra desconhecida , não tente traduzi-la usando o dicionário Inglês-Russo. Se a histerese o desconcerta , a tradução de "histerese" não o aquece. Use o Google, Stack Overflow, Wikipedia, fóruns, onde o conceito necessário será explicado em palavras simples e com exemplos .


A melhor maneira de entender o que você lê é fazer check-in em ação . Portanto, mantenha à mão o painel de depuração com o qual você está familiarizado, e de preferência dois, caso você tenha entendido algo errado e tenha visto uma fumaça mágica.


É um bom hábito manter uma folha de dados à mão quando você lê o tutorial de alguém ou estuda a biblioteca de outra pessoa. É possível, nele você encontrará uma solução mais ideal para o seu problema. E vice-versa - se você não consegue entender da folha de dados como o registro funciona, pesquise no Google: provavelmente alguém já descreveu tudo em palavras simples ou deixou um código compreensível no github.


Vocabulário


Algumas palavras e notações úteis que ajudam você a se acostumar com as planilhas de dados mais rapidamente. O que foi lembrado nos últimos dias, acréscimos e correções são bem-vindos.


Eletricidade
Vcc , Vdd - Plus, Potência
Vss , Vee - "menos", terra
atual - atual
tensão - tensão
afundar corrente - trabalhe "terra" para uma carga externa
para fornecer corrente - fornecer carga externa
pino alto do coletor / fonte - pino com maior tolerância de carga


IO
H, Alto - no pino Vcc
L, baixo - no pino Vss
Alta impedância , Hi-Z , flutuante - não há nada no pino, "alta resistência", é na verdade invisível para o mundo exterior.
pull-up fraco , pull-down fraco - resistor pull-up / pull-down embutido, um análogo aproximado de 50 kOhm (consulte a folha de dados). É usado, por exemplo, para impedir que o pino de entrada fique suspenso no ar, causando falsos positivos. Fraco - porque é fácil "matá-lo".
pressione o modo de saída de pino, no qual alterna entre SAÍDA normal alta e baixa com o Arduino.
dreno aberto - designação do modo de saída, no qual o pino pode ser Baixa ou Alta Impedância / Flutuante . Além disso, quase sempre este não é um dreno aberto "real", existem diodos de proteção, resistores e assim por diante. É simplesmente uma designação do modo solo / nada.
dreno aberto verdadeiro - mas esse já é um dreno aberto real: o pino leva diretamente ao chão se estiver aberto ou no limbo se estiver fechado. Isso significa que, se necessário, uma tensão maior que Vcc pode ser permitida através dele, mas o máximo ainda é especificado na folha de dados na seção Classificações máximas absolutas / tensão .


Interfaces
em série - conectado em série
encadear - colete chips em uma cadeia por uma conexão serial, aumentando o número de saídas.
shift - shift, geralmente denota uma troca de bits. Assim, para mudar e sair - receba e transmita dados pouco a pouco.
trava - uma válvula que cobre o buffer enquanto os bits são deslocados através dele. Quando a transferência é concluída, a válvula se abre e os bits começam a funcionar.
to clock in - realize a transferência bit a bit, mude todos os bits para os locais desejados.
buffer duplo , registro sombra , registro de pré-carregamento - designações do histórico quando o registro deve poder aceitar novos dados, mas mantenha-os até algum momento. Por exemplo, para que o PWM funcione corretamente, seus parâmetros (ciclo de serviço, frequência) não devem mudar até que o ciclo atual termine, mas novos parâmetros já podem ser transferidos. Dessa forma, os atuais são mantidos no registrador sombra e os novos caem no registrador de pré - carga , sendo registrados no registrador de chips correspondente.


Todo
prescaler - divisor de frequência
para definir um pouco - defina o bit como 1
limpar / redefinir um bit - redefina o bit para 0 ( redefinir - chip da ficha técnica STM)
para alternar um pouco - altere o valor do bit para o oposto (veja o exemplo no início do artigo)


O que vem a seguir


Em geral, uma parte prática foi planejada aqui com uma demonstração de três projetos no STM32 e STM8, feitos especificamente para este artigo usando planilhas de dados, com lâmpadas, SPI, temporizadores, PWM e interrupções:



Mas como o texto é demais, os projetos são enviados para a segunda parte.


A habilidade de ler planilhas de dados o ajudará no seu hobby, mas é improvável que você substitua a comunicação ao vivo com outros entusiastas em fóruns e salas de bate-papo. Para ele, no entanto, é antes de tudo apertar o idioma inglês. Por isso, terminei de lê-lo - um prêmio especial: duas aulas gratuitas em Skyeng no primeiro pagamento usando o código HABR2 .

Source: https://habr.com/ru/post/pt449624/


All Articles