Comenzar con stm32 o no repetir mis errores

imagen


Una breve historia sobre el rastrillo encontrado en la forma de conocer ARM en el ejemplo de stm32f103c8t6 y stm32l151rct6.


Mi conocimiento de los microcontroladores comenzó con AVR. Trabajé en ellos durante bastante tiempo, desde los tableros con pistas rayadas y ensamblador en AtmelStudio4 hasta el botín normal y los makefiles autoescritos para trabajar en el bloc de notas (en mi caso, KWrite) y la línea de comandos.


Pero es hora de golpear a sus hermanos mayores: ARM. La elección de una familia específica fue larga y pasiva (porque no había una necesidad directa, por lo que no tenía prisa), pero al final terminó en stm32f1, ya que era, quizás, la más popular. ¿Comprar un programador, un tablero de depuración como Discovery o una píldora azul? ¡Qué eres, soy un maestro en cámaras AVR! Cualquier tabla se puede hacer LUT, e incluso cuando lo necesite, sin demasiado kit de cuerpo. Por lo tanto, compro un stm32f103c8t6 desnudo y empiezo a chamanizar con el rastro de la placa. ¿Qué necesitaré? Al menos dos puertos deben llevarse a los peines ... ¡Uy, es inconveniente mostrar los puertos por completo. Bueno, obtendré 8 patas cada una: del puerto A el más joven (0-7), del B el más viejo (8-15). Aún así, por supuesto, LED y botones, como sin indicación y control. Esto es lo que me sorprende en las placas de depuración terminadas es la falta de al menos 2-3 LED y 1-2 botones que no entren en conflicto con nada. ¿Cómo se imaginan la depuración? Debajo de los botones PA8, se les pregunta a PA9, están ubicados convenientemente. USB, puentes BOOT0, BOOT1 y un conector de batería para relojes también son útiles. Y conectores para cuarzo, por lo que es muy hermoso (nunca he usado los conectores para cuarzo después). Para la fuente de alimentación, el controlador no necesita más de 3.6 V, y con USB viene 5 V. Es necesario instalar un estabilizador. Leí mucho cómo la gente elige estabilizadores con una baja caída de voltaje ... ¿por qué? La diferencia es de uno y medio voltios, pero hay suficiente roble 78l33. Y ahora el conector JTAG. El conector de programación de Atmel tenía un ISP10 o ISP6 estándar. Probablemente JTAG también sea una cosa estándar. Resulta que sí ... pero solo para un solo fabricante o incluso un dispositivo. Observamos el conector en st-link: hermoso, de 10 pines. Nos fijamos en algún programador para AVR: oops, ya de 20 pines. Buscamos en otro lado: más conectores incompatibles con el dios de los estándares incompatibles. Bueno, si es así, inventaremos el nuestro. En todo caso, el adaptador entre ellos no será más complicado que el adaptador ISP-6 a ISP-10. Todo parece estar listo, puedes hacer una tarifa. Resultó que se puede lograr un paso de 0,5 mm a nivel aficionado, ni siquiera tuve que pintar con un marcador.


Ahora cómo flashearlo. Como hay USB, es probable que pueda atravesarlo. Leí la hoja de datos, sí, no puede hacerlo a través de USB, pero puede hacerlo a través de UART1. Vaya, olvidé retirarlo. Además, también entra en conflicto con el botón, con el que se cuelga en PA9. Bueno, está bien, lo mostraré en publicaciones, pero todavía hay un botón más. Un poco de chamanismo y el tablero está listo e incluso definido en stm32flash.


imagen


imagen


Parece estar resuelto con hierro, es hora de pasar al código. Después de leer varios artículos en Internet, encontré un archivo listo en gcc-arm-none-eabi. Descubriré exactamente cómo configurar la secuencia de ensamblaje más adelante. Hasta ahora estoy haciendo hello-worlds en botones y LED. Dado que esta es mi primera relación con esta familia, no hay envoltorios como HAL que son solo trabajos manuales con registros. Sin embargo, este es un enfoque completamente natural, me parece, uno no podría mencionarlo. Me molesta un poco todo el tiempo sacar el poder y BOOT0 en el tablero, pero bueno, algún día haré un programador JTAG. Por extraño que parezca, no pisé el rastrillo con el reloj apagado. Recordó su juventud cuando escribió procesamiento 3D en TurboPascal. Aquí tengo una pantalla en ili9341 de raspberry pi y un controlador de hasta 72 MHz. Eso es lo que sucedió: hasta 200 puntos por modelo y 11 fps. Por supuesto, todas las matrices de transformación se cuentan en números de punto fijo.



En algún momento, quería hacer que un dispositivo portátil funcionara durante mucho tiempo con la batería. Miré la hoja de datos y me molesté: el famoso ARM en consumo es muchas veces peor que el mismo AVR-ok! Si el último (seleccionado en el primer controlador que resultó ser ATmega88p) tuvo un consumo de 0.8 μA, teniendo en cuenta las horas, entonces el primero, incluso en el modo de reposo más económico *, tenía 25 μA ± 1.4 μA en RTC. Esto no es bueno Sin embargo, stm32f103 no se posiciona como una serie económica. Miro el sitio web de STmicroelectronics para otras series de controladores y elijo la serie stm32l1: además de consumir aproximadamente 1 μA, también hay un sensor capacitivo y un controlador LCD. Es cierto que la frecuencia máxima es más baja, solo 36 MHz (o 24 MHz si se usa USB), pero sobreviviré de alguna manera. Se decidió: estoy tomando un par de stm32l151rct6 directamente desde 32 KB de RAM (también hay 256 KB de flash, pero difícilmente puedo imaginar cómo se puede martillar. A menos que sea una mierda absolutamente salvaje o archivos de datos).


  • ) no confunda los modos de suspensión (suspensión, detención) con apagado (espera)

Paralelamente, creo el programador st-link v2 desde el stm32f103 de repuesto, simplemente porque estoy cansado de jugar con BOOT0 y power, y es más rápido. Sin embargo, dejaré la programación de UART; nunca se sabe qué. También hubo un poco de chamanismo, pero nada sobresaliente. A menos que encontrar la línea de comando para openocd resultó ser un problema. Para las generaciones futuras la dejaré:


openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "init" -c "reset halt" -c "flash write_image erase "$(firmware).bin" 0x08000000" -c "reset run" -c "exit" 

Para stm32l151 es necesario, por supuesto, corregir el objetivo a "target / stm32l1.cfg"


imagen


imagen


Me adelantaré un poco en cronología, pero no volveré. Señores, ¡no ahorren en el grosor de la PCB! O al menos agregue accesorios, o no use componentes smd. Sucedió que en la placa del programador proporcioné solo dos agujeros de montaje en lugares aleatorios. Y los lugares estaban bastante lejos del conector JTAG. Y después de un tiempo noté que el programador es inestable. Eso funciona, luego no, luego a través de UART tienes que borrar la "víctima", luego recogerla. Resultó que la resistencia proveniente de la salida del controlador al conector se rompió. Simplemente se cayó de la almohadilla de contacto del cuerpo. Solde la resistencia. Luego soldaba el resto. Luego se dio cuenta de que incluso esa pequeña deformación de la placa que surgió durante la extracción del cable era suficiente para los desafortunados componentes. Como resultado, pegué una copia de seguridad justo al lado del conector. Mientras lo sostiene.


Como el lector ya ha adivinado, la programación también está en un editor de texto, mientras que la compilación y el firmware están en la consola. Naturalmente, la compra de una placa de depuración para l151 no me inspiró más que cualquier IDE. Frotando los rastros del rastrillo dejado por el primer tablero, engendro el segundo (contando al programador como el tercero, pero aún no es un tablero de depuración). Como iba a depurar un dispositivo de eficiencia energética, necesito preocuparme por el poder. No cambiaré el estabilizador 78l33, pero rompí su salida con un puente para poder pincharlo con un amperímetro (espero que sea igual para un microamperímetro, pero ahí está). Deje que los peines sean los mismos que en el tablero anterior: ¡compatibilidad! Bueno, un par de LEDs y botones, por supuesto. El rastrillo con UART1 brilla de manera atractiva, pero todavía pongo su conector y no lo consigo en la frente. Por supuesto, ya tengo JTAG, pero el seguro no me hará daño. Al igual que el anterior (y la placa del programador también), fue posible separar por un lado, incluso si no hay demasiados puentes.


Pero cuando el controlador se selló, surgió un problema. De alguna manera ingenuamente creí que debería haber una llave en el cuerpo del microcircuito que indicara la primera pata. ¿Quién esperaría que el bien hecho por ST haga DOS llaves, simétricamente? Entonces, ¿de qué lado soldarlo ahora? Pensando, decidí que no se trataba de claves, sino de profundizaciones tecnológicas. Nunca se sabe, por ejemplo, para posicionar el chip en la fabricación. O presione la base para llenar con plástico. Entonces necesitas navegar por la inscripción. Es lógico que la inscripción sea legible si el microcircuito se posiciona "estándar", es decir, cuando la primera pata está en la esquina superior izquierda. Entonces comenzó a soldar. Ya sea un defecto LUT o manos torcidas, pero el microcircuito estaba soldado torcidamente, lo noté a tiempo antes de soldarlo por completo. No importa, hay una vieja forma de soldar milpiés con una cuchilla de afeitar: no está humedecida por soldadura y es lo suficientemente delgada como para no doblarse demasiado. Resultó que las manos todavía no están lo suficientemente rectas, porque las piernas están dobladas. Pero no hacia arriba, sino hacia los lados, bueno, al menos no muy bien, y lograron enderezarlos de alguna manera. El segundo intento de soldar ya estaba bajo el microscopio, pero antes decidí corregir las patas. Y uno de ellos se interrumpió. ¿De qué están hechos, que no puedes doblar-doblar una vez? Los componentes de salida no tienen ese problema. Bueno, eso es todo, creo que el chip en el matrimonio tendrá que soldar otro. ¿Pero de repente esta no es una pierna crítica? Bueno, una conclusión de uso general, o una de las comidas. Hasta ahora lo he sellado sin él, y allí se verá. Esta vez logré soldar de manera uniforme, aunque la pierna se metió en I2C, con el que quería divertirme, pero al menos no en conectores vitales como USB, JTAG, UART o BOOT. Lo conecto, no funciona, los programadores no ven la placa. Durante algún tiempo, el chamán con piernas de soldadura, pero no ayuda. Un vistazo a la hoja de datos se topa con una imagen del controlador ubicado en algún lugar del sótano del documento. ¡Así es como podrías encontrar la inscripción BOKOM?! Es decir, si gira el controlador para que se lea la inscripción, el primer tramo estará en la esquina inferior izquierda. En el camino, resultó que uno de los "recesos tecnológicos" sigue siendo la clave. Es cierto que no explica cómo distinguirlo de simétrico ... Bueno, al menos alguna pista. Sueldo el controlador con un secador de cabello para no romper las conclusiones, y esta vez lo hago de lado. La salida interrumpida va exactamente a la salida TX de UART1, es decir, al conector de programación y depuración. Esto es completamente malo, pero antes de cambiar el controlador, al menos debe asegurarse de que con la orientación que supuse que al soldar para vivir, no lo mate con una conexión incorrecta. Conecto el programador, funciona. ¡Hurra! Quedan pequeñas cosas: suelde los conectores, diodos y otros arneses. Los comentarios sugirieron otra forma: sonar la tierra: generalmente están conectados dentro de la caja y no están ubicados completamente simétricos. Es cierto, dado el paso de las conclusiones, llegar a las conclusiones correctas puede ser difícil. Sea como fuere, esta es la forma más confiable.


No quiero trabajar con el controlador sin UART1, y es aún peor que ahora. Y si lo hace, es lo mismo cambiar, así que decido interpretar a un cirujano y hacer que el controlador sea una pierna protésica del cabello de MGTF. Justo a la mano se encuentra un buen pegamento conductor de electricidad, con el cual el cabello se adhiere decisivamente a la plataforma en el cuerpo del chip. Ese pegamento que se puso en las piernas vecinas se elimina sin piedad con un bisturí. ¿Y qué quiere entrar en la plataforma de medio milímetro y no meterse en las patas sobresalientes adyacentes? Lo compruebo, funciona. Hasta que se caiga, y para no caerse más tarde, vierta cianoacrilato.


Tal vez así es como hubiera usado esta tabla si la pierna no se hubiera caído nuevamente. Y está cubierto de pegamento. Sin embargo, es bastante suave y se corta con un bisturí, por lo que se limpia con éxito. Pero por alguna razón no quiero usar el mismo adhesivo conductor de electricidad por segunda vez. Intentaré soldar la pierna. La punta habitual del soldador no se metió dentro, pero el cono se incluyó en el kit (de hecho, el cono era originalmente el único, pero debido a sus inconvenientes obvios, fue reemplazado por el habitual, con un afilado en forma de cuña), que se desliza por completo en él. Por extraño que parezca, la "operación de trasplante" tuvo éxito y la pierna funcionó como debería (una fotografía de primer plano de la pierna en KDPV).


imagen


imagen


Entonces, la plancha está lista, es hora de ir al código. Sería bueno encontrar un ejemplo listo en gcc y la biblioteca CMSIS. ¿Qué es mejor para esto que el sitio web oficial del fabricante? Al final resultó que, STmicroelectronics no comparte mi optimismo. El hecho de que la navegación en el sitio se realice a través de un lugar indecente ya es familiar, ahora es difícil encontrar un sitio hecho por personas para personas. ¡Pero no permiten que se descargue nada del sitio! Tal vez lo permitirían después del registro, pero antes de eso no tenía el deseo de registrarme en ningún lado, y después de tal actitud hacia los desarrolladores, aún más. ¿Por qué demonios necesitas mi correo o qué exiges allí? ¿Recopilar datos personales, enviar spam? ¡Atraviesa el bosque y lo encontraré en el dominio público! Por cierto, me sorprendió un poco que el paquete correspondiente no estuviera en el repositorio, pero tal vez a ST se le ocurrió algún tipo de hemorroides con licencia. Por lo tanto, envío los rayos de diarrea a los vendedores que han ideado dicha política, y también para un sitio incómodo.


Sea como fuere, la biblioteca se encontró perfectamente en Internet (no daré ningún enlace, nunca se sabe qué pasará con el sitio). Una alternativa es descargar el entorno de desarrollo o CubeMX, donde están incrustadas estas bibliotecas. Es cierto, descargarlos desde el sitio oficial es igual de imposible, por lo que estamos viendo los de terceros e instalándolos en una máquina virtual, por si "sucede algo".


Descubrimos el hierro, y el tipo también. Es hora de finalmente tratar con el controlador. La primera sorpresa fue esperar al tratar de usar código de terceros en Discovery. Utilizaron el controlador stm32l152, que a primera vista es casi el mismo que el stm32l151 que instalé. Además de pequeñas diferencias, resultó que el módulo LCD no estaba instalado en el controlador "my". Un poco decepcionante, pero todavía no pensaba usarlo. Aunque tal diferencia podría haberse distinguido más claramente que una nota al pie en la hoja de datos. Por cierto, en una hoja de datos se recomienda en este caso conectar el pin VLCD a la fuente de alimentación, en mi foto la resistencia de 0 ohmios correspondiente no está soldada, pero en realidad la instalé de todos modos. Sin él, también funciona, pero no sobrecargue las conexiones internas. El comportamiento del reloj en tiempo real resultó ser más interesante. Obstinadamente no querían trabajar, y en Internet escriben simplemente "hazlo, hazlo, funciona". Pero no funciona. En algunos lugares, sin embargo, se mencionaron "problemas conocidos con RTC en esta serie". Sea como fuere, el reloj todavía terminó, aunque solo en el generador RC incorporado. Los intentos de bloquear el reloj de cuarzo llevaron a la espera interminable por el bit de preparación LSE. Traté de verificar si las patas del microcircuito se habían caído de las pistas en el tablero y las puse en modo GPIO normal. El cuarzo de alta frecuencia se cayó. WTF?! En general, estos dos cuarzos no quieren trabajar juntos, pero al menos por separado funcionan como mínimo.


Y luego adiviné: el superpegamento, que estaba lleno con la mitad del controlador (es líquido, no se puede aplicar con precisión, y quién hubiera pensado ...) da una fuga y el cuarzo interfiere con sus puntas. Bueno, no es difícil quitar el pegamento del exterior, pero después de todo está adormecido incluso debajo del chip. Y si hay suficientes fugas para el cuarzo, afectará el consumo. Estoy buscando en Google, que las personas eliminan el cianoacrilato. Ofrece agua tibia (¿qué ???) y dimetilsulfóxido. No creo en el agua tibia, así que compro DMSO. Después de más de una hora de encontrar una gota de químico en la superficie del pegamento, no noté la diferencia. Pero notaron el cuarzo y comenzaron a trabajar más o menos normalmente (¿me pregunto por qué? ¿El dimexido reemplazó la humedad absorbida por el pegamento?). Sin embargo, esto no me convenció, y los restos de pegamento siguen siendo una molestia ... por nada que esté en la parte inferior del tablero y no sea particularmente visible. Por cierto, el agua tibia que lavé con dimexido no afectó el pegamento (no me sorprende). Descubrí que existe un removedor de pegamento, en el mismo tubo que el pegamento, solo en púrpura. Bueno, al menos debería funcionar! Resultó que puede funcionar y funciona, pero su consistencia se asemeja a la crema agria y simplemente no cabe debajo del microcircuito. Bueno, ¿de qué te sirve, borrador? Afuera, puedo limpiarlo. Última oportunidad: rara vez se menciona la acetona. Tengo un poco de miedo por las piezas de plástico, pero reemplazarlas es fácil. Pongo acetona en un frasco de vidrio, tiro una tabla allí y la dejo toda la noche. A la mañana siguiente resultó que la acetona realmente funciona, ¡y cómo! No había rastro de pegamento. Además, el botón de uno de los botones se disolvió. Curiosamente, el segundo sobreviviente, probablemente, estaba hecho de plástico más estable. Me sorprendió un poco que el otro plástico permaneciera intacto, incluso las inscripciones sobrevivieron. Bueno, excelente, pero el botón puede ser reemplazado.


Ahora logramos lanzar RTC desde el reloj de cuarzo, tocar el modo de suspensión y comunicarnos con otros periféricos. Y también, para que fuera completamente tímido, aplicó firmas al tablero. Pero no con un marcador (¿de repente se baña de nuevo en solventes?) Pero se rasca con un bisturí. ¡Por siglos!


Bueno, para las generaciones futuras, dejaré ejemplos de código para ambos controladores, junto con bibliotecas, archivos MAKE y más. Solo queda instalar gcc-arm-none-eabi, openocd, stm32flash y otras bagatelas.
stm32f103
stm32l151


En los comentarios, se les aconsejó varias veces que no realizaran LUT y ordenaran la fabricación de tableros a profesionales. Para la creación de prototipos, como aquí, no veo ninguna razón. Otra cosa es si necesita una placa multicapa, o un paso aún más pequeño, o un estuche BGA, o algo más que es difícil de hacer en casa. Y, por supuesto, en la fabricación de la versión final del dispositivo y la replicación. No es bueno si el cliente desmonta el caso soldado de PCB, y descubrirá una tabla aserrada torcida sin máscara y con puentes de MGTF.


Conclusiones:


  1. Puede crear tablas de depuración para usted si lo desea, no son peores que las compradas. Pero el programador del depurador es aún mejor comprar si no es demasiado caro. Por supuesto, puede hacerlo, pero no cambiará el esquema y, de ser así, no será mejor que la compra. Más barato, muy probablemente, también. A menos que el controlador superfluo permanezca o con un problema de entrega.
  2. No se olvide del conector de programación de respaldo UART1, bueno, al mismo tiempo, los puentes BOOT0, BOOT1. Además de la programación real, es bastante conveniente depurar un programa usando UART.
  3. Hay dos claves en el caso LQFP64, una de las cuales es falsa. Tendrá que navegar hasta la inscripción para mirar con los pies a la izquierda.
  4. Soldar componentes con un pequeño paso es solo bajo un microscopio. De lo contrario, es difícil determinar si todo ha desaparecido y si hay "mocos". Bueno, ya sea en equipos "profesionales" como un secador especial, pasta de soldadura, etc. No sé aquí, estoy escribiendo sobre tecnología de aficionados.
  5. No guardar en grosor de PCB. Se dobla y esto puede ser suficiente para dañar las resistencias smd y, probablemente, los condensadores. Esto no da miedo a la salida, y los componentes con conclusiones dobladas (transistores, microcircuitos) probablemente sobrevivirán.
  6. Hacer conectores para cuarzo es una pérdida de tiempo. No los cambiará, así que solo suelde en el tablero.
  7. Beber un milpiés con una cuchilla de afeitar es solo en el caso más extremo, cuando no hay secador de pelo. De lo contrario, el riesgo de dañarlo es demasiado grande.
  8. ¡Incluso si la pierna se ha caído del microcircuito, se puede restaurar! Incluso cuando el paso es de 0,5 mm. Lo principal es usar soldadura, no pegamento conductor.
  9. ¡Nunca llene el chip con pegamento de cianoacrilato (súper pegamento)! No tiene las características eléctricas y mecánicas adecuadas.
  10. La acetona es la más adecuada para eliminar el superpegamento de las áreas difíciles de alcanzar. Se disuelve por completo. Lo principal es asegurarse de que los componentes circundantes no se vean afectados. Desde lugares no difíciles de alcanzar se pueden eliminar mecánicamente.

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


All Articles