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

STM32: сброс всей периферии перед переходом из загрузчика в основную прошивку

ножка? Одна единственная на кнопке? Которая и в основной программе остается такой же?

 

Ну вообще да флаг через EEPROM, Еще PLL настроить, но это делается и в основной проге, просто данный момент пропускается...

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


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

Флаг надо както передать. EEPROM?

Зачем EEPROM? При "теплом" сбросе содержимое ОЗУ на чипе сохраняется.

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


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

ножка? Одна единственная на кнопке? Которая и в основной программе остается такой же?

 

Ну вообще да флаг через EEPROM, Еще PLL настроить, но это делается и в основной проге, просто данный момент пропускается...

Не только ножка. Состояние прерываний остается тем же.

То есть, если они запрещены, то в основной программе надо explicitly разрешать.

По прежнему не вижу большого смысла в выполенении ресета

 

Зачем EEPROM? При "теплом" сбросе содержимое ОЗУ на чипе сохраняется.

А в чем разница?

Разве не по офному и тому же аддрессу переход происходит пристарте?

Каким волшебным образом при холодном старте обнуляется RAM, если

не самой программой?

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


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

от ресета внутренне спокойно...

 

 

вот что кеил написал в хелпе

__disable_fiq

 

Typically, this intrinsic disables FIQ interrupts by setting the F-bit in the CPSR. However, for v7-M it sets the fault mask register (FAULTMASK). FIQ interrupts are not supported in v6-M.

 

то есть на самом деле это от 7 армов тянется, и несмотря что FIQ сменилось с быстрых на ошибочные, это все равно не для кортексов М

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


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

ну то есть надо понимать что осталось одно

__disable_irq();

которое глушит все кроме ресета и NMI?

Почему? __disable_irq() это :

CPSID i ; Disable interrupts and configurable fault handlers (set PRIMASK)

HardFault не запрещается после __disable_irq.

HardFault запретится после CPSID f.

Вроде так выходит...

 

А в чем разница?

Разве не по офному и тому же аддрессу переход происходит пристарте?

Каким волшебным образом при холодном старте обнуляется RAM, если

не самой программой?

Обнуляется программой...Можно зарезервировать ячейку в ОЗУ и проверять её на старте и в зависимости от её значения решать что делать дальше - запускать программу, запускать бут или ещё что-то.

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


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

путано написано, в описании на проц LPC1768, в части про кортекс м3 есть запись про HARDFAULTMASK, в наборе инструкций кортекса м3 есть такое... В описании на серию кортексов М0-4, нету... даже нет HardFaule Mask регистра....

 

и как это понимать?

поправочка-------------

 

http://infocenter.arm.com/help/index.jsp?t...a/CHDBIBGJ.html

у М3, и М4 есть, называется FAULTMASK, и флажочек тоже есть

 

The FAULTMASK register prevents activation of all exceptions except for Non-Maskable Interrupt (NMI). See the register summary in Table 2.2 for its attributes. The bit assignments are:

получается его одного достаточно чтобы все выключить? даже примаск?

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


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

путано написано, в описании на проц LPC1768, в части про кортекс м3 есть запись про HARDFAULTMASK, в наборе инструкций кортекса м3 есть такое...

В каком пункте мануала про HARDFAULTMASK написано?

 

получается его одного достаточно чтобы все выключить? даже примаск?

Получается достаточно - кроме NMI и Reset.

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


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

Обнуляется программой...Можно зарезервировать ячейку в ОЗУ и проверять её на старте и в зависимости от её значения решать что делать дальше - запускать программу, запускать бут или ещё что-то.

Это значит надо писать собственный startup файл.

Тоже можно, конечно.. Но по мне так это уже извращения пошли.

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


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

Это значит надо писать собственный startup файл.

Тоже можно, конечно.. Но по мне так это уже извращения пошли.

Стартапа бояться - загрузчик не писать. Ну что за цирк, ей-богу :-)

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


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

Стартапа бояться - загрузчик не писать. Ну что за цирк, ей-богу :-)

А мы без всяких самодельных стартапов и ресетов обошлись.

Чем больше меняешь, тем больше багов.

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


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

Это значит надо писать собственный startup файл.

Тоже можно, конечно.. Но по мне так это уже извращения пошли.

Можно отредактировать startup, который есть: всего-то несколько строк добавить.

               if ((FlashCrcOk()) && (StartType==START_APPLICATION)) {
        __disable_irq();
        __set_MSP(*(uint32_t *)0x1008);
        ISRPtr application_reset_handler=(ISRPtr)(*(uint32_t *)0x100C);
        goto *application_reset_handler;
               
                }

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


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

А мы без всяких самодельных стартапов и ресетов обошлись.

Чем больше меняешь, тем больше багов.

На самом деле бывает полезно разбираться в стартапе. Тем более на Cortex-M минимальный стартап - это всего несколько строчек:

#include <string.h>

extern char __etext, __data_start__, __data_end__, __bss_start__, __bss_end__;
extern int main();

void __attribute((used))
Reset_Handler(void)
{
       /* copy-init variables */
       memcpy(&__data_start__, &__etext, &__data_end__ - &__data_start__);
       /* zero-init variables */
       memset(&__bss_start__, 0, &__bss_end__ - &__bss_start__);
       (void)main();
}

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


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

Это не стартап, это ресет хэндлер.

Никто не спорит про разобратся, но переделывать не вижу смысла.

 

В любом случае, как обслуживать ситуацию,

когда в данной ячейке при холодном старте флаг случайно совпал с тем, который выставляется

для прыгания в главную программу?

Может еще один флаг добавим?

Может, CRC считать начнем?

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


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

Это не стартап, это ресет хэндлер.

Ну так стартап состоит из двух частей - таблицы векторов и Reset_Handler-а. Таблица у каждого МК своя и её менять не надо.

 

В любом случае, как обслуживать ситуацию,

когда в данной ячейке при холодном старте флаг случайно совпал с тем, который выставляется

для прыгания в главную программу?

Маловероятно...

 

Может еще один флаг добавим?

Может, CRC считать начнем?

К тому же CRC прошивки посчитать всё равно желательно, а то вдруг там пусто.

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


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

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

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

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

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

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

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

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

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

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