К1946ВК035 проблемы с загрузчиком (flasher)

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

lukegluke
Сообщения: 4
Зарегистрирован: 16 апр 2026, 14:35
Предприятие: -

К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение lukegluke »

Приветствую!

С прошивкой и дебагом по SWD никаких проблем, теперь пытаюсь заставить работать бутлоадер k1921vkx_flasher (UART загрузчик для микроконтроллеров К1921Вх) и происходит сплошная разноплановая рандомная шляпа:
Объёмное описание всякой дичи | Показать
CFGWORD
При первом подключении правильное значение CFGWORD всегда считывает только начиная со второго раза (изначально 0xFF - все биты установлены, а потом уже реальное 0xEF - галочка с BMODEDIS пропадает). При записи CFGWORD всегда: "Устройство вернуло сообщение об ошибке!", но при этом его записывает, т.к. потом считывает изменённые значения (но опять же верные значения считываются только после второго чтения).

Чтение памяти
Чтение одной страницы памяти бывает срабатывает, бывает ошибка "[ERR] Ошибка CRC в команде от хоста!", либо застопаривается в "[INFO] Ожидание выполнения команд ...". Больше страниц практически всегда/всегда с ошибками. Когда успешно читает, что из основной памяти, что из NVR, результат начинается с лишнего слова 0xefffffffffffffff (это именно артефакт чтения, лишнего нет на флешке, проверял через SWD). А ещё были моменты, когда читало из NVR, хотя была выбрана область памяти "основная".
Т.к. это уж очень похоже на значение CFGWORD, убрал его чтение flash_read(FLASH_NVR_CFGWORD_OFFSET, FLASH_NVR, data); из read_page_cmd() в boot_core.c и это помогло, лишнее слово исчезло. А ещё это починило чтение CFGWORD в get_cfgword_cmd(), хотя казалось бы несвязанные функции. Но остальные проблемы никуда не делись.

Запись памяти
Аналогично с выдачей ошибок, результат - какие-то страницы записываются, какие-то нет, какие-то битые.

Изначально k1921vkx_flasher как есть, всё из коробки, только лишь проектом сделал для Vector IDE и убрал логику работы через NMI, без выхода из загрузчика (инициализации PeriphInit(); boot_init(); и запуск boot_core(); сразу в main без условий). Флаги сборки и линковки перепроверил и согласовал с gcc_cm4f.cmake.
И даже чтобы прям максимально исключить случаи какой-то неправильной сборки - прошивал готовую собранную прошивку от DC Vostok - результат такой же.

Что либо дебажить сложно, т.к. при точках отладки в определённых местах вылетает в hardfault. Но когда получилось, всё именно так и есть в переменных на МК, это не какие-то ошибки кода.

Безрезультатно пробовал:
  • Убирать кэш
  • Устанавливать разные waitstate для флешки (MFLASH_CTRL_LAT)
Отдельная боль при этой дичи само GUI приложение k1921vx_flasher.py, вылетающее, например, если МК не был подключён или требующее перезагрузки, если не произошло ответа от МК и застопорилось в ожидании ответа. Не шибко приятно, но так-то спасибо, что хоть есть что-то готовое.
Пока со всем этим возился и пытался понять, что вообще происходит, возникла мысль, а не может ли быть это связано как-то с оптимизацией, потому что когда-то давно имел схожее рандомное поведение с STM'кой.
Начал постепенно уменьшать оптимизацию и заметил, что на -O1 стало меньше ошибок и чаще успешно. К сожалению с уменьшением оптимизаций бутлоадер уже не вмещается в NVR, поэтому стал прошивать в основную Flash для проверок и о чудо без оптимизаций (-O0) - всё наконец заработало как надо, читает без артефактов и ошибок всю память, стирает и записывает и всё это многократно. При этом хоть с какой-то оптимизацией - появляются ошибки или общего характера (Устройство вернуло сообщение об ошибке) или CRС (то от девайса, то от хоста) сразу или через пару чтений, при этом то одну ошибку может выдать, то другую, то третью.
Как и писал в спойлере пробовал прошивать и готовую прошивку бутлоадера от DC Vostok, чтобы исключить свою сборку - с ней всё та же фигня, что и с собранной мной с -Os.

Ещё одна дичь | Показать
Кстати, такие же ошибки рано или поздно появляются, если не подключать пин RST МК к DTR USB-TTY, а резетить вручную. Хотя кажется одно и тоже и программа резетит только лишь при подключении/отключении, но вот почему-то есть разница в поведении.
Кто-то использовал flasher, всё работало как надо? Может поделится кто скомпилированной рабочей прошивкой, проверил бы на моём МК.
Может поможет кто какими мыслями по этому вопросу. Заранее спасибо!
RabidRabbit
Сообщения: 152
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение RabidRabbit »

lukegluke писал(а): 17 апр 2026, 19:37 Может поможет кто какими мыслями по этому вопросу. Заранее спасибо!
Подскажите, если в курсе, где взять плату с К1921ВК035? Тогда можно и допилить загрузчик совместными усилиями :)
RabidRabbit
Сообщения: 152
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение RabidRabbit »

lukegluke писал(а): 17 апр 2026, 19:37 Может поможет кто какими мыслями по этому вопросу. Заранее спасибо!
Пока что мыcля после просмотра исходников:
Структура packet_fifo модифицируется как из обработчика прерывания, так и из "обычного" кода. Стоит попробовать в функции packet_fifo_read() в самом начале глобально запретить прерывания, а перед return data; снова разрешить.
RabidRabbit
Сообщения: 152
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение RabidRabbit »

RabidRabbit писал(а): 20 апр 2026, 11:37 Пока что мыcля после просмотра исходников:
Структура packet_fifo модифицируется как из обработчика прерывания, так и из "обычного" кода. Стоит попробовать в функции packet_fifo_read() в самом начале глобально запретить прерывания, а перед return data; снова разрешить.
Точнее, вот так:

Код: Выделить всё

//Чтение байта из пакетного fifo
uint8_t packet_fifo_read()
{
    uint8_t data = 0;

    while (packet_fifo.empty) {
    };

   GLOBAL_INTERRUPTS_DISABLE();
   
    data = packet_fifo.mem[packet_fifo.rd_ptr];
    if (packet_fifo.rd_ptr == (PACKET_FIFO_BYTES - 1))
        packet_fifo.rd_ptr = 0;
    else
        packet_fifo.rd_ptr++;

    if ((packet_fifo.wr_ptr == packet_fifo.rd_ptr) && !packet_fifo.full)
        packet_fifo.empty = 1;
        
    GLOBAL_INTERRUPTS_ENABLE();

    return data;
}
Функции вкл/выкл прерываний обозваны условно.
lukegluke
Сообщения: 4
Зарегистрирован: 16 апр 2026, 14:35
Предприятие: -

Re: К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение lukegluke »

RabidRabbit писал(а): 20 апр 2026, 11:23 Подскажите, если в курсе, где взять плату с К1921ВК035? Тогда можно и допилить загрузчик совместными усилиями :)
Подскажу), я брал здесь:
https://vk.com/market/product/k1946vk03 ... 2-15707872
Последний раз редактировалось lukegluke 20 апр 2026, 17:32, всего редактировалось 1 раз.
RabidRabbit
Сообщения: 152
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение RabidRabbit »

lukegluke писал(а): 20 апр 2026, 17:30 Подскажу
Спасибо.
Предложенные изменения по коду не пробовали?
lukegluke
Сообщения: 4
Зарегистрирован: 16 апр 2026, 14:35
Предприятие: -

Re: К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение lukegluke »

RabidRabbit писал(а): 20 апр 2026, 11:37 Структура packet_fifo модифицируется как из обработчика прерывания, так и из "обычного" кода.
Ну это касается только флагов packet_fifo.full и packet_fifo.empty, а непосредственно данные меняются в независимых указателях чтения и записи, так что сомнительно, что поможет.
RabidRabbit писал(а): 20 апр 2026, 11:37 Стоит попробовать в функции packet_fifo_read() в самом начале глобально запретить прерывания, а перед return data; снова разрешить.
Но я попробовал, обернул как предложено в __disable_irq(), __enable_irq() - ожидаемо не помогло, тоже самое поведение.
RabidRabbit
Сообщения: 152
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение RabidRabbit »

lukegluke писал(а): 21 апр 2026, 13:02 Но я попробовал, обернул как предложено в __disable_irq(), __enable_irq() - ожидаемо не помогло, тоже самое поведение.
Ну ок. Моя плата с ВК035 пока до меня не доехала.
RabidRabbit
Сообщения: 152
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение RabidRabbit »

Плата доехала. Загрузчик не лезет в NVR область (сборка RELEASE) ;)
RabidRabbit
Сообщения: 152
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1946ВК035 проблемы с загрузчиком (flasher)

Сообщение RabidRabbit »

Выкинул НИИЭТ'овский "startup", стал загрузчик влезать в 3 КиБ.
Чтение слова состояния при запуске и чтение секторов (нескольких) вроде работает. Помогло добавление __DSB(); перед __NOP(); в функции flash_cmd().
Запись пока не работает.
Ответить

Вернуться в «32-разрядные микроконтроллеры»