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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> RESET LPС1768, Не выполняется старт
AlexPo
сообщение Oct 17 2012, 06:57
Сообщение #16





Группа: Участник
Сообщений: 11
Регистрация: 26-07-05
Пользователь №: 7 090



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

P.S. Спасибо theBMV.
Go to the top of the page
 
+Quote Post
Terminator
сообщение Oct 22 2012, 05:24
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



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

Как правильно программно перезапустить 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 - Oct 22 2012, 05:25
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 22 2012, 06:07
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Terminator @ Oct 22 2012, 08:24) *
Как правильно программно перезапустить lpc1768 ?
Использовать бит SYSRESETREQ регистра AIRCR или сброс по срабатыванию собаки путем ее запуска и записи в нее неправильного ключа.

QUOTE (Terminator @ Oct 22 2012, 08:24) *
Прошивка перезапускается, но виснет в процессе загрузки
Значит где-то в процессе инициализации предполагается начальное состояние какого-либо регистра, а после вашего "перезапуска" состояние этого регистра изменено. Например, в настройках PLL. А некоторые регистры вообще не реагируют на повторную запись, например - регистр управления собакой. Поэтому программно вернуть проц полностью в исходное состояние другими методами невозможно - только вызвав честный сброс одним из двух вышеупомянутых методов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 22 2012, 06:56
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Terminator @ Oct 22 2012, 11:24) *
for (int i = 0; i < 35; i++)
{
NVIC_DisableIRQ((IRQn_Type) i);
NVIC_ClearPendingIRQ((IRQn_Type) i);
}

Ужас просто....
К чему приводит нежелание учить матчасть и упорное пользование всякими либами.... smile3046.gif
На вышеозначенном проце данные операции (и disable и clearpending) выполняются всего по две пары записей в регистры NVIC.
Go to the top of the page
 
+Quote Post
Terminator
сообщение Oct 22 2012, 08:43
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Цитата(Сергей Борщ @ Oct 22 2012, 13:07) *
Использовать бит SYSRESETREQ регистра AIRCR или сброс по срабатыванию собаки путем ее запуска и записи в нее неправильного ключа.


Цитата
Note: support for
SYSRESETREQ is not included in LPC17xx devices.
This bit reads as 0.

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

Цитата(Сергей Борщ @ Oct 22 2012, 13:07) *
Значит где-то в процессе инициализации предполагается начальное состояние какого-либо регистра, а после вашего "перезапуска" состояние этого регистра изменено. Например, в настройках PLL. А некоторые регистры вообще не реагируют на повторную запись, например - регистр управления собакой. Поэтому программно вернуть проц полностью в исходное состояние другими методами невозможно - только вызвав честный сброс одним из двух вышеупомянутых методов.

Вроде всё уже перерыл.
Буду копать дальше ...

P. S. однако SYSRESETREQ сработал.
Go to the top of the page
 
+Quote Post
stoker
сообщение Oct 30 2012, 12:13
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 469



я использую для сброса NVIC_SystemReset();
Go to the top of the page
 
+Quote Post

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

 


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


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