AlexPo 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Решил отписаться по по поводу медленного сброса. Возможно будет полезно. В программе была объявлена глобальная переменная (экземпляр класса) с инициализацией большого массива. Вызов конструктора осуществлялся в low_level_init до (!!!) включения основного генератора и инициализации PLL. Таким образом, большой объем работы выполнялся на частоте IRC. Естественно, решил создавать переменную динамически после инициализации PLL. Вся работа теперь осуществляется на частоте 100 МГц вместо 4-х! Кстати! Некорректная работа с указателями при инициализации переменных в low_level_init может приводить к выбросу исключения. А поскольку, состояние памяти случайно, то и ошибка может возникать нерегулярно. P.S. Спасибо theBMV. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 22 октября, 2012 Опубликовано 22 октября, 2012 (изменено) · Жалоба Не стал заводить ещё одну тему. Спрошу тут. Как правильно программно перезапустить 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 ); Прошивка перезапускается, но виснет в процессе загрузки. Если передёрнуть питания, то стартует нормально. Изменено 22 октября, 2012 пользователем Terminator Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 22 октября, 2012 Опубликовано 22 октября, 2012 · Жалоба Как правильно программно перезапустить lpc1768 ?Использовать бит SYSRESETREQ регистра AIRCR или сброс по срабатыванию собаки путем ее запуска и записи в нее неправильного ключа. Прошивка перезапускается, но виснет в процессе загрузкиЗначит где-то в процессе инициализации предполагается начальное состояние какого-либо регистра, а после вашего "перезапуска" состояние этого регистра изменено. Например, в настройках PLL. А некоторые регистры вообще не реагируют на повторную запись, например - регистр управления собакой. Поэтому программно вернуть проц полностью в исходное состояние другими методами невозможно - только вызвав честный сброс одним из двух вышеупомянутых методов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 22 октября, 2012 Опубликовано 22 октября, 2012 · Жалоба for (int i = 0; i < 35; i++) { NVIC_DisableIRQ((IRQn_Type) i); NVIC_ClearPendingIRQ((IRQn_Type) i); } Ужас просто.... К чему приводит нежелание учить матчасть и упорное пользование всякими либами.... :smile3046: На вышеозначенном проце данные операции (и disable и clearpending) выполняются всего по две пары записей в регистры NVIC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 22 октября, 2012 Опубликовано 22 октября, 2012 · Жалоба Использовать бит SYSRESETREQ регистра AIRCR или сброс по срабатыванию собаки путем ее запуска и записи в нее неправильного ключа. Note: support for SYSRESETREQ is not included in LPC17xx devices. This bit reads as 0. Это из мануала к процу. Значит где-то в процессе инициализации предполагается начальное состояние какого-либо регистра, а после вашего "перезапуска" состояние этого регистра изменено. Например, в настройках PLL. А некоторые регистры вообще не реагируют на повторную запись, например - регистр управления собакой. Поэтому программно вернуть проц полностью в исходное состояние другими методами невозможно - только вызвав честный сброс одним из двух вышеупомянутых методов. Вроде всё уже перерыл. Буду копать дальше ... P. S. однако SYSRESETREQ сработал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stoker 0 30 октября, 2012 Опубликовано 30 октября, 2012 · Жалоба я использую для сброса NVIC_SystemReset(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться