Полная версия этой страницы:
RESET LPС1768
TAutomatic
Aug 20 2012, 17:38
Непонятки получились с ресетом. При подаче питания контроллер не стартует, только при нажатии на кнопку сброса, она предусмотрена для обновления прошивки. Ножка ресет подтянута на 3.3В резистором 10кОм. Поставил керамику на землю 0,1мкФ, ноль результата. Супервизор питания - тоже самое. Сброс и старт программы только через нажатие кнопки. Да и то не сразу, бывает пару-тройку раз приходится нажать или подержать нажатой 3-4 сек. В чем тут может быть дело?
Altemir
Aug 21 2012, 06:28
А что на ножке P2.10 при старте? Куда подтянута?
TAutomatic
Aug 22 2012, 05:44
Ножка P2.10 тоже подтянута на питание 3.3В через резистор 47кОм. Это моя первая работа на ARM, многих нюансов не знаю. Есть отладочная плата китайского производства, на ней проц стартует без проблем. В разводке на моей плате вроде все нормально, я не новичек. Дляна проводника до кнопки Сброс и резистор около 15мм, не думаю, что это много
shreck
Aug 22 2012, 06:38
Очень многие ARM'ы требуют от источника питания определенной скорости нарастания напряжения. Обеспечивает ли ваш источник это? Неоднократно с таким сталкивался.
TAutomatic
Aug 22 2012, 17:47
Цитата(shreck @ Aug 22 2012, 09:38)

Очень многие ARM'ы требуют от источника питания определенной скорости нарастания напряжения. Обеспечивает ли ваш источник это? Неоднократно с таким сталкивался.
Ваш вопрос вполне уместен. ИП - импульсник на LM2576. Я бы тоже так подумал и гадал. Но свои точки над и ставит супервизор, я его ставил, фронт включения у супервизора, естественно, крутой. Но это не помогает. В том то и проблема. Какая-то строанная ситуация. На первый взгляд - простая.
theBMV
Aug 24 2012, 08:08
Вот мой вариант. Использую постоянно. 10 из 10 при включении. Тот же LM2576, но на 5В и степдаун на 3,3 В 1 А на стабилизаторе IRU1206. Но у меня много периферии на 5 В и на 3,3 В поэтому такие токи. супервизор DS1816 со слежением за 3,3 В. Внутри у него подтяжка 5к на 3,3 В и дергает полевиком на землю. R29 10кОм, у Вас 47 кОм. R30 шунтирующий для правильной работы ISP (чтоб супервизор не мешался программатору ISP). Ну и C39 от нечистой силы
TAutomatic
Aug 24 2012, 17:52
Цитата(theBMV @ Aug 24 2012, 11:08)

Вот мой вариант. Использую постоянно. 10 из 10 при включении. Тот же LM2576, но на 5В и степдаун на 3,3 В 1 А на стабилизаторе IRU1206. Но у меня много периферии на 5 В и на 3,3 В поэтому такие токи. супервизор DS1816 со слежением за 3,3 В. Внутри у него подтяжка 5к на 3,3 В и дергает полевиком на землю. R29 10кОм, у Вас 47 кОм. R30 шунтирующий для правильной работы ISP (чтоб супервизор не мешался программатору ISP). Ну и C39 от нечистой силы

Спасибо, надо разобраться. Уже в понедельник опробую Ваш вариант.
TAutomatic
Aug 26 2012, 16:56
Цитата(TAutomatic @ Aug 24 2012, 20:52)

Спасибо, надо разобраться. Уже в понедельник опробую Ваш вариант.
Похоже, у меня схема практически идентичная. У меня только вопрос к Вам. У Вас используется супервизор с открытым коллектором, судя по документации. А подтяжки наверх нет. Есть толко резистор на ресет, это я так понял, защита от втекающего тока на выход супервизора при использовании ISP. Тогда достаточно было бы и 100 ом, зачем там 10 кОм? Это просто, вопрос для общего развития, зачем вы так сделали? Может я чего то не понимаю.
theBMV
Aug 27 2012, 19:28
В супервизоре внутри подтяжка 5 кОм. Он не с открытым коллектором

Ну а 10 кОм последовательно - так туда можно меньше, всё правильно. Это шунтирующий, чтобы втекающий в супервизор ток в момент сброса супервизором не влиял на Reset при подключенном ISP.
TAutomatic
Aug 31 2012, 07:19
Цитата(theBMV @ Aug 27 2012, 22:28)

В супервизоре внутри подтяжка 5 кОм. Он не с открытым коллектором
Ну а 10 кОм последовательно - так туда можно меньше, всё правильно. Это шунтирующий, чтобы втекающий в супервизор ток в момент сброса супервизором не влиял на Reset при подключенном ISP.
Просто в даташите написано 3.3v Econoreset With Open Drain Output. Ну да Бог с ним, не в этом дело. У Вас работает так, да и хорошо. Дело в другом, собрали второй экземпляр устройства-там сброс работает нормально. Интересно, в чем разница. Схема и номиналы элементов, естественно, одинаковые.
stoker
Sep 28 2012, 16:43
Была похожая проблема. Из 5 плат одна показывала все выше описанные симптомы, кстати, проявились они не сразу. Причину проблемы не нашел, просто перепаял контроллер и всё заработало как часы.
Не уверен про LPC, но к STM32 категорически запрещено цеплять внешние конденсаторы на ресет (или только для фильтрации помех если сигнал ресета на длинной линии и то - не боле 10нФ). Внутренний источник сброса дергает линию вниз на несколько десятков мкс и в вашем случае, возможно, конденсатор не успевает разрядиться через слабенький мосфет внутреннего ресета и сброса не случается.
Смущает очень медленный внешний сброс у LPC1768. Приблизительно 5-7 секунд! Для сброса используется формирователь MCP130T-300I, который формирует 300 ms импульс. Какие догадки?
KnightIgor
Oct 3 2012, 17:32
Цитата(TAutomatic @ Aug 20 2012, 19:38)

Непонятки получились с ресетом. При подаче питания контроллер не стартует, только при нажатии на кнопку сброса, она предусмотрена для обновления прошивки. Ножка ресет подтянута на 3.3В резистором 10кОм. Поставил керамику на землю 0,1мкФ, ноль результата. Супервизор питания - тоже самое. Сброс и старт программы только через нажатие кнопки. Да и то не сразу, бывает пару-тройку раз приходится нажать или подержать нажатой 3-4 сек. В чем тут может быть дело?
Может у вас генератор нестабилен?
Цитата(AlexPo @ Oct 3 2012, 20:38)

Смущает очень медленный внешний сброс у LPC1768. Приблизительно 5-7 секунд! Для сброса используется формирователь MCP130T-300I, который формирует 300 ms импульс. Какие догадки?
Частота токового генератора в пределах нормы? Могу Вам предложить замерять время захвата PLL. Т.е. инициализируете МК на внутреннем RC, инициализируете TMR0, и
Код
.
.
.
T0TC = 0;
while(!PLL0STAT_bit.PLOCK);
uTime = T0TC;
.
.
.
потом uTime посмотрите.
AlexPo
Oct 17 2012, 06:57
Решил отписаться по по поводу медленного сброса. Возможно будет полезно.
В программе была объявлена глобальная переменная (экземпляр класса) с инициализацией большого массива. Вызов конструктора осуществлялся в low_level_init до (!!!) включения основного генератора и инициализации PLL. Таким образом, большой объем работы выполнялся на частоте IRC. Естественно, решил создавать переменную динамически после инициализации PLL. Вся работа теперь осуществляется на частоте 100 МГц вместо 4-х!
Кстати! Некорректная работа с указателями при инициализации переменных в low_level_init может приводить к выбросу исключения. А поскольку, состояние памяти случайно, то и ошибка может возникать нерегулярно.
P.S. Спасибо theBMV.
Terminator
Oct 22 2012, 05:24
Не стал заводить ещё одну тему. Спрошу тут.
Как правильно программно перезапустить 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
);
Прошивка перезапускается, но виснет в процессе загрузки. Если передёрнуть питания, то стартует нормально.
Сергей Борщ
Oct 22 2012, 06:07
QUOTE (Terminator @ Oct 22 2012, 08:24)

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

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

for (int i = 0; i < 35; i++)
{
NVIC_DisableIRQ((IRQn_Type) i);
NVIC_ClearPendingIRQ((IRQn_Type) i);
}
Ужас просто....
К чему приводит нежелание учить матчасть и упорное пользование всякими либами....
На вышеозначенном проце данные операции (и disable и clearpending) выполняются всего по две пары записей в регистры NVIC.
Terminator
Oct 22 2012, 08:43
Цитата(Сергей Борщ @ 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 сработал.
stoker
Oct 30 2012, 12:13
я использую для сброса NVIC_SystemReset();
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.