Хабрахабр

Поддельная «голубая пилюля»

Я являюсь большим любителем макетных плат «голубая пилюля». Они очень хороши по соотношению цена/возможности. Собственно, моя любовь к ним заметна из первоапрельской статьи про педальную прошивку для игры на балалайке.

Именно так, недавно я взял очередную плату, прошил уже хорошо отлаженной и проверенной «прошивкой» и… получил неопознанное USB-устройство. Открыть коробочку с такими платами и быстро взять одну для решения каких-то задач — в порядке вещей. Тут бы делу и конец, но интересно же, в чём дело. Взял другую плату, «прошил» её, там устройство заработало. Так что я был уверен, что процессор, в целом, жив. Поэтому, как пришли выходные, я занялся детальным исследованием, почему же она не работает.
Вообще, перед тем как «прошивать» платы, я убеждаюсь, что тест, влитый производителем, работает: светодиод мигает. Возможно, линии USB либо кварц. Что же тогда виновато?

Но он может не запускаться по множеству причин. Линии все были в порядке, кварц не запускался. Его запуск производится программно, уже в недрах функции main(), Ну и прекрасно, начинаем отладку программы.

Программа «висит» где-то между запуском и этой функцией. Всё бы ничего, но на функцию main() отладчик не выходит.

Останавливаем программу: вполне ожидаемо, мы находимся в обработчике HardFault.

Сбрасываем счётчик адреса: Что же привело нас сюда?

Вот на этой строке всё умирает, используй мы хоть операцию Step, хоть Step Over. И начинаем аккуратно шагать по программе.

Сбрасываем всё в очередной раз (RST), щёлкаем «мышью» по окну дизассемблера и шагаем там. Весёлый Keil… Ну, да ничего. В этом случае, мы можем понять, что всё умирает внутри функции __scatterload.

Но нет, всё верно (настройки я тоже перепроверял, но эта прошивка в других платах же работает). Вообще, если всё умирает в этой функции, уже повод глянуть, не перепутан ли тип контроллера.

Снова всё сбрасываем и трассируем уже эту функцию. Хорошо. Через несколько проб, зависаний и сбросов находим виновную строку…

Умирает всё при сохранении регистров в стеке. Да-да. Смотрим документацию на контроллер: При этом слева видно, что SP равен 0x200030A0.

Смотрим, какое окно выделено для SRAM:

Указатель стека (SP) находится в разрешённом диапазоне. Всё верно. Попробуем нахально подменить значение SP с 0x200030A0, скажем, на 0x200020A0, благо отладчик это позволяет… Чпок! Так что же виновато? Значит, у нашего кристалла памяти не 20 килобайт. Зависание в указанной строке прекратилось! Проверив несколько раз, выясняем, что последнее работающее значение SP равно 0x20002800. А сколько? Это соответствует кристаллу STM32F103C6. То есть, 10 килобайт. Увы. Перед нами перепиленная микросхема.

У них особый цвет джамперов и очень красивый изумрудный светодиод (у остальных — менее приятный оттенок зелёного). Всё бы ничего, но платы из этой партии в моей немаленькой коробке легко отличить. Разумеется, я их проверил. Поэтому они легко выделяются из кучи остальных плат. Разумеется, перепилена вся партия (я брал десяток).

Когда мне пришли в десятке плат три штуки, у которых не работал штатный тест: не мигал светодиод (поэтому я теперь проверяю их не выборочно, а тотально), я неделю бодался с продавцом. Что с этим делать, не ясно. Постоянно интересовался, что я хочу сделать, обещал помочь советами. Он «включил дурочку». Значит, они дохлые. А я ему вновь и вновь повторял, что я тупо подключил к питанию, семь плат мигают глазом, три — нет. И так неделю. А он снова свою шарманку. Не проходил штатный тест. Но там же всё было очевидно. Как доказывать, что пришла подделка, не ясно. Здесь же штатный тест проходит, ему много памяти не нужно. В общем, выглядит всё, как безнадёга. А если и удастся доказать, то всё равно же по правилам Ali Express, надо отправлять товар назад. Я у него брал ещё одну партию, уже позже. А главное, конечный продавец не имел злого умысла. Его самого подвели. Там всё хорошо.

Проверяйте платы не только на общую работоспособность, но и на реальные характеристики. Так или иначе, информирую общественность, что вот так бывает. Правда, что делать при несовпадении, не ясно.

Она показывает, как можно быстро найти причину, почему вдруг плата не работает, если дело не в полной неработоспособности контроллера (он откликается по отладочному порту SWD). Статья имеет ещё одну практическую пользу.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть