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

Решил отписаться по по поводу медленного сброса. Возможно будет полезно.

В программе была объявлена глобальная переменная (экземпляр класса) с инициализацией большого массива. Вызов конструктора осуществлялся в low_level_init до (!!!) включения основного генератора и инициализации PLL. Таким образом, большой объем работы выполнялся на частоте IRC. Естественно, решил создавать переменную динамически после инициализации PLL. Вся работа теперь осуществляется на частоте 100 МГц вместо 4-х!

Кстати! Некорректная работа с указателями при инициализации переменных в low_level_init может приводить к выбросу исключения. А поскольку, состояние памяти случайно, то и ошибка может возникать нерегулярно.

 

P.S. Спасибо theBMV.

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


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

Не стал заводить ещё одну тему. Спрошу тут.

 

Как правильно программно перезапустить lpc1768 ?

Щас используется такой код:

    DBGSTRINFO("Reset!\n\n\n\n");
    portDISABLE_INTERRUPTS();
    for (int i = 0; i < 35; i++)
    {
        NVIC_DisableIRQ((IRQn_Type) i);
        NVIC_ClearPendingIRQ((IRQn_Type) i);
    }
    SCB->VTOR = 0x0; //bootloader_start_addr;
    asm volatile
    (
        "ldr r0, =0    \n"
        "msr control, r0 \n" // init control reg like reset did
        "ldr r0, =0x0 \n"
        "ldr sp, [r0] \n"//init stack pointer reg on start_bootloader_addr
        "ldr r0, =0x4 \n"
        "ldr pc, [r0] \n"//init program counter reg on start_bootloader_addr+4 - jump to user code
    );

 

Прошивка перезапускается, но виснет в процессе загрузки. Если передёрнуть питания, то стартует нормально.

Изменено пользователем Terminator

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


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

Как правильно программно перезапустить lpc1768 ?
Использовать бит SYSRESETREQ регистра AIRCR или сброс по срабатыванию собаки путем ее запуска и записи в нее неправильного ключа.

 

Прошивка перезапускается, но виснет в процессе загрузки
Значит где-то в процессе инициализации предполагается начальное состояние какого-либо регистра, а после вашего "перезапуска" состояние этого регистра изменено. Например, в настройках PLL. А некоторые регистры вообще не реагируют на повторную запись, например - регистр управления собакой. Поэтому программно вернуть проц полностью в исходное состояние другими методами невозможно - только вызвав честный сброс одним из двух вышеупомянутых методов.

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


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

for (int i = 0; i < 35; i++)

{

NVIC_DisableIRQ((IRQn_Type) i);

NVIC_ClearPendingIRQ((IRQn_Type) i);

}

Ужас просто....

К чему приводит нежелание учить матчасть и упорное пользование всякими либами.... :smile3046:

На вышеозначенном проце данные операции (и disable и clearpending) выполняются всего по две пары записей в регистры NVIC.

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


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

Использовать бит SYSRESETREQ регистра AIRCR или сброс по срабатыванию собаки путем ее запуска и записи в нее неправильного ключа.

 

Note: support for

SYSRESETREQ is not included in LPC17xx devices.

This bit reads as 0.

Это из мануала к процу.

 

Значит где-то в процессе инициализации предполагается начальное состояние какого-либо регистра, а после вашего "перезапуска" состояние этого регистра изменено. Например, в настройках PLL. А некоторые регистры вообще не реагируют на повторную запись, например - регистр управления собакой. Поэтому программно вернуть проц полностью в исходное состояние другими методами невозможно - только вызвав честный сброс одним из двух вышеупомянутых методов.

Вроде всё уже перерыл.

Буду копать дальше ...

 

P. S. однако SYSRESETREQ сработал.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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