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