
Há alguns anos, conheci os microcontroladores russos da empresa Milandr. Foi em 2013, quando os engenheiros discutiam fervorosamente os primeiros resultados do programa federal "Desenvolvimento da Base de Componentes Eletrônicos e da Radioeletrônica" de 2008 a 2015. Naquela época, já havia sido lançado o controlador K1986BE9x (núcleo Cortex-M3) e acabara de surgir o controlador 1986BE1T (núcleo Cortex-M1). Este último, em um invólucro plástico LQFP-144, tinha na documentação a designação K1986BE1QI (aero) e a própria microchip tinha a designação MDR32F1QI. No site do fabricante, ele possui o sufixo "aero", pois possui interfaces específicas para a indústria aeronáutica (ARINC 429, MIL_STD_1553).
É surpreendente, mas na época da disseminação desses controladores, a empresa "Milandr" havia preparado conjuntos de desenvolvimento e uma biblioteca de subprogramas para interagir com a periferia, "mas sem quaisquer garantias adicionais e obrigações quanto à correção da biblioteca". A biblioteca é semelhante à Standard Peripheral Library da STMicroelectronics. De maneira geral, todos os controladores ARM construídos sobre o núcleo Cortex-M têm muitas semelhanças. Por essa razão, o aprendizado sobre os novos controladores russos foi rápido. E para aqueles que adquiriam os conjuntos de desenvolvimento oficiais, havia suporte técnico durante o uso.

Conjunto de desenvolvimento para o microcontrolador 1986BE1T, © Milandr
No entanto, com o tempo, começaram a aparecer as "doenças infantis" dos novos chips e bibliotecas. Exemplos de teste das firmwares funcionavam sem problemas visíveis, mas ao realizar modificações significativas, erros e falhas começaram a surgir. O primeiro "sinal" na minha prática foram falhas inexplicáveis no funcionamento do controlador CAN. Um ano depois, no controlador 1986BE1T (aero) da primeira revisão, foi detectado um problema com o módulo . Em resumo, todas as revisões desses microcontroladores até 2016 eram limitadamente válidas. Muito tempo e nervos foram gastos na identificação desses problemas, cuja confirmação agora pode ser encontrada em .
Uma característica desagradável foi que trabalhar e resolver problemas não era feito em placas de teste, mas em placas de protótipos de dispositivos que estavam planejados para fabricação em série. Fora o conector JTAG, normalmente não havia mais nada. Conectar um analisador lógico era difícil e inconveniente, e geralmente não havia LEDs ou telas. Por essa razão, surgiu em minha mente a ideia de criar minha própria placa de teste.
Por um lado, havia kits de depuração de marcas no mercado, assim como placas excelentes da empresa LDM-Systems de Zelenograd. Por outro lado, os preços desses produtos eram assustadores, e a funcionalidade básica sem placas de expansão não atendia às expectativas. Uma placa com um controlador soldado e conector de pino não me interessava. E placas mais interessantes tinham preços altos.

Placa de depuração MILANDR LDM-HELPER-K1986BE1QI-FULL, © LDM Systems
A política de preços e marketing da empresa 'Milandr' é peculiar. Há a possibilidade de obter amostras gratuitas de alguns microchips, mas isso é acessível apenas a pessoas jurídicas e está associado a um verdadeiro labirinto burocrático. No geral, os microchips em carcaça metal-cerâmica são caros, tanto em sentido literal quanto figurado. Por exemplo, o controlador 1986ВЕ1Т custa em Moscovo de 14 a 24 mil rublos. O microchip de memória estática 1645РУ6У custa a partir de 15 mil rublos. E essa é a faixa de preço para todos os produtos. Como resultado, até institutos de pesquisa especializados com encomendas do governo economizam e fogem desses preços. Microchips em carcaça plástica para uso civil são significativamente mais baratos, mas não estão disponíveis nos fornecedores populares. Além disso, a qualidade dos microchips em carcaça plástica, ao meu ver, é inferior aos 'dourados'. Por exemplo, não consegui iniciar o controlador K1986BE1QI a 128MHz sem aumentar o parâmetro de latência do flash. Ao mesmo tempo, a temperatura desse controlador subiu para 40-50°C. Por outro lado, o controlador 1986BE1T ('dourado') iniciou a 128MHz sem ajustes adicionais e permaneceu frio. Ele realmente é bom.

'Microcontrolador dourado 1986BE1T, (c) Milandr
Tive a sorte de encontrar o microcontrolador em um invólucro de plástico à venda na LDM Systems, e todos os esquemas da placa estão disponíveis publicamente. O problema é que no site, na foto do controlador, há uma marca que indica que esta é a revisão 4 de 2014, ou seja, tem defeitos. Pensei muito se comprava ou não. E assim se passaram alguns anos...
A ideia de criar uma placa de depuração nunca desapareceu. Gradualmente, formei todos os requisitos e pensei em como colocar tudo em uma única placa, para que ficasse compacta e barata. Paralelamente, fazia pedidos aos fornecedores chineses para os componentes que faltavam. Eu não tinha pressa – fazia tudo para mim. Os fornecedores chineses são conhecidos pela desorganização – tive que encomendar o mesmo item em diferentes locais para conseguir tudo o que precisava. Além disso, algumas das memórias acabaram sendo usadas – provavelmente retiradas de equipamentos quebrados. Isso me trouxe problemas mais tarde.
Comprar o microcontrolador Milandr K1986BE1QI (aeronáutico) não é uma tarefa simples. Na mesma loja 'Chip e Dip', na seção 'Itens sob encomenda', encontrei apenas o K1986BE92QI por 740 rublos, mas não servia para mim. A única opção era comprar da LDM-Systems uma versão antiga por 2000 rublos. Como não consegui encontrar uma substituição em nenhum outro lugar, decidi comprar o que estava disponível. Para minha grata surpresa, venderam-me um controlador novinho, fabricado em dezembro de 2018, revisão 6+ (1820). E no site ainda estava a foto antiga, e no momento em que escrevi o artigo, não havia controladores disponíveis...

Microcontrolador K1986BE1QI (aeronáutico) em embalagem tecnológica, (c) Foto do autor
Principais características técnicas da minha placa de depuração MDB1986 seguintes:
- depurador-programador integrado, compatível com J-Link e CMSIS-DAP;
- memória estática de 4 Mbit (256k x 16, 10 ns);
- chip de memória flash de 64 Mbit, Winbond 25Q64FVSIG;
- transceptor do interface RS-232 com linhas RTS e CTS;
- interfaces e conectores para Ethernet, USB, CAN;
- controlador de display de 7 segmentos MAX7221;
- conector de pinos para trabalho com MKIO (MIL_STD_1553) e ARINC429;
- fototransistor Everlight PT17-21C;
- cinco LEDs coloridos, botão de reinício e dois botões personalizados;
- alimentação pela porta USB 5 volts;
- dimensões da placa de circuito impresso 100 x 80, mm
Eu gostava das placas da série STM-Discovery porque elas possuem um programador-debuador integrado – ST-Link. O ST-Link original funciona apenas com controladores da STMicroelectronics, mas há alguns anos surgiu a possibilidade de atualizar o firmware do ST-Link e obter o SEGGER J-Link OB (on-board) Debugger. Legalmente, há restrições para o uso desse depurador apenas com placas da STMicroelectronics, mas, na prática, o potencial não é limitado. Assim, com o J-Link OB, é possível ter um programador-debuador integrado na placa de teste. Quero destacar que nos produtos da 'LDM-Systems' é utilizado o conversor CP2102 (Usb2Uart), que pode apenas gravar.

Controladores STM32F103C8T6, originais e não tão originais, (c) Foto do autor
Portanto, foi necessário comprar um STM32F103C8T6 original, já que os firmwares originais não funcionariam corretamente com o clone. Eu duvidei dessa afirmação e decidi testar o controlador CS32F103C8T6 da empresa chinesa CKS. Não tenho queixas sobre o controlador em si, mas o firmware original do ST-Link não funcionou nele. O J-Link funcionou parcialmente – o dispositivo USB foi reconhecido, mas o programador não executava suas funções e constantemente informava que estava 'defective'.

Erro ao trabalhar com o depurador em um controlador não original
Não me contentei com isso e escrevi, primeiramente, um firmware para fazer um LED piscar, e depois implementei a consulta IDCODE pelo protocolo JTAG. O programador ST-Link, que eu tinha na placa Discovery, e o programa ST-Link Utility gravaram o CS32F103C8T6 sem problemas. No final, fiquei convencido de que minha placa estava funcionando. Para minha alegria, o controlador de destino K1986BE1QI (aéreo) rapidamente forneceu seu IDCODE pela linha TDO.

Osciloscópio da linha de sinal TDO com a resposta IDCODE codificada, (c) Foto do autor

O conector SWD foi útil para depurar o próprio depurador e verificar o IDCODE
Restava a opção com o depurador . Compilar o projeto a partir do código-fonte da ARM não é uma tarefa simples, eu peguei o projeto de , e depois ainda tentei o DAP42. Infelizmente, o Keil uVision travava e não queria trabalhar com eles. Por fim, substituí o chip do depurador pelo original STM32F103C8T6 e não voltei mais a esse assunto.

Funcionamento bem-sucedido do depurador integrado J-Link STLink V2
Quando todos os componentes-chave da placa de depuração futura estavam disponíveis, fui para o Eagle CAD e descobri que não estavam na biblioteca de componentes. Não havia para onde fugir – tive que desenhá-los eu mesmo. Aproveitei para criar os locais para a memória, o conector HanRun para Ethernet, e para os resistores e capacitores adicionei molduras. O arquivo do projeto e a biblioteca de componentes podem ser encontrados .
Esquema da placa de depuração MDB1986
A placa é alimentada por uma fonte de corrente contínua de 5 volts, obtida da porta USB. Ao todo, a placa possui duas portas USB Type-B. Uma – para o programador, a outra – para o controlador K1986BE1QI. A placa pode operar com qualquer uma dessas fontes ou com ambas ao mesmo tempo. O ajuste mais simples da carga e a proteção das linhas de alimentação são implementados com diodos Schottky, no esquema D2 e D3 (SS24). Também no esquema, pode-se ver os fusíveis automáticos F1 e F2 de 500mA. As linhas de sinal da porta USB são protegidas por um arranjo de diodos USBLC6-2SC6.
O esquema do depurador/programador ST-Link é bem conhecido e pode ser encontrado na documentação das placas STM32-Discovery e em outras fontes. Para a programação inicial do clone ST-Link/J-Link-OB/DAP (a escolha), eu saí com as linhas SWDIO (PA13), SWCLK (PA14), GND. Muitos usam UART para programar e acabam mexendo nos jumpers BOOT. Mas para mim, é mais conveniente usar SWD, além disso, esse protocolo permite a depuração.
Quase todos os componentes da placa são alimentados por 3.3 volts, fornecidos pelo regulador de tensão AMS1117-3.3. Para suprimir interferências eletromagnéticas e picos de corrente, são utilizados filtros LC feitos de capacitores e indutores da série BLM31PG.
Vale a pena mencionar o driver do display de 7 segmentos MAX7221. Segundo a especificação, a alimentação recomendada é de 4 a 5,5 volts, e o nível de sinal alto (lógica '1') deve ser de pelo menos 3,5V (0,7 x VCC) quando alimentado com 5V. No controlador K1986BE1QI (aéreo), a saída de lógica '1' corresponde a uma tensão de 2,8 a 3,3V. É evidente que há uma incompatibilidade nos níveis de sinal, o que pode comprometer o funcionamento normal. Decidi alimentar o MAX7221 com 4V e reduzir os níveis de sinal para 2,8V (0,7 x 4 = 2,8). Para isso, um diodo D4 (RS1A ou FR103) foi instalado em série no circuito de alimentação do driver. Assim, a queda de tensão total é de 0,9V (diodo Schottky 0,3V e diodo 0,6V), e tudo funciona.
A maioria das portas do microcontrolador K1986VE1QI (avião) é compatível com sinais de até 5V. Portanto, não há problemas em usar o transceptor CAN MCP2551, que também opera a partir de 5V. Para o transceptor RS-232, o diagrama indica o chip MAX3232, mas na verdade eu usei o SN65C3232D da Texas Instruments, pois este funciona com 3.3V e garante uma velocidade de até 1Mbit/s.
Na placa estão posicionados 4 ressonadores de quartzo – um para o depurador (8MHz) e três para o microcontrolador K1986VE1QI (avião) com valores de 32.768kHz, 16MHz, 25MHz. Estes são componentes necessários, pois os parâmetros do gerador RC integrado estão em amplos limites de 6 a 10 MHz. A frequência de 25MHz é necessária para o funcionamento do controlador Ethernet integrado. No site da Milandr (possivelmente por engano) é indicado que o Ethernet em case plástico não está presente. Mas vamos nos basear na especificação e nos fatos.
Um importante impulso para a criação da minha placa de desenvolvimento foi a possibilidade de trabalhar com o barramento de sistema externo EBC (controlador de barramento externo), que é essencialmente uma porta paralela. O microcontrolador K1986VE1QI (avião) permite conectar e trabalhar com chips de memória externos e dispositivos periféricos, como ADC, FPGA, etc. As capacidades do barramento de sistema externo são bastante amplas – é possível trabalhar com SRAM estática de 8, 16 e 32 bits, ROM e NAND Flash. Para a leitura/escrita de dados de 32 bits, o controlador pode executar automaticamente 2 operações correspondentes para chips de 16 bits e 4 operações para 8 bits. É evidente que a operação de entrada/saída de 32 bits será executada mais rapidamente com um barramento de dados de 32 bits. Entre as desvantagens, pode-se mencionar a necessidade de um programa para operar com dados de 32 bits e a necessidade de traçar 32 trilhas na placa.

Chips de SRAM estática, usados (adivinhe qual tem defeito)
Uma solução equilibrada é o uso de chips de memória de 16 bits. Eu tinha em mãos chips da Integrated Silicon Solutions Inc. (ISSI IS61LV25616AL, 16 x 256k, 10 ns, 3.3V). Claro, a empresa 'Milandr' possui seus próprios chips de memória estática. , mas eles são muito caros e inacessíveis. Como alternativa, existem os compatíveis Samsung K6R4016V1D. Eu mencionei anteriormente que os chips se mostraram usados e a unidade que instalei inicialmente apresentou falhas e valores caóticos na 15ª linha de dados. Levei vários dias para encontrar erros de hardware, e a satisfação foi ainda maior quando substituí o chip danificado por um funcional. De qualquer forma, a velocidade de operação com a memória externa deixa a desejar.
Barramento externo e modo StandAloneO microcontrolador К1986ВЕ1QI (aéreo) possui um modo StandAlone exclusivo, projetado para acesso direto externo aos controladores Ethernet e MKIO (MIL_STD_1553) através do barramento externo, enquanto o núcleo está em estado de reinicialização, ou seja, não está em uso. Este modo é conveniente para processadores e FPGAs que não possuem Ethernet e/ou MKIO.
O esquema de conexão é o seguinte:
- barramento de dados MCU(D0-D15) => SRAM(I/O0-I/O15),
- barramento de endereços MCU(A1-A18) => SRAM(A0-A17),
- controle MCU(nWR,nRD,PortC2) => SRAM (WE,OE,CE),
- SRAM(UB,LB) conectado ou puxado para o terra através de um resistor.
A linha CE é puxada para a alimentação através de um resistor, as saídas para seleção de byte do MCU(BE0-BE3) não são utilizadas. Abaixo, apresento o código de inicialização das portas e do controlador do barramento externo.
Inicialização das portas e do controlador EBC (controlador de barramento 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);
//--------------------------------------------//
// DADOS 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);
//--------------------------------------------//
// Endereço PF3-PF15 (A0..A12), A0 - não utilizado. //
//--------------------------------------------//
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);
//--------------------------------------------//
// Endereço 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);
//--------------------------------------------//
// Endereço PE3, PE4 (A17, A18) //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_ALTER;
initStruct.PORT_Pin = PORT_Pin_3 | PORT_Pin_4;
PORT_Init (MDR_PORTE, &initStruct);
//--------------------------------------------//
// Controle PC0,PC1 (nWE,nOE) //
//--------------------------------------------//
initStruct.PORT_FUNC = PORT_FUNC_MAIN;
initStruct.PORT_Pin = PORT_Pin_0 | PORT_Pin_1;
PORT_Init (MDR_PORTC, &initStruct);
//--------------------------------------------//
// Controle 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);
//--------------------------------------------//
// Inicializa o controlador EBC //
//--------------------------------------------//
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);
// Ativar RAM (nCE)
PORT_ResetBits (MDR_PORTC, MDB_SRAM_CE);
}
O microcontrolador em encapsulamento LQFP-144 e a memória em encapsulamento TSOP-44 possuem muitos pinos interconectados e ocupam muito espaço na placa de circuito impresso. Com experiência em resolução de problemas otimizacionais em economia, ficou claro para mim que esses chips deveriam ser colocados na placa como prioridade. Em várias fontes, encontrei elogios sobre . Eu baixei a versão de teste e consegui exportar meu projeto do Eagle CAD para lá somente após remover quase todos os componentes. Infelizmente, mesmo com 10 elementos, o programa TopoR não conseguiu posicioná-los na placa. Primeiro, todos os componentes foram colocados em um canto, e depois distribuídos ao longo das bordas. Essa solução não me satisfez, e passei bastante tempo fazendo o roteamento da placa manualmente no ambiente familiar do Eagle CAD.
Um elemento importante da placa de circuito impresso é a serigrafia. Na placa de teste, deve haver não apenas etiquetas para os componentes eletrônicos, mas também todas as conexões devem estar identificadas. No verso da placa, coloquei tabelas de referência com as funções das portas do controlador (principal, alternativa, redefinida, real). A fabricação das placas de circuito impresso encomendei na China, em uma empresa conhecida, a PCBWay. Não vou elogiar demais, pois a qualidade é boa. Eles podem fazer melhor, com tolerâncias menores, mas .

As placas de circuito impresso MDB1986, (c) Foto do autor
Soldering the components had to be done 'on the fly' with a 40-watt soldering iron and POS-61 solder, because I rarely solder, 1-2 times a year, and the solder paste had dried up. I also had to replace the Chinese controller CS32F103 with the original STM32F103, and then also replace the memory. In general, I am now fully satisfied with the result, although I haven't tested the operation of RS-232 and CAN yet.

A placa de teste MDB1986 em funcionamento — acendendo e aquecendo, (c) Foto do autor
No site 'Milandra' é possível encontrar bastante da série 1986BE9 (núcleo Cortex-M3), mas para o microcontrolador K1986BE1QI (aeroespacial) não vejo nada a esse respeito. Depois de revisar os materiais publicados, manuais e trabalhos de laboratório para instituições de ensino superior, fico feliz em ver que profissionais estão sendo preparados em todo o país para trabalhar com controladores russos. A maioria dos materiais didáticos se concentra em trabalhar com portas de entrada e saída, temporizadores, ADC, DAC, SPI, UART. Diferentes ambientes de desenvolvimento IDE (Keil, IAR, CodeMaster) são utilizados. Em alguns lugares, os programadores usam registradores CMSIS, enquanto em outros utilizam a Biblioteca MDR. É necessário mencionar o recurso , que contém muitos artigos de programadores praticantes. E, claro, não devemos esquecer do .
Pensamento sobre MilandrA microeletrônica na Rússia está se desenvolvendo, e a empresa 'Milandr' desempenha um papel significativo nesse processo. Novos e interessantes microcontroladores estão surgindo, como o 1986BE81T e 'Electrosila' com interfaces SpaceWire e MKIO (similar ao 1986BE1 e, possivelmente, com os mesmos problemas), etc. Mas para estudantes, professores e engenheiros civis comuns, comprar esses chips não é viável. Isso significa que a comunidade de engenheiros não conseguirá identificar rapidamente os erros e problemas desse chip. Creio que primeiro é necessário produzir chips em caixa de plástico, distribuí-los entre todos os interessados e, após a validação por especialistas (lat. approbatio - aprovação, reconhecimento), preparar uma revisão em uma caixa de metal com proteções contra todos os fatores adversos. Espero que no futuro próximo todos nós sejamos surpreendidos com os novos projetos anunciados nas exposições.
A placa de teste que desenvolvi pode ser reproduzida, modificada e utilizada por qualquer pessoa no processo de aprendizado. Em primeiro lugar, fiz a placa para mim, mas ficou tão boa que .
O K1986BE1QI (aeroespacial) é um controlador muito interessante com interfaces únicas, que pode ser utilizado nas instituições de ensino superior para ensinar alunos. Acredito que, após a correção dos erros identificados no controlador e a realização de testes de certificação, o controlador será utilizado no sentido literal da palavra!
Fonte: habr.com
