public static void Main(string[] arg) { Console.WriteLine(" STM8uLoader - компактный STM8 UART загрузчик/терминал v1425_09.07.2018."); if (arg.Length == 0) { Console.WriteLine(" Отсутствуют аргументы командной строки."); Console.WriteLine(" Первый аргумент (обязательный) - название файла прошивки."); Console.WriteLine(" Второй аргумент (не обязательный) - четыре шестнадцатеричные цифры слитно - адрес передачи управления."); Console.WriteLine(" Остальные аргументы игнорируются."); Console.ReadKey(); return; } fileName = arg[0]; FileOpenMemorySorting fileSorted = new FileOpenMemorySorting(fileName); Console.WriteLine(" " + fileName); if (arg.Length > 1) { goAdrCmdStr = int.Parse(arg[1], System.Globalization.NumberStyles.HexNumber); srtGoAddress = arg[1]; Console.WriteLine(" Адрес передачи управления ${0:X4} из командной строки", goAdrCmdStr); } //Dumps myDumps = new Dumps(); Dumps.err_Msg = " OK"; Dumps.COM_port_Open(); if (Dumps.err_Msg != " OK") { Console.WriteLine(Dumps.err_Msg); return; } Dumps.read_Key_Open(); rvsn_byte = Dumps.Load_First_Dump(Dumps.Read_128000v14_25, "Read_128000v14_25"); // проверяем целостность кода загрузчика в STM8 за исключением ячеек содержащих адреса передачи управления if (rvsn_byte == 0x14) { Dumps.Compare_Equ(0x9FFE, 0x9FFF, Dumps.rev14_srtDicAdrBts(), Dumps.Read_by_Mask128000(Dumps.rev14_srtDicAdrBts())); if (Dumps.err_Msg == " OK") { Console.WriteLine(" Код загрузчика boot_uC в STM8 соответствует версии ${0:X2} ", rvsn_byte); } else { Console.WriteLine(Dumps.err_Msg); Exit(); } // здесь есть смысл выйти из программы Dumps.Dumps_To_Console(Dumps.Read_by_Mask128000(Dumps.rev14_srtDicAdrBts())); if (fileSorted.GetFLASHaddressByteSorted().Count != 0) { Dumps.Compare_NoCross(0x9FFE, 0x9FFF, Dumps.rev14_srtDicAdrBt(), fileSorted.GetFLASHaddressByteSorted()); if (Dumps.err_Msg == " OK") { Console.WriteLine(" Файл прошивки не имеет адресов во FLASH памяти, пересекающихся с кодом загрузчика "); } else { Console.WriteLine(Dumps.err_Msg); Exit(); } // здесь есть смысл выйти из программы Dumps.err_Msg = " OK"; Dumps.Dump_To_Console(fileSorted.GetFLASHaddressByteSorted()); } else { Console.WriteLine(" Файл прошивки не содержит адресов для записи во FLASH память"); } if (fileSorted.GetOPTIONaddressByteSorted().Count != 0) { Dumps.Compare_NoCross(0x9FFE, 0x9FFF, Dumps.rev14_srtDicAdrBt(), fileSorted.GetOPTIONaddressByteSorted()); if (Dumps.err_Msg == " OK") { Console.WriteLine(" Файл прошивки не имеет адресов в блоке памяти OPTION Bytes, пересекающихся с кодом загрузчика "); } else { Console.WriteLine(Dumps.err_Msg); Exit(); } // здесь есть смысл выйти из программы Dumps.err_Msg = " OK"; Dumps.Dump_To_Console(fileSorted.GetOPTIONaddressByteSorted()); } else { Console.WriteLine(" Файл прошивки не содержит адресов для записи в блок памяти OPTION Bytes"); } } if (rvsn_byte == 0x25) { Dumps.Compare_Equ(0x4831, 0x4832, Dumps.rev25_srtDicAdrBts(), Dumps.Read_by_Mask128000(Dumps.rev25_srtDicAdrBts())); if (Dumps.err_Msg == " OK") { Console.WriteLine(" Код загрузчика boot_uC в STM8 соответствует версии ${0:X2} ", rvsn_byte); } else { Console.WriteLine(Dumps.err_Msg); Exit(); } // здесь есть смысл выйти из программы Dumps.Dumps_To_Console(Dumps.Read_by_Mask128000(Dumps.rev25_srtDicAdrBts())); if (fileSorted.GetFLASHaddressByteSorted().Count != 0) { Dumps.Compare_NoCross(0x4831, 0x4832, Dumps.rev25_srtDicAdrBt(), fileSorted.GetFLASHaddressByteSorted()); if (Dumps.err_Msg == " OK") { Console.WriteLine(" Файл прошивки не имеет адресов во FLASH памяти, пересекающихся с кодом загрузчика "); } else { Console.WriteLine(Dumps.err_Msg); Exit(); } // здесь есть смысл выйти из программы Dumps.err_Msg = " OK"; Dumps.Dump_To_Console(fileSorted.GetFLASHaddressByteSorted()); } else { Console.WriteLine(" Файл прошивки не содержит адресов для записи во FLASH память."); } if (fileSorted.GetOPTIONaddressByteSorted().Count != 0) { Dumps.Compare_NoCross(0x4831, 0x4832, Dumps.rev25_srtDicAdrBt(), fileSorted.GetOPTIONaddressByteSorted()); if (Dumps.err_Msg == " OK") { Console.WriteLine(" Файл прошивки не имеет адресов в блоке памяти OPTION Bytes, пересекающихся с кодом загрузчика "); } else { Console.WriteLine(Dumps.err_Msg); Exit(); } // здесь есть смысл выйти из программы Dumps.err_Msg = " OK"; Dumps.Dump_To_Console(fileSorted.GetOPTIONaddressByteSorted()); } else { Console.WriteLine(" Файл прошивки не содержит адресов для записи в блок памяти OPTION Bytes."); } } //Console.WriteLine(Dumps.err_Msg); if (fileSorted.GetEEPROMaddressByteSorted().Count != 0) { Console.WriteLine(" Файл прошивки содержит информацию для записи в EEPROM память."); Dumps.err_Msg = " OK"; Dumps.Dump_To_Console(fileSorted.GetEEPROMaddressByteSorted()); } else { Console.WriteLine(" Файл прошивки не содержит адресов для записи в EEPROM память."); } if (fileSorted.GetRAMaddressByteSorted().Count != 0) { Console.WriteLine(" Файл прошивки содержит информацию для записи в RAM память."); Dumps.err_Msg = " OK"; Dumps.Dump_To_Console(fileSorted.GetRAMaddressByteSorted()); } else { Console.WriteLine(" Файл прошивки не содержит адресов для записи в RAM память."); } /* * * if(fileSorted.GetFLASHaddressByteSorted().Count != 0){ * srtDic = new SortedDictionary<int, byte>(fileSorted.GetFLASHaddressByteSorted()); * goAdrFrmSTM8=0; * foreach( KeyValuePair<int, byte> kvp in srtDic ){ * if(kvp.Key == 0x9FFE) goAdrFrmSTM8 = goAdrFrmSTM8 + kvp.Value<<8; * if(kvp.Key == 0x9FFF) goAdrFrmSTM8 = goAdrFrmSTM8 + kvp.Value; * } * * Console.WriteLine(" Адрес передачи управления ${0:X4} в файле прошивки STM8", goAdrFrmSTM8); * * } * * * //while(Dumps.key !='q'){ * */ if (fileSorted.GetFLASHaddressByteSorted().Count != 0) { Console.WriteLine(" FLASH из файла до сортировки"); Dumps.Dump_To_Console(fileSorted.GetFLASHaddressByteSorted()); if (rvsn_byte == 0x14) { Console.WriteLine(" FLASH из файла после сортировки"); Dumps.Dumps_To_Console(Dumps.FLASH_AdrBlcsSorting_v14(fileSorted.GetFLASHaddressByteSorted())); Console.WriteLine(" Отправляем FLASH область на запись"); Dumps.WriteBlocks_FLASH_128000(Dumps.FLASH_AdrBlcsSorting_v14(fileSorted.GetFLASHaddressByteSorted())); Console.WriteLine(Dumps.err_Msg); Console.WriteLine(" Содержимое FLASH после записи."); Dumps.Dumps_To_Console(Dumps.ReadBlocks_128000(Dumps.FLASH_AdrBlcsSorting_v14(fileSorted.GetFLASHaddressByteSorted()))); Console.WriteLine(Dumps.err_Msg); } if (rvsn_byte == 0x25) { Console.WriteLine(" FLASH из файла после сортировки"); Dumps.Dumps_To_Console(Dumps.FLASH_AdrBlcsSorting_v25(fileSorted.GetFLASHaddressByteSorted())); Console.WriteLine(" Отправляем FLASH область на запись"); Dumps.WriteBlocks_FLASH_128000(Dumps.FLASH_AdrBlcsSorting_v25(fileSorted.GetFLASHaddressByteSorted())); Console.WriteLine(Dumps.err_Msg); Console.WriteLine(" Содержимое FLASH после записи."); Dumps.Dumps_To_Console(Dumps.ReadBlocks_128000(Dumps.FLASH_AdrBlcsSorting_v25(fileSorted.GetFLASHaddressByteSorted()))); Console.WriteLine(Dumps.err_Msg); } } //Console.WriteLine(); if (fileSorted.GetEEPROMaddressByteSorted().Count != 0) { Console.WriteLine(" EEPROM из файла до сортировки"); Dumps.Dump_To_Console(fileSorted.GetEEPROMaddressByteSorted()); Console.WriteLine(" EEPROM из файла после сортировки"); Dumps.Dumps_To_Console(Dumps.EEPROM_AdrBlcsSorting(fileSorted.GetEEPROMaddressByteSorted())); Console.WriteLine(" Отправляем EEPROM область на запись"); Dumps.WriteBlocks_EEPROM_128000(Dumps.EEPROM_AdrBlcsSorting(fileSorted.GetEEPROMaddressByteSorted())); Console.WriteLine(Dumps.err_Msg); Console.WriteLine(" Содержимое EEPROM после записи."); Dumps.Dumps_To_Console(Dumps.ReadBlocks_128000(Dumps.EEPROM_AdrBlcsSorting(fileSorted.GetEEPROMaddressByteSorted()))); Console.WriteLine(Dumps.err_Msg); } if (fileSorted.GetOPTIONaddressByteSorted().Count != 0) { Console.WriteLine(" OPTION из файла до сортировки"); Dumps.Dump_To_Console(fileSorted.GetOPTIONaddressByteSorted()); Console.WriteLine(" OPTION из файла после сортировки"); Dumps.Dump_To_Console(Dumps.OPTION_AdrBlcsSorting(rvsn_byte, fileSorted.GetOPTIONaddressByteSorted())); Console.WriteLine(" Отправляем OPTION область на запись"); Dumps.WriteBytes_OPTION_128000(Dumps.OPTION_AdrBlcsSorting(rvsn_byte, fileSorted.GetOPTIONaddressByteSorted())); Console.WriteLine(Dumps.err_Msg); Console.WriteLine(" Содержимое OPTION после записи."); Dumps.Dump_To_Console(Dumps.Read_128000(0x4800, 64)); Console.WriteLine(Dumps.err_Msg); } //Console.WriteLine(); if (fileSorted.GetRAMaddressByteSorted().Count != 0) { //Console.WriteLine(" RAM из файла"); //Dumps.Dump_To_Console(fileSorted.GetRAMaddressByteSorted()); //Console.WriteLine(" Отправляем RAM область на запись"); Dumps.Write_RAM_128000(fileSorted.GetRAMaddressLineSorted()); Console.WriteLine(" Содержимое RAM памяти после записи"); Dumps.Dumps_To_Console(Dumps.Read_by_Mask128000(fileSorted.GetRAMaddressLineSorted())); //Console.WriteLine(Dumps.err_Msg); } else { Console.WriteLine(" Область RAM не найдена"); } //Console.WriteLine(); //Console.WriteLine(Dumps.err_Msg); if (srtGoAddress != "") { Console.WriteLine(" Передаем управление прикладной программе по адресу ${0:X4} в командной строке.", goAdrCmdStr); go_bytes[0] = 0xF5; // GO cmd команда перехода go_bytes[1] = 0x00; // YH не для этого метода go_bytes[2] = 0x00; // YL не для этого метода go_bytes[3] = (byte)(goAdrCmdStr >> 8); // go_adrH старший байт требуемого адреса boot_OPTION go_bytes[4] = (byte)goAdrCmdStr; // go_adrL младший байт требуемого адреса boot_OPTION go_bytes[5] = 0x00; // cntr размер следующего к загрузке блока Dumps.Go_Cmnd(go_bytes); // эту команду должен понимать каждый модуль } else { srtDic = new SortedDictionary <int, byte>(Dumps.Read_128000(0x9FFE, 2)); goAdrFrmSTM8 = 0; foreach (KeyValuePair <int, byte> kvp in srtDic) { if (kvp.Key == 0x9FFE) { goAdrFrmSTM8 = goAdrFrmSTM8 + kvp.Value << 8; } if (kvp.Key == 0x9FFF) { goAdrFrmSTM8 = goAdrFrmSTM8 + kvp.Value; } } Console.WriteLine(" Передаем управление прикладной программе по адресу ${0:X4} из STM8.", goAdrFrmSTM8); go_bytes[0] = 0xF5; // GO cmd команда перехода go_bytes[1] = 0x00; // YH не для этого метода go_bytes[2] = 0x00; // YL не для этого метода go_bytes[3] = (byte)(goAdrFrmSTM8 >> 8); // go_adrH старший байт требуемого адреса boot_OPTION go_bytes[4] = (byte)goAdrFrmSTM8;; // go_adrL младший байт требуемого адреса boot_OPTION go_bytes[5] = 0x00; // cntr размер следующего к загрузке блока Dumps.Go_Cmnd(go_bytes); // эту команду должен понимать каждый модуль } Dumps.statusUART = "terminal"; Console.Beep(); Console.ForegroundColor = System.ConsoleColor.Green; Console.WriteLine(" Для передачи байта прикладной программе в шеснадцатиричном коде \n необходимо нажать последовательно две клавиши из 0...9, A...F."); Console.ForegroundColor = System.ConsoleColor.Gray; while (Dumps.inCycle) { } //} Dumps.read_Key_Close(); // останавливаем поток чтения клавиатуры Dumps.COM_port_Close(); Console.ReadKey(); return; } // Main();