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

 
 
 
Reply to this topicStart new topic
> Ох уж этот WDT!, Как заставить работать?
Мур
сообщение Jul 18 2007, 15:34
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Ковыряю AT91SAM7A3. Всё нормально, кроме последнего шага,-введение в уже отлаженную программу СОБАКИ!
Выяснил, что на самом деле WDT не работает, когда програмно вхожу в бесконечый цикл по внешней команде. Перебором вариантов проблема не решилась, если были сомнения по каждому биту в регистре статуса. Вот текст.
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void wdt_on(void) //Инициализация
{//Простой сброс без временных ворот
AT91F_WDTC_CfgPMC (); // V-отладка
AT91F_WDTSetMode(AT91C_BASE_WDTC,(WTIMECODE|AT91C_WDTC_WDRSTEN|AT91C_WDTC_WDRPRO
C |(WTIMECODE<<16))|AT91C_WDTC_WDDBGHLT);//1 Sek
AT91F_WDTRestart(AT91C_BASE_WDTC);
}

В основном теле проставляю
AT91F_WDTRestart(AT91C_BASE_WDTC);

Вопрос корифеям. Где тут грабли остались? Что я пропускаю? 1111493779.gif
Хоть намекните!
Библиотека из IAR-а
//*----------------------------------------------------------------------------
__inline void AT91F_WDTC_CfgPMC (void)
{
AT91F_PMC_EnablePeriphClock(
AT91C_BASE_PMC, // PIO controller base address
((unsigned int) 1 << AT91C_ID_SYS));
}
//*----------------------------------------------------------------------------
__inline void AT91F_WDTSetMode(
AT91PS_WDTC pWDTC,
unsigned int Mode)
{
pWDTC->WDTC_WDMR = Mode;
}
//*----------------------------------------------------------------------------
__inline void AT91F_WDTRestart(
AT91PS_WDTC pWDTC)
{
pWDTC->WDTC_WDCR = 0xA5000001;
}
Заранее благодарен! tort.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 18 2007, 16:33
Сообщение #2


Гуру
******

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



Цитата(Мур @ Jul 18 2007, 18:34) *
Трудно сказать. Вот это работает на SAM7S64:
Код
inline void InitWatchdog(void)
{
    // enable wdt 2 sec. timeout
    // init wdt
    AT91C_BASE_WDTC->WDTC_WDMR = (0xA5UL << 24) | (1 * AT91C_WDTC_WDRSTEN) | (1 * AT91C_WDTC_WDRPROC) \
        | ( AT91C_WDTC_WDV * SLCK / 128 * 2 / 0xFFF ) \
        | ( AT91C_WDTC_WDD * SLCK / 128 * 2 / 0xFFF ) \
        | ( 0 * AT91C_WDTC_WDDBGHLT) | (0 * AT91C_WDTC_WDIDLEHLT) | (0 * AT91C_WDTC_WDDIS);
}

#define    __watchdog_reset() do {     AT91C_BASE_WDTC->WDTC_WDCR = (0xA5UL << 24) | AT91C_WDTC_WDRSTT; } while (0)

В вашем коде бросается в глаза ошибка: AT91F_WDTSetMode(AT91C_BASE_WDTC,((0xA5UL << 24)|WTIMECODE.......

P.S. Ой, посмотрел в даташит - это у меня ошибка, не должно быть там (0xA5UL << 24). НО как-то случайным образом работает... Счас буду разбираться.


--------------------
На любой вопрос даю любой ответ
"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
Timofey
сообщение Jul 19 2007, 05:20
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Если вы взяли какой-то стандартный проект, то там должен быть файл Cstartup_SAM7.c Посмотрите в нем, часто там присутствует следующая строка: AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 15:42
Рейтинг@Mail.ru


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