Перейти к содержанию
    

ST32 UART bootloader (embedded)

Стал ковырять встроенный в 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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот, собстенно, теперь вопросы.

1. Как хост по данным п.п. 1.6 и п.п. 2.3 (0x80 0x00) понимает, что памяти на борту 128 кБайт, откуда берётся этот адрес 0x1FFFF7E0 в области System memory? Он как-то вычисляется или описан в каком-либо из AppNote?

 

Возможно просто каждому "Processor ID" соотвествует таблица его параметров, в т.ч. размер памяти на борту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно просто каждому "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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо за помощь! Спустя время вернулся к затее написания собственной оболочки для первичного программирования через 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 пишутся верно, проверено программатором.

Буду очень признателен тому, кто подскажет как обойти эти две беды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...