реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ST32 UART bootloader (embedded), Как вытащить информацию об объеме ПЗУ?
Sergey_Aleksandr...
сообщение May 30 2012, 14:35
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Стал ковырять встроенный в 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?
Go to the top of the page
 
+Quote Post
Berserker
сообщение Sep 4 2012, 11:00
Сообщение #2





Группа: Участник
Сообщений: 14
Регистрация: 16-06-07
Из: Москва пока
Пользователь №: 28 485



Цитата(Sergey_Aleksandrovi4 @ May 30 2012, 18:35) *
Вот, собстенно, теперь вопросы.
1. Как хост по данным п.п. 1.6 и п.п. 2.3 (0x80 0x00) понимает, что памяти на борту 128 кБайт, откуда берётся этот адрес 0x1FFFF7E0 в области System memory? Он как-то вычисляется или описан в каком-либо из AppNote?


Возможно просто каждому "Processor ID" соотвествует таблица его параметров, в т.ч. размер памяти на борту.
Go to the top of the page
 
+Quote Post
YAM
сообщение Sep 5 2012, 16:51
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 7-07-04
Из: Ukraine
Пользователь №: 291



Цитата(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.


--------------------
Go to the top of the page
 
+Quote Post
eav1978
сообщение Sep 7 2012, 13:35
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 57
Регистрация: 13-01-07
Из: Санкт-Петербург
Пользователь №: 24 409



Цитата
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
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Jan 16 2013, 11:13
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Всем спасибо за помощь! Спустя время вернулся к затее написания собственной оболочки для первичного программирования через 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 пишутся верно, проверено программатором.
Буду очень признателен тому, кто подскажет как обойти эти две беды.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 02:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01321 секунд с 7
ELECTRONIX ©2004-2016