Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)

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.

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
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 MCIO (canal de troca de informações multiplex). Em geral, todas as revisões desses microcontroladores até 2016 eram de uso limitado. Muito tempo e nervos foram gastos na identificação desses problemas, cuja confirmação agora pode ser encontrada em listas de erros (Errata).

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.

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
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.

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
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...

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
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.

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
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".

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
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.

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
Oscilograma da linha de sinal TDO com resposta codificada IDCODE, (c) Foto do autor

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
Portanto, a porta SWD foi útil para depurar o próprio depurador e verificar o IDCODE

Havia uma opção com um depurador CMSIS-DAP (porta de acesso de depuração). Construir um projeto a partir de fontes ARM não é uma tarefa fácil, peguei o projeto de X893, e também tentei o DAP42. Infelizmente, Keil uVision ficou preso e não quis trabalhar com eles. Como resultado, substituí o chip depurador por um proprietário STM32F103C8T6 e nunca mais voltei a esse problema.

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
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 Eu tenho no GitHub.

Diagrama esquemático da placa de depuração MDB1986Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)

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.

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
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 série 1645RUmas eles são muito caros e não estão disponíveis. Como alternativa, existem Samsung K6R4016V1D compatíveis com pinos. Mencionei anteriormente que os ICs eram de segunda mão e a cópia que instalei estava inicialmente vacilante e errática na 15ª linha de dados. Demorou vários dias para encontrar erros de hardware, e o sentimento de satisfação foi maior quando troquei o chip danificado por um que funcionasse. Seja como for, a velocidade de trabalho com memória externa deixa muito a desejar.

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 CAD TopoR (Roteador Topológico). Baixei a versão de teste e só consegui exportar meu projeto do Eagle CAD quando removi quase todos os componentes. Infelizmente, o programa TopoR não me ajudou a colocar nem 10 elementos no quadro. Primeiro, todos os componentes foram colocados em um canto e depois dispostos ao longo da borda. Essa opção não me satisfez e passei muito tempo traçando a placa manualmente no familiar ambiente Eagle CAD.

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 por uma taxa.

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
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.

Desenvolvimento de uma placa de depuração para K1986BE1QI (aviação)
Placa de depuração MDB1986 em operação — brilha e aquece, (с) Foto do autor

No site "Milandra" você encontra bastante materiais de aprendizagem para controladores de aprendizagem Série 1986BE9 (núcleo Cortex-M3), mas para o microcontrolador K1986BE1QI (aviação), não vejo nada lá. Depois de revisar os materiais publicados lá, manuais e trabalhos de laboratório para universidades, fico feliz que o pessoal esteja sendo treinado em todo o país para trabalhar com controladores russos. A maioria dos materiais de treinamento está preparada para trabalhar com portas de E/S, temporizadores, ADC, DAC, SPI, UART. Diferentes IDEs são usados ​​(Keil, IAR, CodeMaster). Em algum lugar eles programam usando registradores CMSIS e em algum lugar eles usam a Biblioteca MDR. O recurso deve ser mencionado Iniciar Milandr, que contém muitos artigos de programadores praticantes. E, claro, não devemos esquecer Fórum Milandra.

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 resolvi compartilhar com todos.

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

Adicionar um comentário