Parechji anni fà, aghju cunnisciutu cù i microcontrollers russi da Milander. Era 2013, quandu l'ingegneri discutevanu vigorosamente i primi risultati di u prugramma Federale Target "Sviluppu di basa di cumpunenti elettronichi è elettronica radio" per 2008-2015. À quellu tempu, u controller K1986BE9x (Cortex-M3 core) era digià statu liberatu, è u controller 1986BE1T (Cortex-M1 core) era appena apparsu. In u casu di plastica, LQFP-144, hà avutu a designazione K1986BE1QI (aviazione) in a documentazione, è nantu à u chip stessu a designazione MDR32F1QI. In u situ web di u fabricatore hà u suffissu "avia", postu chì hà interfacce specifichi per l'industria aeronautica (ARINC 429, MIL_STD_1553).
Sorprendentemente, à u mumentu di a distribuzione di questi cuntrolli, a cumpagnia Milander hà preparatu kits di debugging è una biblioteca di subrutine per travaglià cù periferiche, "ma senza alcuna garanzie o obbligazioni supplementari in quantu à a correttezza di a biblioteca". A biblioteca hè simile à a Biblioteca Perifèrica Standard di STMicroelectronics. In generale, tutti i controller ARM custruiti nantu à u core Cortex-M anu assai in cumunu. Per quessa, a familiarizazione cù i novi cuntrolli russi hà procedutu rapidamente. È per quelli chì anu compru kits di debugging di marca, u supportu tecnicu hè statu furnitu durante l'usu.
Kit di debug per microcontroller 1986BE1T, © Milander
In ogni casu, cù u tempu, "malati di a zitiddina" di novi microcircuiti è biblioteche cuminciaru à appare. Esempi di prova di u firmware hà travagliatu senza prublemi visibili, ma cù mudificazioni significati, crashes è errori sò accaduti. U primu "swallow" in a mo spirimintà era fallimenti inexplicable in l'operazione di u controller CAN. Un annu dopu, un prublema cù u modulu hè statu scupertu nantu à u controller 1986BE1T (aviazione) di una prima rivisione.
Una funzione dispiacevule era chì era necessariu di travaglià è di trattà cù l'errori micca nantu à i tavulini di debugging, ma nantu à i tavulini prototipi di i dispositi chì sò stati previsti per a produzzione seriale di fabbrica. Di solitu ùn ci era nunda, salvu u connettore JTAG. A cunnessione cù un analizatore di logica era difficiule è inconveniente, è ùn ci era micca di solitu LED o schermi. Per quessa, l'idea di creà a mo propria tavola di debugging hè apparsu in a mo testa.
Da una banda, ci sò stati kits di debugging di marca nantu à u mercatu, è ancu meravigliose schede da a cumpagnia LDM-Systems da Zelenograd. Per d 'altra banda, i prezzi di sti prudutti sò stupente, è a funziunalità basica senza carte di espansione ùn risponde micca à l'expectativa. Un bordu cù un controller saldatu è un connettore pin ùn hè micca di interessu per mè. E tavulini più interessanti sò caru.
Scheda di sviluppu MILANDR LDM-HELPER-K1986BE1QI-FULL, © LDM Systems
A cumpagnia Milander hà una pulitica di prezzu è marketing unica. Cusì, hè pussibule acquistà campioni gratuiti di certi microcircuiti, ma questu hè solu dispunibule per e persone giuridiche è hè assuciatu cù una ricerca burocratica. In generale, i microcircuiti in un casu di metallo-ceramica sò oru in u sensu literale è figurativu. Per esempiu, un controller 1986BE1T custa da 14 à 24 mila rubles in Mosca. U chip di memoria statica 1645RU6U costa da 15000 1986 rubles. È questu hè l'ordine di prezzu per tutti i prudutti. In u risultatu, ancu i istituti di ricerca specializati cù ordini di u guvernu risparmianu soldi è si scurdanu di tali prezzi. I microcircuiti in un casu di plastica per l'usu civile sò significativamente più prezzu, ma ùn sò micca dispunibili da i fornituri populari. Inoltre, a qualità di i microcircuiti in un casu di plastica, mi pari, hè peggiu di quelli "d'oru". Per esempiu, ùn pudia micca eseguisce u controller K1BE128QI à 40 MHz senza aumentà u paràmetru di latenza flash. À u listessu tempu, a temperatura di stu controller hè ghjuntu à 50-1986C. Ma u controller 1BE128T ("gold") hà cuminciatu à XNUMX MHz senza paràmetri supplementari è ferma friddu. Hè veramente bonu.
Microcontroller "Golden" 1986BE1T, (c) Milander
Eru furtunatu chì un microcontroller in un casu di plastica pò ancu esse acquistatu à u retail da LDM Systems, è tutti i diagrammi di bordu sò liberamente dispunibili. U male hè chì nantu à u situ web in a foto di u controller pudete vede un marcatu chì dice chì questu hè a 4a rivisione di 2014, i.e. cù difetti. Pensu per un bellu pezzu s'ellu cumprà o micca cumprà. Sò passati parechji anni cusì...
L'idea di creà un bordu di debug ùn hè micca sparitu in ogni locu. Pocu à pocu, aghju furmatu tutti i requisiti è pensa à cumu si mette tuttu nantu à una tavola per esse compactu è micca caru. À u listessu tempu, aghju urdinatu i cumpunenti mancanti da i Cinesi. Ùn aghju micca fretta - aghju fattu tuttu per mè stessu. I fornitori chinesi sò notoriamente sloppy - aghju avutu à urdinà a stessa cosa da diversi posti per uttene tuttu ciò chì avia bisognu. Inoltre, alcuni di i chip di memoria sò stati usati - apparentemente saldati da i dispositi rotti. Questu hè tornatu per perseguirmi dopu.
Cumprà un microcontroller Milander K1986BE1QI (aria) ùn hè micca un compitu faciule. In a stessa tenda Chip and Dip, in a sezione "Articuli per l'ordine", aghju trovu solu K1986BE92QI per 740 rubles, ma ùn mi cunvene micca. L'unica opzione hè di cumprà una rivisione micca fresca da LDM-Systems per 2000 rubles. Siccomu ùn pudia truvà un rimpiazzamentu in altrò, decisu di cumprà ciò chì aghju avutu. À a mo piacevule sorpresa, m'anu vindutu un novu controller fabbricatu in dicembre 2018, rivisione 6+ (1820). Ma u situ hà sempre una vechja foto, è à u mumentu di a scrittura u controller ùn hè micca dispunibule ...
Microcontroller K1986BE1QI (aviazione) in imballaggio tecnologicu, (c) Foto di l'autore
Principali caratteristiche tecniche di u mo bordu di debug MDB1986 i seguenti:
- Debugger-programmer integratu, cumpatibile cù J-Link è CMSIS-DAP;
- memoria statica 4 Mbit (256k x 16, 10 ns);
- chip di memoria flash 64Mbit, Winbond 25Q64FVSIG;
- Transceiver d'interfaccia RS-232 cù linee RTS è CTS;
- interfacce è connettori per Ethernet, USB, CAN;
- MAX7 controller di visualizazione di 7221 segmenti;
- pin connector per travaglià cù MKIO (MIL_STD_1553) è ARINC429;
- fototransistor Everlight PT17-21C;
- cinque LED di culore, un buttone di reset è dui buttoni d'utilizatori;
- alimentazione à u portu USB hè 5 volti;
- dimensioni di u circuitu stampatu 100 x 80, mm
Mi sò piaciuti i schede di a serie STM-Discovery perchè anu un programatore-debugger integratu - ST-Link. Branded ST-Link funziona solu cù controller da STMicroelectronics, ma un paru d'anni fà hè diventatu pussibule aghjurnà u firmware in ST-Link è uttene SEGGER J-Link OB (on-board) Debugger. Legalmente, ci hè una restrizzione à utilizà un tali debugger solu cù schede STMicroelectronics, ma in fattu u putenziale ùn hè micca limitatu. Cusì, avè un J-Link OB, pudete avè un programatore-debugger integratu nantu à u bordu di debugging. Aghju nutatu chì i prudutti LDM-Systems utilizanu u cunvertitore CP2102 (Usb2Uart), chì pò solu lampassi.
STM32F103C8T6 microcontrollers, reale è micca cusì reale, (c) Foto di l'autore
Dunque, era necessariu cumprà l'STM32F103C8T6 originale, postu chì u firmware propiu ùn hà micca travagliatu bè cù u clone. Aghju dubbitatu sta tesi è decisu di pruvà u controller CS32F103C8T6 da a cumpagnia chinesa CKS. Ùn aghju micca lagnanza annantu à u controller stessu, ma u firmware ST-Link proprietariu ùn hà micca travagliatu in questu. J-Link hà travagliatu parzialmente - u dispositivu USB hè statu rilevatu, ma u programatore ùn hà micca realizatu e so funzioni è ricurdava constantemente chì era "difettu".
Errore durante l'esecuzione di u debugger in un controller non originale
Ùn era micca cuntentu di questu è hà scrittu prima u firmware per lampà u LED, è dopu implementatu a dumanda IDCODE utilizendu u protocolu JTAG. U programatore ST-Link, chì aghju avutu nantu à a scuperta, è u prugramma ST-Link Utility lampò CS32F103C8T6 senza alcunu prublema.In fine, era cunvinta chì u mo bordu travagliava. À u mo piacè, u cuntrollu di destinazione K1986BE1QI (aviazione) hà emessu allegramente u so IDCODE via a linea TDO.
Oscillogramma di una linea di signale TDO cù una risposta IDCODE codificata, (c) Foto di l'autore
Allora u portu SWD hè stata utile per debugging u debugger stessu è cuntrollà IDCODE
Ci era una opzione cù un debugger
Funzionamentu successu di u debugger integratu J-Link STLink V2
Quandu tutti i cumpunenti chjave di u futuru bordu di sviluppu eranu dispunibuli, sò andatu in Eagle CAD è scupertu chì ùn eranu micca in a biblioteca di l'elementu. Ùn ci era micca induve andà - aghju avutu à disegnà elli stessu. À u stessu tempu, aghju fattu spots di muntatura per a memoria, un connettore HanRun per Ethernet, è aghjustatu frames per resistori è condensatori. U schedariu di prughjettu è a biblioteca di cumpunenti ponu esse truvati
Schema schematicu di u pianu di sviluppu MDB1986
U tavulinu hè alimentatu da una fonte di 5 volt DC ottenuta da u portu USB. Ci hè un totale di dui porti USB Type-B nantu à u bordu. Unu hè per u programatore, u sicondu hè per u controller K1986BE1QI. U bordu pò operà da una di queste fonti o da e duie simultaneamente. A regulazione di carica più simplice è a prutezzione di a linea elettrica sò implementate cù diodi Schottky, in circuiti D2 è D3 (SS24). Ancu in u diagrama pudete vede i fusibles auto-ristoranti F1 è F2 à 500 mA. I linii di signale di u portu USB sò prutetti da una assemblea di diodi USBLC6-2SC6.
U circuitu di debugger-programmer ST-Link hè cunnisciutu da parechji; pò esse truvatu in a documentazione per i schede STM32-Discovery è altre fonti. Per u firmware iniziale di u clone ST-Link / J-Link-OB / DAP (opcional), aghju purtatu i linii SWDIO (PA13), SWCLK (PA14), GND. Parechje persone utilizanu UART per u firmware è sò furzati à tirà i jumpers BOOT. Ma aghju trovu SWD più còmuda, è questu protokollu permette di debugging.
Quasi tutti i cumpunenti di u bordu sò alimentati da 3.3 volts, chì venenu da u regulatore di tensione AMS1117-3.3. Per suppressione l'interferenza elettromagnetica è i picchi di corrente, i filtri LC da condensatori è chokes di a serie BLM31PG sò usati.
Separatamente, vale a pena menzionate u driver di display MAX7 di 7221 segmenti. Sicondu a specificazione, l'alimentazione cunsigliata hè da 4 à 5.5 volts, è u livellu di signale altu (logicu) hè almenu 3.5V (0.7 x VCC), cù un supply 5V. Per u controller K1986BE1QI (aviazione), l'output di una unità logica currisponde à una tensione da 2.8 à 3.3V. Ovviamente ci hè una discrepanza trà i livelli di signale chì pò interferiscenu cù u funziunamentu normale. Aghju decisu di alimentà u MAX7221 à 4V è riduce i livelli di signale à 2.8V (0.7 x 4 = 2.8). Per fà questu, u diode D4 (RS1A o FR103) hè stallatu in serie cù u circuitu di putenza di u driver. A caduta di tensione tutale hè 0.9V (diode Schottky 0.3V è diode 0.6V), è tuttu funziona.
A maiò parte di i porti di u microcontroller K1986BE1QI (aviazione) sò cumpatibili cù signali finu à 5V. Dunque, ùn ci hè micca prublema cù u transceiver MCP2551 CAN, chì opera ancu in 5V. U chip MAX232 hè indicatu cum'è un transceiver RS-3232 in u diagramma, ma in fattu aghju utilizatu SN65C3232D da Texas Instruments, perchè opera da 3.3V è furnisce velocità finu à 1Mbit/s.
U bordu cuntene 4 risonatori di quartz - unu per u debugger (8 MHz) è trè per u microcontroller di destinazione K1986BE1QI (aviazione) cù qualificazioni di 32.768 kHz, 16 MHz, 25 MHz. Quessi sò cumpunenti necessarii, perchè I paràmetri di l'oscillatore RC integratu sò in una larga gamma da 6 à 10 MHz. Una frequenza di 25 MHz hè necessaria per u funziunamentu di u controller Ethernet integratu. Per una certa ragione, u situ web di Milandra (forsi per sbagliu) dice chì u casu di plastica ùn hà micca Ethernet. Ma avemu a basa di a specificazione è i fatti.
Un incentive impurtante per a creazione di u mo propiu pianu di sviluppu era l'uppurtunità di travaglià cù l'autobus di u sistema esternu EBC (controller di bus esterno), chì hè essenzialmente un portu parallelu. U microcontroller K1986BE1QI (aereo) permette di cunnette è travaglià cù chips di memoria esterni è dispositivi periferichi, per esempiu, ADC, FPGA, etc. E capacità di l'autobus di u sistema esternu sò abbastanza grande - pudete travaglià cù RAM statica 8-bit, 16-bit è 32-bit, ROM è NAND Flash. Per leghje / scrive dati 32-bit, u controller pò realizà automaticamente 2 operazioni currispondenti per chips 16-bit, è 8 operazioni per chips 4-bit. Ovviamente, una operazione I/O a 32 bit sarà completata più velocemente con un bus di dati a 32 bit. I disadvantages includenu a necessità di u prugramma per operare cù dati 32-bit, è u bordu duverà mette 32 piste.
Chips RAM statici, usati (invintate quale hè difettu)
Una soluzione equilibrata hè di utilizà chips di memoria 16-bit. Mi hè accadutu à avè chips Integrated Silicon Solutions Inc. (ISSI IS61LV25616AL, 16 x 256k, 10 ns, 3.3V). Di sicuru, a cumpagnia Milander hà u so propiu chip di memoria statica
Bus esterno è modalità StandAloneU microcontroller K1986BE1QI (aereo) hà un modu StandAlone unicu, chì hè pensatu per l'accessu esternu direttu à i controller Ethernet è MKIO (MIL_STD_1553) via un bus esterno, cù u core in u statu di reset, i.e. micca usatu. Stu modu hè cunvenutu per i prucessori è FPGA chì ùn anu micca Ethernet è / o MKIO.
U schema di cunnessione hè u seguente:
- bus dati MCU (D0-D15) => SRAM (I/O0-I/O15),
- bus d'indirizzu MCU (A1-A18) => SRAM (A0-A17),
- cuntrollu MCU (nWR,nRD,PortC2) => SRAM (WE,OE,CE),
- SRAM (UB, LB) sò cunnessi o tirati à a terra attraversu una resistenza.
A linea CE hè cunnessa à l'alimentazione per mezu di una resistenza; i pin per campionà u byte MCU (BE0-BE3) ùn sò micca usati. Sottu u spoiler, aghju furnitu u codice per l'inizializazione di i porti è u cuntrollu di l'autobus esternu.
Initializing ports and EBC controller (controller bus esterno)
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);
}
U microcontroller in u pacchettu LQFP-144 è a memoria in u pacchettu TSOP-44 anu parechji pins associati è occupanu assai spaziu nantu à u circuitu stampatu. Avè l'experientia di risolve i prublemi di ottimisazione in u campu di l'ecunumia, era ovviamente per mè chì era necessariu di mette sti microcircuiti nantu à u bordu prima. In diverse fonti aghju scontru recensioni laudatory circa
Un elementu impurtante di un circuitu stampatu hè a stampa di serigrafia. U pianu di sviluppu ùn deve micca solu etichette per i cumpunenti elettronichi, ma tutti i connettori anu ancu esse etichettati. In u spinu di u tavulinu aghju postu tavule cù e funzioni di i porti di cuntrollu (principale, alternativu, annullatu, attuale). Aghju urdinatu a produzzione di circuiti stampati in Cina da u famosu uffiziu PCBWay. Ùn aghju micca elogiatu perchè a qualità hè bona. Puderanu megliu, cù tolleranze più strette, ma
Circuiti stampati MDB1986 fabbricati, (c) Foto di l'autore
Aviu avutu a saldatura di i cumpunenti "in i ghjinochje" cù un ferru di saldatura 40-watt è POS-61 solder, perchè raramente solder, 1-2 volte à l'annu, è a pasta di saldatura s'era secca. Aviu avutu ancu cambià u controller Chinese CS32F103 à u STM32F103 originale, è poi rimpiazzà ancu a memoria. In generale, avà sò cumplettamente cuntentu di u risultatu, ancu s'ellu ùn aghju micca verificatu l'operazione di RS-232 è CAN.
Tavola di debug MDB1986 in operazione - brilla è riscalda, (c) Foto di l'autore
Nantu à u situ Milandra pudete truvà abbastanza
Pensu à MilandraA microelettronica si sviluppa in Russia, è a cumpagnia Milander hè un rolu impurtante in stu prucessu. Novi microcontrollers interessanti sò apparsu, per esempiu, 1986BE81T è Elektrosila cù interfacce SpaceWire è MKIO (u stessu cum'è in 1986BE1 è, possibbilmente, cù i stessi prublemi), etc. Ma i studienti ordinari, i prufessori è l'ingegneri civili ùn ponu micca cumprà tali microcircuiti. Questu significa chì a cumunità di l'ingegneria ùn serà micca capaci di identificà rapidamente errori è prublemi cù stu chip. Mi pare chì prima hè necessariu di pruduce microcircuits in un casu di plastica, i distribuisce à tutti i partiti interessati, è dopu l'appruvazioni (appruvazioni latinu - appruvazioni, ricunniscenza) da specialisti, ponu preparà una rivisione in un casu di metallo-ceramica cù prutezzione di tutti i fattori terribili. Spergu chì in un futuru vicinu seremu TUTTI cuntentu di i novi prughjetti annunziati à l'esibizioni.
U bordu di debug chì aghju sviluppatu pò esse ripetutu, mudificatu è utilizatu da qualcunu in u prucessu educativu. Prima di tuttu, aghju fattu u bordu per mè stessu, ma hè stata cusì bè chì
K1986BE1QI (aria) hè un controller assai interessante cù interfacce uniche chì ponu esse usate in università per insignà i studienti. Pensu chì dopu avè correttu l'errori identificati in u controller è passanu i testi di certificazione, u controller volarà in u veru sensu di a parolla!
Source: www.habr.com