|
|
  |
stm32 NVIC: сброс маскировки прерываний внутри обработчика |
|
|
|
Jul 25 2017, 12:30
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ Jul 25 2017, 15:02)  Да ладно?!! Они умудрились написать код чисто на регистрах и без использования стека??? Прямо чудеса чудесатые какие-то рассказываете.....  Вы ничего не путаете?  В STM32 есть два спец пина BOOT0 и BOOT1, оменно они определяют кто будет запускаться при старте проца: user-код (User Flash memory), boot-загручик (System memory), ОЗУ или еще что-то (например, в "толстых" камнях). Опрос этих пинов производится ядром (или узлом, который отвечает за выбор области загрузки) в течение нескольких тактов после сброса. Но даже в случае безусловного использования бут-загручика можно выяснить области ОЗУ, которые он использует. А используют они совсем небольшую часть ОЗУ. Это не секретная информация  Все есть в соотв. мануалах )) Еще раз: BOOT-загрузчик в STM32 НЕ стартует безусловно. Более того, в тотально залоченном состоянии бут вообще невозможно запустить (разве что прочитать его версию): When readout protection Level2 is activated, STM32 does not boot on system memory in any case and Bootloader can't be executed (unless jumping to it from Flash user code, all commands are not accessible except Get, GetID, and GetVersion).Может, вы путаете STM32 с другими камнями (которые без своей FLASH), где BOOT стартует ВСЕГДА после сброса?
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jul 25 2017, 13:15
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Forger @ Jul 25 2017, 15:30)  Вы ничего не путаете?  В AN2606 в Table 66. STM32F42xxx/43xxx configuration in system memory boot mode указано, что 8 Kbyte starting from address 0x20000000 are used by the bootloader firmware. И эта область указана как Common to all bootloaders. Также видно, что указатель стека из вектора сброса из таблицы векторов прерываний в ROM по адресу 0x1FFF0000 (из STM32F429 который у меня сейчас на столе) указывает на адрес 0x20002318 опять-же - внутри этих 8КБ. Вот именно этот код, который считывает BOOT-пины и определяет куда передать управление (и возможно что-то ещё делает), видимо и находится по адресу, на который указывает вектор сброса из 0x1FFF0000. PS: Не посчитал однако... 0x20002318 - это ведь уже за пределами 8КБ. Странно....  Опять-же - в AN2606 говорится про Bootloader V7.x. А какая у моего версия - не знаю.
|
|
|
|
|
Jul 25 2017, 13:20
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ Jul 25 2017, 16:15)  В AN2606 в Table 66. STM32F42xxx/43xxx configuration in system memory boot mode указано, что 8 Kbyte starting from address 0x20000000 are used by the bootloader firmware. И эта область указана как Common to all bootloaders. Также видно, что указатель стека из вектора сброса из таблицы векторов прерываний в ROM по адресу 0x1FFF0000 (из STM32F429 который у меня сейчас на столе) указывает на адрес 0x20002318 опять-же - внутри этих 8КБ. Дык, я с этим и не спорю, в прошлом посте я дал ссылку на большой документ, где это написано. Вот только это имеет отношение только для случая, если boot загручик был запущен. Цитата Вот именно этот код, который считывает BOOT-пины и определяет куда передать управление (и возможно что-то ещё делает), видимо и находится по адресу, на который указывает вектор сброса из 0x1FFF0000. Вы не понимате ))) Нету никакого кода, который якобы считывает эти два пина. Это все сделано аппаратно. И происходит это в первые 4 такта проца после сброса. Это указано в мануале на каждый проц: The boot mode configuration is latched on the 4th rising edge of SYSCLK after a reset. It is up to the user to set boot mode configuration related to the required boot mode.Даже если бы эти пины опрашивались в неком коде, то даже гипотетически невозможно создать такой код, который бы за 4 такта умудрился проинитить хотя бы стек, настроить пару пинов и прочитать их содержимое  Кстати, вот это только что выяснил: The boot mode configuration is also re-sampled when exiting from Standby mode, на будущее надо учесть!
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jul 25 2017, 13:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ Jul 25 2017, 16:25)  boot / не-boot - вопрос не в том, Вопрос был как раз именно "в том": Цитата(jcxz) Да ладно?!! Они умудрились написать код чисто на регистрах и без использования стека??? Прямо чудеса чудесатые какие-то рассказываете..... Чудес не бывает, но бывает недостаточно внимательное чтение мануалов Цитата ...а в том - какая ОЗУ портится при старте. Дык, если сам user-код гадит под себя портит ОЗУ, то все вопросы к этому самому коду! Но это РЕШАЕМО (способов несколько).
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jul 25 2017, 13:33
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Forger @ Jul 25 2017, 16:29)  Дык, если сам user-код гадит под себя портит ОЗУ, то все вопросы к этому самому коду! Вопрос не про пользовательский код. А именно про boot-ROM. И в каких случаях и где он портит. Цитата(Forger @ Jul 25 2017, 16:31)  Вы не со мной спорите, а с мануалом от ST. Имхо, это бессмысленно  Я не спорю с мануалом. Выдержку из него я привёл выше. В которой указывается, что "8 Kbyte starting from address 0x20000000 are used by the bootloader firmware". Как там написано, так и читаю. К тому же там сказано про бутлоадер версии v7, а какой у меня - не знаю.
|
|
|
|
|
Jul 25 2017, 13:48
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ Jul 25 2017, 16:32)  Вопрос не про пользовательский код. А именно про boot-ROM. И в каких случаях и где он портит. Если не разрешать запуск boot, то содержимое SRAM не пострадает. Но какой смысл запускать принудительно бут код, если в проце уже зашита рабочая прога и ее не нужно обновлять средствами бут-загрузчика? Цитата Выдержку из него я привёл выше. В которой указывается, что "8 Kbyte starting from address 0x20000000 are used by the bootloader firmware". А вы остальное почитайте, в частности раздел "Boot configuration". Ссылку на более полный документ я приводил выше. Там уже расписано про все возможные бут-загручики любых STM32. В т.ч. указано, какую и где память использует, сколько времени нужно на старт и какие условия необходимы для запуска загрузчика. Не пойму, к чему этот спор? Вот еще кое-что полезно для себя нашел, может, тоже кому пригодится: Empty check On ХХХХХХ devices only, internal empty check flag is implemented to allow easy programming of the virgin devices by the boot loader. This flag is used when BOOT0 pin is defining Main Flash memory as the target boot space. When the flag is set, the device is considered as empty and System memory (boot loader) is selected instead of the Main Flash as a boot space to allow user to program the Flash memory.Т. е. этот тот самый случай, когда бутзагрузчик запускается безусловно не взирая на состояние BOOT0. Но все же одно условие для этого нужно выполнить - флэш должна быть полностью стерта  В одном из моих нынешних проектов это оказалось очень даже актуально, очень ... Сорри за офф ))))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Aug 3 2017, 09:28
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (jcxz @ Jul 25 2017, 16:33)  Вопрос не про пользовательский код. А именно про boot-ROM. И в каких случаях и где он портит. Предположим, что бут-код стартует всегда и выбор режима дальнейшей работы осуществляется программно (тем более что у STM32F042 это именно так). что мешает осуществить эту проверку без стека и переменных? Это же буквально десяток асмовых команд (кстати, латч ножек Boot на 4 такт sysclk какбэ намекает). В общем не буду толочь воду в ступе - на всех виденных мной STM32 содержимое SRAM полностью сохраняется при сбросе, если ножками/фьюзами выбрана загрузка из флеша. QUOTE Т. е. этот тот самый случай, когда бутзагрузчик запускается безусловно не взирая на состояние BOOT0. Но все же одно условие для этого нужно выполнить - флэш должна быть полностью стерта  Достаточно стертого вектора reset
Сообщение отредактировал LightElf - Aug 3 2017, 09:31
|
|
|
|
|
Aug 3 2017, 09:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(LightElf @ Aug 3 2017, 12:28)  Предположим, что бут-код стартует всегда и выбор режима дальнейшей работы осуществляется программно (тем более что у STM32F042 это именно так). Предполагать бессмысленно, все факты описаны в даташитах - выбор места старта выбирается неким аппаратным узлом, который НЕ является частью заводского бутзагрузчика. Это по сути простейший автомат состояний, который размещен прямо на кристалле, он совсем крохотный, поэтому встроен в каждый STM, отключить его нельзя (а смысл?). Он лишь, так сказать, "корректирует" вектор сброса перед запуском ядра. Цитата В общем не буду толочь воду в ступе - на всех виденных мной STM32 содержимое SRAM полностью сохраняется при сбросе, если ножками/фьюзами выбрана загрузка из флеша. Именно! Более того, в SRAM судя по всему нет аппаратного сброса, поскольку, судя по даташитам, после подачи питания там "мусор". Цитата Достаточно стертого вектора reset Есть такое, вот тут нашел подтверждение: Цитата Empty check (category 1 devices only) On category 1 devices, an internal empty check flag is implemented to allow easy programming of virgin devices by the bootloader. This flag is used when BOOT0 pin is configured to select Flash program memory as target boot area. When this flag is set, the device is considered as unprogrammed and the system memory (bootloader) is selected as boot area instead of the Flash program memory to allow the application to program the Flash memory. The empty check flag is updated only when the option bytes are loaded: it is set when the content of address 0x8000 0000 is read as 0x0000 0000 and cleared otherwise. As a result, only a power-on reset or setting OBL_LAUNCH bit in FLASH_CR register can clear this flag after programming a virgin device to execute user code after system reset. Но этот флажок реализован не во всех STM32, в "старых" семействах, увы, он не реализован ((
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|