Hace varios años conocí los microcontroladores rusos de Milander. Corría el año 2013, cuando los ingenieros discutían intensamente los primeros resultados del Programa Federal Target “Desarrollo de componentes electrónicos básicos y radioelectrónica” para el período 2008-2015. En ese momento, el controlador K1986BE9x (núcleo Cortex-M3) ya se había lanzado y acababa de aparecer el controlador 1986BE1T (núcleo Cortex-M1). En la caja de plástico, LQFP-144, tenía la designación K1986BE1QI (aviación) en la documentación, y en el propio chip la designación MDR32F1QI. En la web del fabricante lleva el sufijo “avia”, ya que tiene interfaces específicas para la industria aeronáutica (ARINC 429, MIL_STD_1553).
Sorprendentemente, en el momento de la distribución de estos controladores, la empresa Milander preparó kits de depuración y una biblioteca de subrutinas para trabajar con periféricos, "pero sin garantías ni obligaciones adicionales en cuanto a la corrección de la biblioteca". La biblioteca es similar a la biblioteca de periféricos estándar de STMicroelectronics. En general, todos los controladores ARM integrados en el núcleo Cortex-M tienen mucho en común. Por este motivo, la familiarización con los nuevos controladores rusos avanzó rápidamente. Y aquellos que compraron kits de depuración de marca, recibieron soporte técnico durante su uso.
Kit de depuración para microcontrolador 1986BE1T, © Milander
Sin embargo, con el tiempo comenzaron a aparecer "enfermedades infantiles" de nuevos microcircuitos y bibliotecas. Los ejemplos de prueba del firmware funcionaron sin problemas visibles, pero con modificaciones importantes, se produjeron fallas y errores. El primer "trago" en mi práctica fueron fallas inexplicables en el funcionamiento del controlador CAN. Un año después, se descubrió un problema con el módulo en el controlador 1986BE1T (aviación) de una revisión anterior.
Una característica desagradable fue que era necesario trabajar y solucionar errores no en placas de depuración, sino en placas prototipo de dispositivos que estaban planificados para la producción en serie en fábrica. Normalmente no había nada allí excepto el conector JTAG. La conexión con un analizador lógico era difícil e inconveniente y, por lo general, no había LED ni pantallas. Por esta razón apareció en mi cabeza la idea de crear mi propia placa de depuración.
Por un lado, en el mercado había kits de depuración de marca, así como excelentes placas base de la empresa LDM-Systems de Zelenograd. Por otro lado, los precios de estos productos son asombrosos y la funcionalidad básica sin tarjetas de expansión no cumple con las expectativas. Una placa con un controlador soldado y un conector pin no me interesa. Y los tableros más interesantes son caros.
Placa de desarrollo MILANDR LDM-HELPER-K1986BE1QI-FULL, © LDM Systems
La empresa Milander tiene una política de precios y marketing única. Por lo tanto, es posible obtener muestras gratuitas de algunos microcircuitos, pero esto solo está disponible para personas jurídicas y está asociado con una búsqueda burocrática. En general, los microcircuitos en una carcasa de metal y cerámica son dorados en sentido literal y figurado. Por ejemplo, un controlador 1986BE1T cuesta entre 14 y 24 mil rublos en Moscú. El chip de memoria estática 1645RU6U cuesta desde 15000 rublos. Y este es el orden de precios de todos los productos. Como resultado, incluso los institutos de investigación especializados con encargos gubernamentales ahorran dinero y evitan esos precios. Los microcircuitos en una caja de plástico para uso civil son mucho más baratos, pero no están disponibles en proveedores populares. Además, me parece que la calidad de los microcircuitos en una caja de plástico es peor que la de los "dorados". Por ejemplo, no pude ejecutar el controlador K1986BE1QI a 128 MHz sin aumentar el parámetro de latencia del flash. Al mismo tiempo, la temperatura de este controlador subió a 40-50C. Pero el controlador 1986BE1T (“dorado”) comenzó a 128 MHz sin configuraciones adicionales y permaneció frío. Él es realmente bueno.
Microcontrolador “dorado” 1986BE1T, (c) Milander
Tuve suerte de que todavía se puede comprar un microcontrolador en una caja de plástico al por menor en LDM Systems, y todos los diagramas de la placa están disponibles gratuitamente. Lo malo es que en el sitio web en la foto del controlador se puede ver una marca que dice que esta es la cuarta revisión de 4, es decir. con defectos. Pensé durante mucho tiempo si comprar o no comprar. Pasaron varios años así...
La idea de crear un tablero de depuración no ha desaparecido por ningún lado. Poco a poco, fui formando todos los requisitos y pensé en cómo colocarlo todo en una sola placa para que fuera compacto y económico. Al mismo tiempo, pedí los componentes que faltaban a los chinos. No tenía prisa, lo hice todo por mí mismo. Los proveedores chinos son notoriamente descuidados: tuve que pedir lo mismo en diferentes lugares para conseguir todo lo que necesitaba. Además, algunos de los chips de memoria resultaron ser usados, aparentemente soldados de dispositivos rotos. Esto volvió a atormentarme más tarde.
Comprar un microcontrolador Milander K1986BE1QI (aire) no es tarea fácil. En la misma tienda Chip and Dip, en la sección "Artículos para pedir", encontré solo K1986BE92QI por 740 rublos, pero no me convenía. La única opción es comprar una revisión no nueva de LDM-Systems por 2000 rublos. Como no encontré repuesto en ningún otro lugar, decidí comprar el que tenía. Para mi grata sorpresa, me vendieron un controlador nuevo fabricado en diciembre de 2018, revisión 6+ (1820). Pero el sitio todavía tiene una foto antigua, y en el momento de escribir este artículo el controlador no está disponible...
Microcontrolador K1986BE1QI (aviación) en embalaje tecnológico, (c) Foto del autor
Principales características técnicas de mi placa de depuración. MDB1986 siguiente
- programador-depurador incorporado, compatible con J-Link y CMSIS-DAP;
- memoria estática de 4 Mbit (256 k x 16, 10 ns);
- chip de memoria flash de 64 Mbit, Winbond 25Q64FVSIG;
- Transceptor de interfaz RS-232 con líneas RTS y CTS;
- interfaces y conectores para Ethernet, USB, CAN;
- Controlador de pantalla de 7 segmentos MAX7221;
- conector de clavija para trabajar con MKIO (MIL_STD_1553) y ARINC429;
- fototransistor Everlight PT17-21C;
- cinco LED de colores, un botón de reinicio y dos botones de usuario;
- la fuente de alimentación al puerto USB es de 5 voltios;
- dimensiones de la placa de circuito impreso 100 x 80, mm
Me gustaron las placas de la serie STM-Discovery porque tienen un programador-depurador incorporado: ST-Link. La marca ST-Link solo funciona con controladores de STMicroelectronics, pero hace un par de años fue posible actualizar el firmware en ST-Link y obtener el depurador OB (integrado) SEGGER J-Link. Legalmente, existe una restricción sobre el uso de dicho depurador solo con placas STMicroelectronics, pero en realidad el potencial no está limitado. Por lo tanto, al tener un OB J-Link, puede tener un programador-depurador incorporado en la placa de depuración. Observo que los productos LDM-Systems utilizan el convertidor CP2102 (Usb2Uart), que solo puede flashear.
Microcontroladores STM32F103C8T6, reales y no tan reales, (c) Foto del autor
Entonces, fue necesario comprar el STM32F103C8T6 original, ya que el firmware propietario no funcionará correctamente con el clon. Dudé de esta tesis y decidí probar el controlador CS32F103C8T6 de la empresa china CKS. No tengo quejas sobre el controlador en sí, pero el firmware propietario ST-Link no funcionó en él. J-Link funcionó parcialmente: se detectó el dispositivo USB, pero el programador no realizó sus funciones y recordó constantemente que estaba "defectuoso".
Error al ejecutar el depurador en un controlador no original
No estaba satisfecho con esto y primero escribí el firmware para hacer parpadear el LED y luego implementé la solicitud IDCODE usando el protocolo JTAG. El programador ST-Link que tenía en la placa Discovery y el programa ST-Link Utility flashearon CS32F103C8T6 sin problemas, al final me convencí de que mi placa estaba funcionando. Para mi deleite, el controlador de destino K1986BE1QI (aviación) emitió alegremente su IDCODE a través de la línea TDO.
Oscilograma de una línea de señal TDO con una respuesta IDCODE codificada, (c) Foto del autor
Entonces, el puerto SWD fue útil para depurar el depurador y verificar IDCODE
Había una opción con un depurador.
Operación exitosa del depurador incorporado J-Link STLink V2
Cuando todos los componentes clave de la futura placa de desarrollo estuvieron disponibles, entré en Eagle CAD y descubrí que no estaban en la biblioteca de elementos. No había ningún lugar adonde ir; tuve que dibujarlos yo mismo. Al mismo tiempo, hice puntos de montaje para la memoria, un conector HanRun para Ethernet y agregué marcos para resistencias y condensadores. El archivo del proyecto y la biblioteca de componentes se pueden encontrar
Diagrama esquemático de la placa de desarrollo MDB1986.
La placa se alimenta de una fuente de CC de 5 voltios obtenida del puerto USB. Hay un total de dos puertos USB tipo B en la placa. Uno es para el programador, el segundo es para el controlador K1986BE1QI. La placa puede funcionar desde cualquiera de estas fuentes o desde ambas simultáneamente. La regulación de carga y protección de la línea eléctrica más simple se implementa utilizando diodos Schottky, en el circuito D2 y D3 (SS24). También en el diagrama se pueden ver los fusibles autorregenerables F1 y F2 a 500 mA. Las líneas de señal del puerto USB están protegidas por un conjunto de diodos USBLC6-2SC6.
El circuito programador-depurador ST-Link es conocido por muchos; se puede encontrar en la documentación de las placas STM32-Discovery y otras fuentes. Para el firmware inicial del clon ST-Link/J-Link-OB/DAP (opcional), saqué las líneas SWDIO (PA13), SWCLK (PA14), GND. Mucha gente usa UART para firmware y se ve obligada a desconectar los puentes de BOOT. Pero encuentro que SWD es más conveniente y este protocolo permite la depuración.
Casi todos los componentes de la placa funcionan con 3.3 voltios, que provienen del regulador de voltaje AMS1117-3.3. Para suprimir las interferencias electromagnéticas y las sobretensiones, se utilizan filtros LC de condensadores y bobinas de choque de la serie BLM31PG.
Por separado, vale la pena mencionar el controlador de pantalla de 7 segmentos MAX7221. Según la especificación, la alimentación recomendada es de 4 a 5.5 voltios, y el nivel de señal alto (lógico) es de al menos 3.5V (0.7 x VCC), con una alimentación de 5V. Para el controlador K1986BE1QI (aviación), la salida de una unidad lógica corresponde a un voltaje de 2.8 a 3.3 V. Obviamente existe una discrepancia entre los niveles de señal que puede interferir con el funcionamiento normal. Decidí alimentar el MAX7221 a 4V y reducir los niveles de señal a 2.8V (0.7 x 4 = 2.8). Para hacer esto, el diodo D4 (RS1A o FR103) se instala en serie en el circuito de alimentación del controlador. La caída de voltaje total es de 0.9 V (diodo Schottky de 0.3 V y diodo de 0.6 V) y todo funciona.
La mayoría de los puertos del microcontrolador K1986BE1QI (aviación) son compatibles con señales de hasta 5V. Por lo tanto, no hay ningún problema al utilizar el transceptor CAN MCP2551, que también funciona con 5V. El chip MAX232 se indica como un transceptor RS-3232 en el diagrama, pero en realidad usé SN65C3232D de Texas Instruments, porque Funciona desde 3.3 V y proporciona velocidades de hasta 1 Mbit/s.
La placa contiene 4 resonadores de cuarzo: uno para el depurador (8 MHz) y tres para el microcontrolador de destino K1986BE1QI (aviación) con clasificaciones de 32.768 kHz, 16 MHz, 25 MHz. Estos son componentes necesarios, porque Los parámetros del oscilador RC incorporado se encuentran en un amplio rango de 6 a 10 MHz. Para el funcionamiento del controlador Ethernet integrado se requiere una frecuencia de 25 MHz. Por alguna razón, en la web de Milandra (quizás por error) dice que la caja de plástico no tiene Ethernet. Pero nos basaremos en las especificaciones y los hechos.
Un incentivo importante para crear mi propia placa de desarrollo fue la oportunidad de trabajar con el bus del sistema externo EBC (controlador de bus externo), que es esencialmente un puerto paralelo. El microcontrolador K1986BE1QI (avión) le permite conectarse y trabajar con chips de memoria externos y dispositivos periféricos, por ejemplo, ADC, FPGA, etc. Las capacidades del bus del sistema externo son bastante amplias: puede trabajar con RAM estática, ROM y NAND Flash de 8, 16 y 32 bits. Para leer/escribir datos de 32 bits, el controlador puede realizar automáticamente 2 operaciones correspondientes para chips de 16 bits y 8 operaciones para chips de 4 bits. Obviamente, una operación de E/S de 32 bits se completará más rápidamente con un bus de datos de 32 bits. Las desventajas incluyen la necesidad de que el programa funcione con datos de 32 bits y la placa tendrá que colocar 32 pistas.
Chips de RAM estática, usados (adivina cuál está defectuoso)
Una solución equilibrada es utilizar chips de memoria de 16 bits. Resulta que tenía chips de Integrated Silicon Solutions Inc. en stock. (ISSI IS61LV25616AL, 16 x 256k, 10 ns, 3.3V). Por supuesto, la empresa Milander tiene sus propios chips de memoria estática.
Bus externo y modo StandAloneEl microcontrolador K1986BE1QI (avión) tiene un modo StandAlone único, que está diseñado para acceso externo directo a controladores Ethernet y MKIO (MIL_STD_1553) a través de un bus externo, con el núcleo en estado de reinicio, es decir. no utilizado. Este modo es conveniente para procesadores y FPGA que no tienen Ethernet y/o MKIO.
El diagrama de conexión es el siguiente:
- MCU del bus de datos (D0-D15) => SRAM (E/S0-I/O15),
- bus de direcciones MCU(A1-A18) => SRAM(A0-A17),
- controlar MCU (nWR, nRD, PortC2) => SRAM (NOSOTROS, OE, CE),
- Las SRAM (UB, LB) se conectan o se ponen a tierra a través de una resistencia.
La línea CE está conectada a la fuente de alimentación a través de una resistencia; los pines para muestrear el byte de la MCU (BE0-BE3) no se utilizan. Debajo del spoiler, proporciono el código para inicializar los puertos y el controlador de bus externo.
Inicialización de puertos y controlador EBC (controlador de bus externo)
void SRAM_Init (void)
{
EBC_InitTypeDef EBC_InitStruct = { 0 };
EBC_MemRegionInitTypeDef EBC_MemRegionInitStruct = { 0 };
PORT_InitTypeDef initStruct = { 0 };
RST_CLK_PCLKcmd (RST_CLK_PCLK_EBC, ENABLE);
PORT_StructInit (&initStruct);
//--------------------------------------------//
// DATA PA0..PA15 (D0..D15) //
//--------------------------------------------//
initStruct.PORT_MODE = PORT_MODE_DIGITAL;
initStruct.PORT_PD_SHM = PORT_PD_SHM_ON;
initStruct.PORT_SPEED = PORT_SPEED_FAST;
initStruct.PORT_FUNC = PORT_FUNC_MAIN;
initStruct.PORT_Pin = PORT_Pin_All;
PORT_Init (MDR_PORTA, &initStruct);
//--------------------------------------------//
// Address PF3-PF15 (A0..A12), A0 - not used. //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_ALTER;
initStruct.PORT_Pin = PORT_Pin_4 | PORT_Pin_5 |
PORT_Pin_6 | PORT_Pin_7 |
PORT_Pin_8 | PORT_Pin_9 |
PORT_Pin_10 | PORT_Pin_11 |
PORT_Pin_12 | PORT_Pin_13 |
PORT_Pin_14 | PORT_Pin_15;
PORT_Init (MDR_PORTF, &initStruct);
//--------------------------------------------//
// Address PD3..PD0 (A13..A16) //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_OVERRID;
initStruct.PORT_Pin = PORT_Pin_0 | PORT_Pin_1 |
PORT_Pin_2 | PORT_Pin_3;
PORT_Init (MDR_PORTD, &initStruct);
//--------------------------------------------//
// Address PE3, PE4 (A17, A18) //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_ALTER;
initStruct.PORT_Pin = PORT_Pin_3 | PORT_Pin_4;
PORT_Init (MDR_PORTE, &initStruct);
//--------------------------------------------//
// Control PC0,PC1 (nWE,nOE) //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_MAIN;
initStruct.PORT_Pin = PORT_Pin_0 | PORT_Pin_1;
PORT_Init (MDR_PORTC, &initStruct);
//--------------------------------------------//
// Control PC2 (nCE) //
//--------------------------------------------//
initStruct.PORT_PD = PORT_PD_DRIVER;
initStruct.PORT_OE = PORT_OE_OUT;
initStruct.PORT_FUNC = PORT_FUNC_PORT;
initStruct.PORT_Pin = MDB_SRAM_CE;
PORT_Init (MDR_PORTC, &initStruct);
//--------------------------------------------//
// Initialize EBC controler //
//--------------------------------------------//
EBC_DeInit();
EBC_StructInit(&EBC_InitStruct);
EBC_InitStruct.EBC_Mode = EBC_MODE_RAM;
EBC_InitStruct.EBC_WaitState = EBC_WAIT_STATE_3HCLK;
EBC_InitStruct.EBC_DataAlignment = EBC_EBC_DATA_ALIGNMENT_16;
EBC_Init(&EBC_InitStruct);
EBC_MemRegionStructInit(&EBC_MemRegionInitStruct);
EBC_MemRegionInitStruct.WS_Active = 2;
EBC_MemRegionInitStruct.WS_Setup = EBC_WS_SETUP_CYCLE_1HCLK;
EBC_MemRegionInitStruct.WS_Hold = EBC_WS_HOLD_CYCLE_1HCLK;
EBC_MemRegionInitStruct.Enable_Tune = ENABLE;
EBC_MemRegionInit (&EBC_MemRegionInitStruct, EBC_MEM_REGION_60000000);
EBC_MemRegionCMD(EBC_MEM_REGION_60000000, ENABLE);
// Turn ON RAM (nCE)
PORT_ResetBits (MDR_PORTC, MDB_SRAM_CE);
}
El microcontrolador del paquete LQFP-144 y la memoria del paquete TSOP-44 tienen muchos pines asociados y ocupan mucho espacio en la placa de circuito impreso. Al tener experiencia en la resolución de problemas de optimización en el campo de la economía, me resultó obvio que primero era necesario colocar estos microcircuitos en la placa. En varias fuentes me he encontrado con críticas elogiosas sobre
Un elemento importante de una placa de circuito impreso es la serigrafía. La placa de desarrollo no sólo debe tener etiquetas para los componentes electrónicos, sino que también deben estar etiquetados todos los conectores. En la parte posterior del tablero coloqué tablas con las funciones de los puertos del controlador (principal, alternativo, anulado, real). Encargué la producción de placas de circuito impreso en China a la conocida oficina PCBWay. No lo elogiaré porque la calidad es buena. Pueden hacerlo mejor, con tolerancias más estrictas, pero
Placas de circuito impreso MDB1986 fabricadas, (c) Foto del autor
Tuve que soldar los componentes "de rodillas" con un soldador de 40 vatios y soldadura POS-61, porque rara vez sueldo, 1 o 2 veces al año, y la pasta de soldar se había secado. También tuve que cambiar el controlador chino CS32F103 por el STM32F103 original y luego reemplazar también la memoria. En general, ahora estoy completamente satisfecho con el resultado, aunque aún no he comprobado el funcionamiento de RS-232 y CAN.
Placa de depuración MDB1986 en funcionamiento: brilla y calienta, (c) Foto del autor
En la web de Milandra puedes encontrar suficientes
Pensado en MilandraEn Rusia se está desarrollando la microelectrónica y en este proceso la empresa Milander desempeña un papel destacado. Están apareciendo nuevos microcontroladores interesantes, por ejemplo, 1986BE81T y Elektrosila con interfaces SpaceWire y MKIO (los mismos que en 1986BE1 y, posiblemente, con los mismos problemas), etc. Pero los estudiantes, profesores e ingenieros civiles corrientes no pueden comprar estos microcircuitos. Esto significa que la comunidad de ingenieros no podrá identificar rápidamente errores y problemas con este chip. Me parece que primero es necesario producir microcircuitos en una caja de plástico, distribuirlos a todas las partes interesadas y, después de la aprobación (latín approbatio - aprobación, reconocimiento) por parte de los especialistas, pueden preparar una revisión en una caja de metal-cerámica con protección contra todos los factores terribles. Espero que en un futuro próximo TODOS estemos satisfechos con los nuevos proyectos anunciados en las exposiciones.
El tablero de depuración que desarrollé puede ser repetido, modificado y utilizado por cualquier persona en el proceso educativo. Primero que nada, hice el tablero yo mismo, pero quedó tan bien que
K1986BE1QI (air) es un controlador muy interesante con interfaces únicas que se puede utilizar en universidades para enseñar a los estudiantes. Creo que después de corregir los errores identificados en el controlador y pasar las pruebas de certificación, ¡el controlador volará en el verdadero sentido de la palabra!
Fuente: habr.com