Cómo y por qué leer hojas de datos, si los microcontroladores son su pasatiempo


La microelectrónica es un pasatiempo de moda de los últimos años gracias al mágico Arduino. Pero el problema es que, con el debido interés, DigitalWrite () puede superar rápidamente, pero lo que debe hacer a continuación no está del todo claro. Los desarrolladores de Arduino hicieron muchos esfuerzos para reducir el umbral de entrada a su ecosistema, pero fuera de él todavía hay un bosque oscuro de circuitos duros, inaccesible para un aficionado.


Por ejemplo, hojas de datos. Parece que lo tienen todo, tómalo y úsalo. Pero solo sus autores claramente no se plantean la tarea de popularizar los microcontroladores; a veces parece que abusan intencionalmente de términos oscuros y abreviaturas cuando describen cosas simples para confundir a los no iniciados tanto como sea posible. Pero no todo es tan malo, si lo desea, el cofre se abre.


En este artículo, compartiré la experiencia de comunicar humanidades con hojas de datos con fines de pasatiempo. El texto está destinado a los fanáticos de los pantalones Arduino que han surgido de los pantalones Arduino. Proporciona una idea de cómo funcionan los microcontroladores.


Comenzaré con lo tradicional


LED parpadeante en Arduino


E inmediatamente el código:


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

"¿Qué es eso? - Pregúntale al lector sofisticado. - ¿Por qué estás escribiendo algo en el registro de entrada PINB? ¡Es solo para leer! De hecho, la documentación de Arduino , como la mayoría de los artículos de capacitación en Internet, afirma que este registro es de solo lectura. Yo mismo lo pensé hasta que volví a leer la hoja de datos de Atmega328p, preparando este artículo. Y ahi:



Esta es una funcionalidad relativamente nueva, no estaba en Atmega8, no todo el mundo lo sabe o no lo menciona por razones de compatibilidad con versiones anteriores. Pero es bastante adecuado para demostrar la idea de que vale la pena leer las hojas de datos para utilizar todas las capacidades del chip, incluidas las poco conocidas. Y esta no es la única razón.


¿Por qué si no leer hojas de datos


Por lo general, los controladores arduino, después de haber jugado lo suficiente con LED y AnalogWrite'ami, comienzan a conectar todo tipo de módulos y chips a la placa, para lo cual ya hay bibliotecas escritas. Tarde o temprano, aparece una biblioteca que no funciona como debería. Entonces el aficionado comienza a recogerlo para arreglarlo, y allí ...


Y está sucediendo algo totalmente incomprensible, por lo que debe ir a Google, leer numerosos tutoriales, extraer el código adecuado de alguien y finalmente salirse con la suya. Esto brinda una poderosa sensación de logro, pero de hecho, el proceso recuerda la invención de una bicicleta mediante ingeniería inversa de una motocicleta. Además, entender cómo funciona esta bicicleta no aumenta. Lo sé, ya que yo mismo he estado haciendo esto por bastante tiempo.


Si en lugar de esta fascinante actividad pasé un par de días estudiando la documentación para Atmega328, habría ahorrado una gran cantidad de tiempo. Al final, es un microcontrolador bastante simple.


Por lo tanto, es necesario leer hojas de datos al menos para imaginar cómo se organiza generalmente el microcontrolador y qué puede hacer. Y también:


  • para verificar y optimizar las bibliotecas de otras personas. A menudo son escritos por los mismos amantes que inventaron la bicicleta; o, por el contrario, los autores intencionalmente les hacen una protección excesiva contra el tonto. Deje que sea tres veces más grande y más lento, pero definitivamente funcionará;
  • para poder usar chips en el proyecto en el que nadie escribió la biblioteca;
  • para facilitar la tarea de migración de una línea MK a otra;
  • para finalmente optimizar su antiguo código, que no encajaba en Arduin;
  • para aprender a administrar cualquier chip directamente a través de sus registros, sin molestarse en estudiar el dispositivo de sus bibliotecas, si corresponde.

¿Por qué escribir directamente a los registros cuando hay HAL y LL?


Vocabulario
HAL, Hardware Abstraction Layer : una biblioteca para controlar un microcontrolador con un alto nivel de abstracción. Si necesita utilizar la interfaz SPI1, simplemente configuramos y habilitamos SPI1 sin preocuparnos por qué registros son responsables de qué.
LL, API de bajo nivel : una biblioteca que contiene macros o estructuras con direcciones de registro que le permite acceder a ellas por nombre. DDRx, PORTx, PINx en Atmega es LL.


Las disputas sobre un tema "HAL, LL o registros" ocurren regularmente en los comentarios sobre Habré. Sin reclamar acceso al conocimiento astral, simplemente compartiré mi experiencia y pensamientos de aficionados.


Más o menos resolviendo con Atmega y después de leer artículos sobre el hermoso STM32, compré media docena de tableros diferentes, Discovery y “Tabletas azules”, e incluso solo chips para mis productos caseros. Todos ellos espolvoreados en una caja durante dos años. A veces me decía a mí mismo: "Estoy dominando STM este fin de semana", lanzó CubeMX, generé una configuración para SPI, miré el muro de texto resultante, rico en sabores con derechos de autor de STM, y decidí que de alguna manera era demasiado.



Para entender lo que CubeMX escribió aquí, por supuesto, puedes hacerlo. Pero al mismo tiempo, no es realista recordar todas las formulaciones, para que luego pueda escribirlas con las manos. Y debítalo, si accidentalmente olvido poner una marca en Cuba, - hola.


Pasaron dos años, todavía lamí todo tipo de chips deliciosos, pero inaccesibles a mi entender, en el Buscador ST MCU , y accidentalmente me topé con un artículo maravilloso , aunque sobre STM8. Y de repente me di cuenta de que todo este tiempo estaba tocando a la puerta abierta: los registros para STM están dispuestos de la misma manera que para cualquier otro MK, y el Cube es opcional para trabajar con ellos. ¿Y entonces fue posible? ..


HAL y específicamente STM32CubeMX es una herramienta para ingenieros profesionales que trabajan estrechamente con chips STM32. La característica principal es un alto nivel de abstracción, la capacidad de migrar rápidamente de un MK a otro e incluso de un núcleo a otro, mientras permanece dentro de la línea STM32. Los aficionados rara vez se encuentran con tales tareas: nuestra elección de MK generalmente se limita al rango de AliExpress, y a menudo migramos entre chips radicalmente diferentes: nos movemos de Atmega a STM, de STM a ESP, bueno, o lo que es nuevo para nuestros amigos chinos. HAL no ayudará aquí, y su estudio consumirá mucho tiempo.


Queda LL, pero de él a los registros de medio paso. Personalmente, creo que escribir mis macros con direcciones de registro es útil: estudio la hoja de datos con más cuidado, creo que la necesitaré en el futuro, y lo que definitivamente no es así, mejor estructurar mis programas y, en general, la superación ayuda a recordar.


Además, hay un matiz con el popular STM32F103: para ello hay dos versiones incompatibles de LL, una oficial de STM, la segunda de Leaf Labs utilizada en el proyecto STM32duino. Si escribe una biblioteca de código abierto (y yo tenía exactamente esa tarea ), debe hacer dos versiones o acceder a los registros directamente.


Finalmente, el rechazo de LL, en mi opinión, simplifica la migración, especialmente si se le aplica desde el comienzo del trabajo en el proyecto. Ejemplo exagerado: escribe el parpadeo de Arduin en Atmel Studio sin 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 este código parpadee un LED en una bufanda china con STM8 (desde ST Visual Desktop), es suficiente cambiar dos direcciones en él:


 #define DDR_B 0x5007 #define OUT_B 0x5005 

Sí, uso la función de conectar el LED en una placa específica, parpadeará muy lentamente, ¡pero lo hará!


¿Qué son las hojas de datos?


En los artículos y en los foros, tanto en ruso como en inglés, por "hojas de datos" se refieren a cualquier documentación técnica para chips, hago lo mismo en este texto. Formalmente, son solo un tipo de dicha documentación:


Hoja de datos - TTX, tácticamente especificaciones tecnicas. Asegúrese de tener cualquier componente electrónico. La información de referencia es útil para tener a la mano, pero especialmente no hay nada que leer cuidadosamente. Sin embargo, los chips más simples a menudo se limitan a hojas de datos, para no producir documentos innecesarios; en este caso, el manual de referencia se incluye aquí.


Manual de referencia : el manual real, un libro saludable con más de 1000 páginas. El trabajo de todo lo que se inserta en el chip está pintado en detalle. El documento principal para el desarrollo del microcontrolador. A diferencia de la hoja de datos , las instrucciones están escritas para una amplia gama de MK, contienen mucha información sobre la periferia que no está disponible en su modelo específico.


Manual de programación o Manual de conjunto de instrucciones: instrucciones para los comandos únicos del microcontrolador. Diseñado para aquellos que programan en Assembler. Los autores de los compiladores lo usan activamente para optimizar el código, por lo que, en general, no lo necesitaremos. Pero echar un vistazo aquí es útil para una comprensión general, detrás de algunos comandos específicos, como salir de la interrupción, así como con el uso activo del depurador.


Nota de aplicación : consejos útiles para resolver problemas específicos, a menudo con ejemplos de código.


Hoja de erratas : una descripción de casos de comportamiento de chip no estándar con opciones de omisión, si las hay.


¿Qué hay en las hojas de datos?


Directamente en la Hoja de datos, podemos necesitar las siguientes secciones:


Resumen del dispositivo : la primera página de la hoja de datos habla brevemente sobre el dispositivo. Es muy útil en situaciones en las que en algún lugar encontró un chip (vio en una tienda, vypayali, recibió una mención) y quiere comprender qué es.


Descripción general : una descripción más detallada de las capacidades de los chips de la línea.


Pinouts : esquemas de pinout para todas las cajas de chips posibles (qué pata tiene un pin).


Descripción del pin : una descripción del propósito y las capacidades de cada pin.


Mapa de memoria : apenas necesitamos un mapa de dirección en la memoria, pero a veces también incluye una tabla de direcciones de bloques de registro.


Mapa de registro : la tabla de direcciones de los bloques de registro, por regla general, se encuentra en la hoja de datos y en el Manual de referencia : solo compensaciones de direcciones .


Características eléctricas : en esta sección, nos interesan principalmente las clasificaciones máximas absolutas , que enumeran la carga máxima en el chip. A diferencia del Atmega328p que no se puede matar, la mayoría de los MK no le permiten conectar cargas serias a los pines, lo que se convierte en una sorpresa desagradable para los jugadores arduino.


Información del paquete : dibujos de gabinetes asequibles útiles para diseñar sus paquetes de circuitos.


El Manual de referencia está compuesto estructuralmente por secciones en la periferia específica indicada en su encabezado. Cada capítulo se puede dividir en tres partes:


Descripción general , Introducción , Características : una descripción general de las capacidades de la periferia;


Descripción funcional , guía de uso o simplemente el bloque de la sección principal: una descripción textual detallada de los principios del dispositivo periférico y cómo usarlo;


Registros : descripción de los registros de control. En casos simples como GPIO o SPI, esto puede ser suficiente para comenzar a usar periféricos, pero a menudo aún tiene que leer las partes anteriores.


Cómo leer hojas de datos


Los datashitas por costumbre asustan con su volumen y una abundancia de palabras incomprensibles. De hecho, todo no da tanto miedo si conoces algunos trucos de la vida.


Instale un buen lector de PDF . Los datashits están escritos en la gloriosa tradición de las instrucciones en papel, es genial imprimirlos, colocarlos con marcadores de plástico y coserlos. El hipertexto en ellos se observa en pequeñas cantidades. Afortunadamente, al menos la estructura del documento está marcada, por lo que es muy necesario un buen lector con navegación conveniente.


Datashit no es el libro de texto de Straustrup, no tiene que leer todo lo que contiene . Si utilizó el consejo anterior, solo busque la sección en la barra de marcadores.


Las hojas de datos, especialmente los manuales de referencia , pueden no describir las capacidades de un chip en particular, sino toda la línea . Esto significa que la mitad, o incluso dos tercios de la información no está relacionada con su chip. Antes de estudiar los registros TIM7, consulte la Descripción general si tiene uno.


Es suficiente saber inglés en un nivel básico . Los datashits se componen a medias de términos desconocidos para el hablante nativo promedio, y la otra mitad se componen de estructuras de conexión simples. Todavía hay hermosas hojas de datos chinas en inglés chino, donde la mitad también son términos, y la segunda mitad es un conjunto aleatorio de palabras.


Si encuentra una palabra desconocida , no intente traducirla utilizando el diccionario inglés-ruso. Si la histéresis lo desconcierta , entonces traducir “histéresis” no lo calentará. Utilice Google, Stack Overflow, Wikipedia, foros, donde se explicará el concepto necesario en palabras simples con ejemplos .


La mejor manera de entender lo que lee es comprobar en acción . Por lo tanto, tenga a mano el tablero de depuración con el que está familiarizado, y preferiblemente dos, en caso de que, sin embargo, haya entendido mal algo y haya visto un humo mágico.


Es una buena costumbre tener una hoja de datos a mano cuando lees el tutorial de alguien o estudias la biblioteca de otra persona. Es posible, en él encontrará una solución más óptima para su problema. Y viceversa: si no puede comprender en la hoja de datos cómo funciona el registro, busque en Google: lo más probable es que alguien ya haya descrito todo en palabras simples o haya dejado un código comprensible en el github.


Vocabulario


Algunas palabras y anotaciones útiles que lo ayudan a acostumbrarse a las hojas de datos más rápido. Lo que se recordó en los últimos días, adiciones y correcciones son bienvenidas.


Electricidad
Vcc , Vdd - Plus, potencia
Vss , Vee - "menos", tierra
actual - actual
voltaje - voltaje
para hundir corriente - trabajar "tierra" para una carga externa
fuente de corriente - suministrar carga externa
pin de sumidero / fuente alto - pin con mayor tolerancia de carga


IO
H, alto - en el pin Vcc
L, bajo - en el pin Vss
Alta impedancia , Hi-Z , flotante : no hay nada en el pasador, "alta resistencia", en realidad es invisible para el mundo exterior.
pull up débil , pull down débil - resistencia incorporada pull-up / pull-down , un análogo aproximado de 50 kOhm (ver hoja de datos). Se usa, por ejemplo, para evitar que el pin de entrada cuelgue en el aire y cause falsos positivos. Débil , porque es fácil "matarlo".
Modo de salida push -pin-pin, en el que cambia entre SALIDA alta y baja - normal con Arduino.
drenaje abierto : designación del modo de salida, en el que el pin puede ser de baja o alta impedancia / flotante . Además, casi siempre este no es un drenaje abierto "real", hay diodos protectores, resistencias, etc. Es simplemente una designación del modo tierra / nada.
drenaje abierto verdadero , pero este ya es un drenaje abierto real: el pasador conduce directamente al suelo si está abierto, o está en el limbo si está cerrado. Esto significa que, si es necesario, se puede permitir un voltaje superior a Vcc, pero el máximo todavía se especifica en la hoja de datos en la sección Valores nominales / voltaje máximos absolutos .


Interfaces
en serie - conectado en serie
para encadenar : recolecte chips en una cadena mediante una conexión en serie, aumentando el número de salidas.
shift - shift, generalmente denota un cambio de bits. En consecuencia, para entrar y salir , recibir y transmitir datos bit a bit.
pestillo : una válvula que cubre el búfer mientras los bits se desplazan a través de él. Cuando se completa la transferencia, la válvula se abre, las brocas comienzan a funcionar.
para sincronizar : realice una transferencia a nivel de bit, cambie todos los bits a los lugares deseados.
doble búfer , registro de sombra , registro de precarga : designaciones del historial cuando el registro debe ser capaz de aceptar nuevos datos, pero retenerlo hasta cierto punto. Por ejemplo, para que el PWM funcione correctamente, sus parámetros (ciclo de trabajo, frecuencia) no deberían cambiar hasta que finalice el ciclo actual, pero ya se pueden transferir nuevos parámetros. En consecuencia, los actuales se mantienen en el registro de sombra , y los nuevos caen en el registro de precarga , que se registra en el registro de chip correspondiente.


Cada
preescalador - divisor de frecuencia
establecer un bit : establezca el bit en 1
para borrar / restablecer un bit : restablezca el bit a 0 ( restablecer - chip de hoja de datos STM)
para alternar un bit : cambie el valor del bit al opuesto (vea el ejemplo al comienzo del artículo)


Que sigue


En general, se planificó aquí una parte práctica con una demostración de tres proyectos sobre STM32 y STM8, realizados específicamente para este artículo utilizando hojas de datos, con bombillas, SPI, temporizadores, PWM e interrupciones:



Pero el texto es demasiado, por lo que los proyectos se envían a la segunda parte.


La habilidad de leer hojas de datos lo ayudará con su pasatiempo, pero es poco probable que reemplace la comunicación en vivo con otros entusiastas en foros y salas de chat. Para él, sin embargo, lo primero es apretar el idioma inglés. Por eso terminé de leerlo: un premio especial: dos lecciones gratuitas en Skyeng en el primer pago con el código HABR2 .

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


All Articles