Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вотчдог у LPC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AirDevil
Доброго времени.

Настраиваю вотчдог от внешнего кварца (Selects the APB peripheral clock (PCLK)).
Всего один раз заметил такую вещь:
При сбросе мк от вотчдога, прыгнул в 0 и далее застрял на защелкивании внешнего кварца.
После этого проц так и стоял в этом положении не сбрасываясь.
Это было в режиме дебаг. Вот теперь думаю как быть.
zltigo
Цитата(AirDevil @ Jun 2 2009, 20:42) *
Это было в режиме дебаг.

smile.gif типа копаясь в потрохах контроллера, слегка стуча по периферии через JTAG и притормаживая ядро я добился каког-то эффекта c контроллерной периферией.... Неужели это случилось с Вами впервые?
AirDevil
Цитата(zltigo @ Jun 3 2009, 00:02) *
smile.gif типа копаясь в потрохах контроллера, слегка стуча по периферии через JTAG и притормаживая ядро я добился каког-то эффекта c контроллерной периферией.... Неужели это случилось с Вами впервые?

В этих камнях ни разу еще до этого момента не использовал вотчдог. Разве что только для перезагрузки камня.
йа понял. Вы только скажите, возможна ли такая ситуация в релизе.
Может стоит выбрать другой ватчдог таймер клок сурс?
Вообще наиболее надежным какой является ист синхр?
HARMHARM
Наиболее надежная вещь - внешний вочдог. Мало знаю людей, которые используют внутренний. Хотя бы потому, что его можно отключить из софта, или даже не включить...
AirDevil
Цитата(HARMHARM @ Jun 3 2009, 09:06) *
Наиболее надежная вещь - внешний вочдог. Мало знаю людей, которые используют внутренний. Хотя бы потому, что его можно отключить из софта, или даже не включить...

Я тоже его использовал, но решил отказаться. Хоть и не много элементов, но в ограниченом корпусе впихать места не хватило.
Можно его включать до всех инициализаций в самом начале выполнения программы.

Всё таки. Какой ист клоков лучше использовать?
vesago
Цитата(HARMHARM @ Jun 3 2009, 08:06) *
Наиболее надежная вещь - внешний вочдог. Мало знаю людей, которые используют внутренний. Хотя бы потому, что его можно отключить из софта, или даже не включить...

+1. Я в кончном итоге отказался от внутреннего и пользую внешний.
etoja
Цитата(HARMHARM @ Jun 3 2009, 09:06) *
Наиболее надежная вещь - внешний вочдог. Мало знаю людей, которые используют внутренний. Хотя бы потому, что его можно отключить из софта, или даже не включить...


В LPC213x один раз включенный вочдог отключить нельзя. Работает он стабильно.
Читайте документацию и аккуратно программируйте.
Сергей Борщ
Цитата(etoja @ Jun 3 2009, 09:58) *
В LPC213x один раз включенный вочдог отключить нельзя.
До перезагрузки (пусть той же собакой). Поэтому самое надежное - включать его в самом начале программы.
AirDevil
Цитата(Сергей Борщ @ Jun 3 2009, 11:29) *
До перезагрузки (пусть той же собакой). Поэтому самое надежное - включать его в самом начале программы.

Под началом понимаете место после 0x00000000? Или же можно и после инициализаций PLL и внешнего кварца?
etoja
Цитата(AirDevil @ Jun 3 2009, 12:01) *
Под началом понимаете место после 0x00000000? Или же можно и после инициализаций PLL и внешнего кварца?


Можно когда угодно. С этого момента таймер вочдога начнёт считать и остановить счёт невозможно.
AirDevil
Покритикуйте пожалуйста:
Код
    reset_handler:

/*
    инициализация вотчдога.
*/        
    /* WDCLKSEL= 0x00; internal oscillator; */
    ldr r0, =WDT_BASE
    mov r1, #0x00    
    str r1, [r0, #WDCLKSEL_OFFSET]
    
    /*WDTC    = 0xffffff; */
    mov r1, #0xffffff
    str r1, [r0, #WDTC_OFFSET]    
        
    /* WDMOD = 3; */
    mov r1, #0x03
    str r1, [r0, #WDMOD_OFFSET]

    /* Enable WotchDog */
    mov r1, #0xAA
    str r1, [r0, #WDFEED_OFFSET]
    mov r1, #0x55
    str r1, [r0, #WDFEED_OFFSET]
/*
    конец инициализации вотчдога.
*/

Далее инициализация плл.
Внешнего кварца.
...

Правильно?
etoja
Для LPC213x:

// --------------------------------------------------------------------------------
void KickTheDog(void) // Reset the watchdog timer
{
// __DISABLE_INTERRUPT(); // Disable all interrupts
WD_WDFEED=0xaa; // Reset the watchdog with back to back writes
WD_WDFEED=0x55;
// __ENABLE_INTERRUPT(); // Enable all interrupts
}
// --------------------------------------------------------------------------------
void wdt_init(void) // Configure Watchdog
{
WD_WDTC=(peripheralClockFrequency/4)*30; // Watchdog timeout set to 30 second
WD_WDMOD=0x00000003; // Watchdog no interrupts and causes reset
WD_WDFEED=0xaa; // Start the watchdog
WD_WDFEED=0x55;
}
// --------------------------------------------------------------------------------
zltigo
Цитата(etoja @ Jun 3 2009, 12:46) *
// __DISABLE_INTERRUPT(); // Disable all interrupts
WD_WDFEED=0xaa; // Reset the watchdog with back to back writes
WD_WDFEED=0x55;
// __ENABLE_INTERRUPT(); // Enable all interrupts

А что будет, если это вызвать из секции с запрещенными прерываниями sad.gif
Цитата
void wdt_init(void) // Configure Watchdog
{
WD_WDTC=(peripheralClockFrequency/4)*30; // Watchdog timeout set to 30 second
WD_WDMOD=0x00000003; // Watchdog no interrupts and causes reset
WD_WDFEED=0xaa; // Start the watchdog
WD_WDFEED=0x55;
}

Надо:
Код
void wdt_init(void)                            // Configure Watchdog
{
  WD_WDTC=(peripheralClockFrequency/4)*30;        // Watchdog timeout set to 30 second
  WD_WDMOD=0x00000003;                            // Watchdog no interrupts and causes reset
   KickTheDog();
}

Ибо тоже атомарность должна быть.
etoja
Цитата(zltigo @ Jun 3 2009, 14:04) *
Ибо тоже атомарность должна быть.


Верно, если длины стека хватает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.