Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ST32 UART bootloader (embedded)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Sergey_Aleksandrovi4
Стал ковырять встроенный в STM32 UART-загрузчик. Не могу понять, как вытащить из МК информацию о размере Flash.
Почитал AN2606 "STM32™ microcontroller system memory boot mode" и AN3155 "USART protocol used in the STM32™ bootloader". Скачал демонстрационную программу "Flash Loader Demonstrator". Снял лог обмена по UART. Приведу только коды команд и параметры без ACK и проверочных сумм.
Первый этап обмена
Код
1. 0x7F - инициация загрузчика и определение битрейта.
2. 0x00 -> [список поддерживаемых загрузчиком команд]
3. 0x02 -> получил Processor ID  0x0420. По AN2606 это "Mediumdensity value line" - всё верно
4. 0x02   зачем то второй раз запрос PID
5. 0x11  0x08000000  0x03 -> чтение 4 байт из начала Flash. Это Stack Pointer. Ответ 0x20000410.
6. 0x11  0x1FFFF7E0  0x1   -> чтение 2 байт из System memory со смещением 0x20 от её конца (0x1FFFF800)   Ответ 0x80 0x00

После этого этапа программа знает размер Flash (128 кБайт)

Второй этап
Код
1,2. 0x02 -> опять дважды получил Processor ID  0x0420
3. Опять прочитали 2 байта из System memory (см. п.п. 1.6)   Ответ 0x80 0x00
4. 0x00 -> Опять получили список поддерживаемых загрузчиком команд (см. п.п. 1.2)
5. 0x11  0x1FFFF7D6  0x1   -> чтение 2 байт из System memory со смещением 0x2A от её конца (0x1FFFF800)   Ответ 0x10 0x00
6. 0x11  0x1FFFF800  0x0F  -> чтение 16 байт из Option byte area (в общем прочитали все "фьюзы")


Вот, собстенно, теперь вопросы.
1. Как хост по данным п.п. 1.6 и п.п. 2.3 (0x80 0x00) понимает, что памяти на борту 128 кБайт, откуда берётся этот адрес 0x1FFFF7E0 в области System memory? Он как-то вычисляется или описан в каком-либо из AppNote?
2. Что за 2 байта читается в п.п. 2.5 по адресу 0x1FFFF7D6 в области System memory? Что это за адрес, где найти описание.
3. Зачем хосту требуется знать значение Stack Pointer (читается в п.п. 1.5)?

PS Если уже обсуждалось или описано в каком-либо мануале - ткните носом пожалуйста.

PPS По поводу вопроса №1. Это видимио число в формате Little endian 0x0080, т.е. 128. Вот он размер Flah. Толкьо что это на самом деле: размер в кБайтах или число страниц (в Value Line страница как раз 1 кБайт). Но откуда взялся этот "магический" адрес? В МК с другим размером System memory по каким адресам искать информацию о размере Flash?
Berserker
Цитата(Sergey_Aleksandrovi4 @ May 30 2012, 18:35) *
Вот, собстенно, теперь вопросы.
1. Как хост по данным п.п. 1.6 и п.п. 2.3 (0x80 0x00) понимает, что памяти на борту 128 кБайт, откуда берётся этот адрес 0x1FFFF7E0 в области System memory? Он как-то вычисляется или описан в каком-либо из AppNote?


Возможно просто каждому "Processor ID" соотвествует таблица его параметров, в т.ч. размер памяти на борту.
YAM
Цитата(Berserker @ Sep 4 2012, 14:00) *
Возможно просто каждому "Processor ID" соотвествует таблица его параметров, в т.ч. размер памяти на борту.

Ну конечно, никто даташиты не читает.....
Из RM0008 = Reference manual
30.1 Memory size registers
30.1.1 Flash size register
Base address: 0x1FFF F7E0
Flash memory size of the device in Kbytes.
Example: 0x0080 = 128 Kbytes.
eav1978
Цитата
2. Что за 2 байта читается в п.п. 2.5 по адресу 0x1FFFF7D6 в области System memory? Что это за адрес, где найти описание.

Смотри в AN2606 "STM32™ microcontroller system memory boot mode" страница 11(у меня по крайней мере).
По адресу 0x1FFFF7D6 лежит Bootloader ID конкретно v1.0 (0x0010) для Medium-density value line
Sergey_Aleksandrovi4
Всем спасибо за помощь! Спустя время вернулся к затее написания собственной оболочки для первичного программирования через UART. Сижу, ломаю голову над такой проблемой.
1. Если установлен бит защиты от чтения, то узнать это прямыми способами не выходит. Прочитать область OptionBytes нельзя: команда Read Memory (0x11) искусственно заблокирована загрузчиком - возвращает NACK, команда Get Version & Read Protection Status (0x01) возвращает всегда 0. Обощёл пока так: читаю память, если не читается (на опкод возвращается NACK) считаю память залоченной и пытаюсь разблокировать -> проблема 2.
2. Выполнение команд Readout Unprotect (0x92) или Write Unprotect (0x73) сводится к тому, что загрузчик стирает всю Option Byte область (0xFF) и записывает только первый байт RDP и его XOR-дополнение. Т.е. дополнительные по XOR проверочные байты для оставшихся семи "фьюзов" неверны. Пытался вручную (команда Write Memory 0x31) писать корректные данные в Option Byte - процессор зависает. Но при этом Option Byte пишутся верно, проверено программатором.
Буду очень признателен тому, кто подскажет как обойти эти две беды.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.