Há alguns anos, conheci os microcontroladores russos da Milandr. Era 2013, quando os engenheiros discutiram vigorosamente os primeiros resultados do Programa de Metas Federais "Desenvolvimento de componentes eletrônicos básicos e eletrônicos de rádio" para 2008-2015. Naquela época, o controlador K1986BE9x (núcleo Cortex-M3) já havia sido lançado e o controlador 1986BE1T (núcleo Cortex-M1) havia acabado de aparecer. Ele, na caixa de plástico LQFP-144, tinha a designação K1986BE1QI (aviação) na documentação e a designação MDR32F1QI no próprio chip. No site do fabricante, possui o sufixo “air”, pois possui interfaces específicas para a indústria aeronáutica (ARINC 429, MIL_STD_1553).
Surpreendentemente, no momento da distribuição desses controladores, a empresa Milander preparou kits de depuração e uma biblioteca de sub-rotinas para trabalhar com periféricos, "mas sem quaisquer garantias e obrigações adicionais quanto à exatidão da biblioteca". A biblioteca é semelhante à Standard Peripheral Library da STMicroelectronics. Em geral, todos os controladores ARM construídos no núcleo Cortex-M têm muito em comum. Por esse motivo, o conhecimento dos novos controladores russos foi rápido. E para quem comprou kits de depuração proprietários, foi fornecido suporte técnico durante o uso.
Kit de depuração para microcontrolador 1986BE1T, © Milandr
No entanto, com o tempo, começaram a aparecer "doenças infantis" de novos chips e bibliotecas. Exemplos de teste de firmware funcionaram sem problemas visíveis, mas com falhas de modificação significativas e erros choveram. A primeira “engolida” na minha prática foram falhas inexplicáveis no controlador CAN. Um ano depois, um problema com o módulo foi descoberto no controlador 1986BE1T (ar) de uma revisão anterior
Uma característica desagradável era que era necessário trabalhar e lidar com erros não em placas de depuração, mas em placas de protótipos de dispositivos planejados para produção em série na fábrica. Além do conector JTAG, geralmente não havia nada lá. Era difícil e inconveniente conectar-se a um analisador lógico e geralmente não havia LEDs e telas. Por esse motivo, surgiu na minha cabeça a ideia de criar meu próprio quadro de depuração.
Por um lado, havia kits de depuração de marca no mercado, bem como placas maravilhosas da LDM-Systems de Zelenograd. Por outro lado, os preços desses produtos levam ao estupor e a funcionalidade básica sem placas de expansão não atende às expectativas. Uma placa com um controlador soldado e um cabeçote de pino não me interessa. E placas mais interessantes são caras.
Placa de desenvolvimento MILANDR LDM-HELPER-K1986BE1QI-FULL, © LDM Systems
A empresa "Milandr" tem uma política de preços e marketing única. Assim, é possível obter amostras de alguns microcircuitos gratuitamente, mas isso está disponível apenas para pessoas jurídicas e está associado a uma busca burocrática. Em geral, os microcircuitos em uma embalagem de metal-cerâmica são dourados no sentido literal e figurado. Por exemplo, o controlador 1986BE1T custa em Moscou de 14 a 24 mil rublos. O chip de memória estática 1645RU6U custa a partir de 15000 rublos. E esta é a ordem dos preços de todos os produtos. Como resultado, até mesmo institutos de pesquisa especializados com encomendas estatais economizam dinheiro e fogem de tais preços. Os chips em uma caixa de plástico para uso civil são significativamente mais baratos, mas não estão disponíveis em fornecedores populares. Além disso, a qualidade dos chips em uma caixa de plástico, ao que me parece, é pior do que "ouro". Por exemplo, não consegui executar o controlador K1986BE1QI a 128MHz sem aumentar a configuração de latência do flash. Ao mesmo tempo, a temperatura deste controlador subiu para 40-50C. Mas o controlador 1986BE1T (“ouro”) inicializou a 128 MHz sem configurações adicionais e permaneceu frio. Ele é muito bom.
Microcontrolador "Gold" 1986BE1T, (c) Milandr
Tive sorte porque o microcontrolador em uma caixa de plástico ainda pode ser comprado no varejo da LDM Systems e todas as placas de circuito estão disponíveis gratuitamente. O ruim é que no site na foto do controlador é visível uma marcação que diz que esta é a 4ª revisão de 2014, ou seja, com defeitos. Por muito tempo pensei - comprar ou não comprar. Assim se passaram vários anos...
A ideia de criar uma placa de depuração não desapareceu em lugar nenhum. Aos poucos, formei todos os requisitos e pensei em como colocar tudo isso em uma placa, para que ficasse compacto e barato. Paralelamente, encomendei os componentes que faltavam dos chineses. Não tive pressa - fiz tudo sozinho. Os fornecedores chineses são notórios por desleixo - tive que pedir a mesma coisa em lugares diferentes para conseguir tudo o que precisava. Além disso, alguns dos chips de memória eram de segunda mão - obviamente soldados de dispositivos quebrados. Isso me atingiu mais tarde.
Comprar um microcontrolador Milandr K1986BE1QI (aviação) não é uma tarefa fácil. Na mesma loja Chip and Dip, na seção “Posições sob encomenda”, encontrei apenas K1986BE92QI por 740 rublos, mas não me agradou. A única opção é comprar uma revisão não nova da LDM-Systems por 2000 rublos. Como não consegui encontrar um substituto em nenhum outro lugar, decidi comprar o que havia. Para minha agradável surpresa, eles me venderam um novo controlador de lançamento de dezembro de 2018, revisão 6+ (1820). E o site ainda tem uma foto antiga, e no momento em que escrevo o controller não está disponível...
Microcontrolador K1986BE1QI (aviação) em embalagem tecnológica, (c) Foto do autor
Principais especificações técnicas da minha placa de desenvolvimento MDB1986 seguinte:
- depurador-programador integrado compatível com J-Link e CMSIS-DAP;
- memória estática de 4Mbit (256k x 16, 10 ns);
- chip de memória flash 64Mbit, Winbond 25Q64FVSIG;
- Transceptor de 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 trabalhar com MCIO (MIL_STD_1553) e ARINC429;
- fototransistor Everlight PT17-21C;
- cinco LEDs coloridos, um botão de reset e dois botões de usuário;
- é alimentado por uma porta USB de 5 volts;
- placa de circuito impresso dimensões 100 x 80, mm
Gostei das placas da série STM-Discovery porque elas têm um programador-depurador embutido - ST-Link. O ST-Link proprietário funciona apenas com controladores STMicroelectronics, mas há alguns anos tornou-se possível atualizar o firmware no ST-Link e obter o depurador SEGGER J-Link OB (on-board). Legalmente, existe uma restrição para usar tal depurador apenas com placas STMicroelectronics, mas na verdade o potencial não é limitado. Assim, tendo o J-Link OB, você pode ter um programador-depurador embutido na placa de depuração. Observo que os produtos LDM-Systems usam o conversor CP2102 (Usb2Uart), que só pode piscar.
Microcontroladores STM32F103C8T6, reais e não, (c) Foto do autor
Portanto, foi necessário comprar o STM32F103C8T6 original, pois o firmware da marca não funcionará corretamente com o clone. Duvidei dessa tese e resolvi experimentar o controlador CS32F103C8T6 da empresa chinesa CKS. Não tenho reclamações sobre o controlador em si, mas o firmware proprietário do ST-Link não funcionou nele. O J-Link funcionou parcialmente - o dispositivo USB foi detectado, mas o programador não executou suas funções e constantemente lembrava que estava "com defeito".
Erro ao executar o depurador em um controlador não original
Não me acalmei com isso e primeiro escrevi o firmware para piscar o LED e depois implementei a solicitação IDCODE usando o protocolo JTAG. O programador ST-Link que eu tinha na placa Discovery e o programa ST-Link Utility piscaram CS32F103C8T6 sem problemas.Como resultado, verifiquei se minha placa estava funcionando. Para minha alegria, o controlador de destino K1986BE1QI (aviação) emitiu alegremente seu IDCODE pela linha TDO.
Oscilograma da linha de sinal TDO com resposta codificada IDCODE, (c) Foto do autor
Portanto, a porta SWD foi útil para depurar o próprio depurador e verificar o IDCODE
Havia uma opção com um depurador
Operação bem-sucedida do depurador integrado J-Link STLink V2
Quando todos os principais componentes da futura placa de depuração estavam disponíveis, entrei no Eagle CAD e descobri que eles não estavam na biblioteca de elementos. Não há para onde ir - eu mesmo tive que desenhá-los. Ao mesmo tempo, fiz assentos para a memória, o conector HanRun para Ethernet e adicionei quadros para os resistores e capacitores. O arquivo do projeto e a biblioteca de componentes podem ser encontrados
Diagrama esquemático da placa de depuração MDB1986
A placa é alimentada por uma fonte DC de 5 volts da porta USB. Existem duas portas USB tipo B na placa. Um é para o programador, o segundo é para o controlador K1986BE1QI. A placa pode funcionar a partir de qualquer uma dessas fontes ou ambas ao mesmo tempo. O ajuste de carga mais simples e proteção de linhas de energia são implementados em diodos Schottky, nos circuitos D2 e D3 (SS24). Também no diagrama você pode ver os fusíveis F1 e F2 auto-recuperáveis a 500mA. As linhas de sinal da porta USB são protegidas pelo conjunto de diodos USBLC6-2SC6.
O circuito depurador-programador ST-Link é conhecido por muitos, pode ser encontrado na documentação das placas STM32-Discovery e outras fontes. Para o firmware primário do clone ST-Link / J-Link-OB / DAP (opcional), trouxe as linhas SWDIO (PA13), SWCLK (PA14), GND. Muitos usam UART para firmware e são forçados a puxar os jumpers de BOOT. Mas o SWD é mais conveniente para mim, além deste protocolo permitir a depuração.
Quase todos os componentes da placa são alimentados por 3.3 volts, que vêm do regulador de tensão AMS1117-3.3. Para suprimir interferências eletromagnéticas e surtos de corrente, são utilizados filtros LC de capacitores e bobinas da série BLM31PG.
Separadamente, vale a pena mencionar o driver de exibição de 7 segmentos MAX7221. De acordo com a especificação, a alimentação recomendada é de 4 a 5.5 volts, e o nível de sinal alto (lógico um) não é inferior a 3.5V (0.7 x VCC), quando alimentado por 5V. Para o controlador K1986BE1QI (aviação), a saída de uma unidade lógica corresponde a uma tensão de 2.8 a 3.3V. Obviamente, há uma incompatibilidade nos níveis de sinal que pode interromper a operação normal. Decidi alimentar o MAX7221 de 4V e diminuir os níveis de sinal para 2.8V (0.7 x 4 = 2.8). Para fazer isso, um diodo D4 (RS1A ou FR103) é instalado em série no circuito de alimentação do driver. A queda de tensão total é de 0.9 V (diodo Schottky de 0.3 V e diodo de 0.6 V) e tudo funciona.
A maioria das portas do microcontrolador K1986BE1QI (aviação) é compatível com sinais de até 5V. Portanto, o uso do transceptor CAN MCP2551, que também opera a partir de 5V, não causa problemas. O diagrama mostra o chip MAX232 como o transceptor RS-3232, mas na verdade eu usei o SN65C3232D da Texas Instruments, porque funciona a partir de 3.3V e fornece velocidade de até 1Mbit/s.
Existem 4 ressonadores de quartzo na placa - um para o depurador (8 MHz) e três para o microcontrolador de destino K1986BE1QI (aviação) com valores nominais de 32.768 kHz, 16 MHz, 25 MHz. Estes são componentes necessários, porque. os parâmetros do gerador RC embutido estão em uma ampla faixa de 6 a 10 MHz. A frequência de 25 MHz é necessária para a operação do controlador Ethernet integrado. Por alguma razão, o site da Milandra (talvez por engano) afirma que não há Ethernet na caixa de plástico. Mas vamos confiar na especificação e nos fatos.
Um incentivo importante para criar sua própria placa de depuração foi a oportunidade de trabalhar com um barramento de sistema externo EBC (controlador de barramento externo), que é essencialmente uma porta paralela. O microcontrolador K1986BE1QI (aviação) permite conectar e trabalhar com chips de memória externos e dispositivos periféricos, como ADC, FPGA, etc. As possibilidades do barramento de sistema externo são bastante grandes - você pode trabalhar com RAM estática de 8 bits, 16 bits e 32 bits, ROM e NAND Flash. Para leitura / gravação de dados de 32 bits, o controlador pode executar automaticamente 2 operações correspondentes para microcircuitos de 16 bits e 8 operações para microcircuitos de 4 bits. Obviamente, uma operação de E/S de 32 bits será a mais rápida com um barramento de dados de 32 bits. As desvantagens incluem a necessidade de o programa operar com dados de 32 bits e a placa terá que colocar 32 faixas.
Chips SRAM, usados (adivinhe qual deles está com defeito)
Uma solução equilibrada é usar chips de memória de 16 bits. Acabei com os chips da Integrated Silicon Solutions Inc. (ISSI IS61LV25616AL, 16x256k, 10ns, 3.3V). Claro, a empresa "Milandr" tem seus próprios chips de memória estática
Barramento Externo e Modo StandAloneO microcontrolador K1986BE1QI (aviação) possui um modo autônomo exclusivo, projetado para acesso externo direto aos controladores Ethernet e MCIO (MIL_STD_1553) por meio de um barramento externo, enquanto o núcleo está no estado de redefinição, ou seja, não usado. Este modo é útil para processadores e FPGAs que não possuem Ethernet e/ou MCIO.
O diagrama 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) são conectados ou puxados para o aterramento através de um resistor.
A linha CE é alimentada por meio de um resistor, os pinos de busca de byte MCU (BE0-BE3) não são usados. Sob o spoiler, dou o código para inicializar as portas e o controlador de barramento externo.
Inicialização de portas e 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);
//--------------------------------------------//
// 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);
}
O microcontrolador no pacote LQFP-144 e a memória no pacote TSOP-44 têm muitos pinos conectados e ocupam muito espaço na PCB. Tendo experiência na resolução de problemas de otimização no campo da economia, era óbvio para mim que esses microcircuitos deveriam ser colocados no quadro em primeiro lugar. Em várias fontes, encontrei críticas elogiosas sobre
A serigrafia é um elemento importante da placa de circuito impresso. Na placa de depuração, não só deve haver assinaturas para componentes eletrônicos, mas todos os conectores devem ser assinados. No verso da placa, coloquei as tabelas-lembretes com as funções das portas do controlador (principal, alternativa, substituída, atual). Encomendei a fabricação de placas de circuito impresso na China no conhecido escritório PCBWay. Não vou elogiar, porque a qualidade é boa. Eles podem fazer melhor com tolerâncias menores, mas
Placas de circuito impresso fabricadas MDB1986, (c) Foto do autor
Tive que dessoldar os componentes “no joelho” com um ferro de solda de 40 watts e solda POS-61, porque raramente soldo, 1 a 2 vezes por ano, e a pasta de solda secou. Eu também tive que mudar o controlador CS32F103 chinês para o STM32F103 original e também substituir a memória. No geral, agora estou totalmente satisfeito com o resultado, embora ainda não tenha verificado o funcionamento do RS-232 e do CAN.
Placa de depuração MDB1986 em operação — brilha e aquece, (с) Foto do autor
No site "Milandra" você encontra bastante
Pensando em MilandraA microeletrônica na Rússia está se desenvolvendo, e a empresa "Milandr" desempenha um papel significativo nesse processo. Novos microcontroladores interessantes aparecem, por exemplo, 1986BE81T e Elektrosila com interfaces SpaceWire e MKIO (o mesmo que em 1986BE1 e, possivelmente, com os mesmos problemas), etc. Mas para estudantes comuns, professores e engenheiros civis, não é realista comprar esses microcircuitos. Isso significa que a comunidade de engenharia não conseguirá identificar rapidamente os erros e problemas desse chip. Parece-me que primeiro é necessário produzir microcircuitos em uma caixa de plástico, distribuí-los a todos os interessados, e somente após a aprovação (latim approbatio - aprovação, reconhecimento) os especialistas podem preparar uma revisão em uma caixa de metal-cerâmica com proteção contra todos os fatores terríveis. Espero que num futuro próximo TODOS fiquemos satisfeitos com os novos projetos anunciados nas feiras.
Qualquer pessoa pode repetir, modificar e usar o quadro de depuração que desenvolvi no processo educacional. Em primeiro lugar, fiz uma prancha para mim, mas ficou tão bem que
K1986BE1QI (ar) é um controlador muito interessante com interfaces exclusivas que podem ser usadas em universidades para ensinar alunos. Acho que depois de corrigir os erros identificados no controlador e passar nos testes de certificação, o controlador voará no verdadeiro sentido da palavra!
Fonte: habr.com