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

 
 
> WWDT у STM32, windows watchdog timer
123kill12
сообщение Oct 25 2011, 19:05
Сообщение #1


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

Группа: Участник
Сообщений: 96
Регистрация: 12-05-10
Пользователь №: 57 217



К контроллеру подключены разные микросхемы.
В коде есть пара циклов которые могут зависнуть если эти микросхемы вдруг откажут. вероятность очень маленькая но есть. Простая перезагрузка не выход. так как перезагрузка контроллера может нарушить работу устройств которые с ним связаны ну вообще не желательно. так же хотелось бы чтоб устройство себя могло сдиагностировать.

пришел к выводу что IWDT не выход. у STM есть WWDT, который имеет свое прерывание и накладывание этого таймера на циклы которые могут повиснуть очень удобно.
Вот у меня возник вопрос как им пользоваться. ну как настроить и запустит тут все ясно.
Но вот повис цикл у меня. WWDT досчитал до 0 и вызвал прерывание. Что делать в прерывании чтоб выйти из повисшего цикла.

Думаю можно сделать какой нить глобальный регистр с битами. выставлять соотвествующий бит перед заходом в цикл и сбрасывать после выхода. В прерывании по этим битам определять какой цикл и изменяет значения так чтоб программа вывалилась из цикла.

но может есть проще путь?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
123kill12
сообщение Oct 26 2011, 18:20
Сообщение #2


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

Группа: Участник
Сообщений: 96
Регистрация: 12-05-10
Пользователь №: 57 217



Что то я не могу понять в WWDT.
Прикрепленное изображение


у него два режима. с компаратором и когда досчитывает до 3F.

3 регистра
в первом
WDGA - разрешения сброса или просто говоря включение таймера
T[6:0] - значение счетчика

в втором
EWI - написано как то необычно. это просто разрешение прерывания. причем тип RS тоесть могу читать и писать. но не могу записать туда 0. 0 там только после перезагрузки.
прерывание происходит когда значение опускается ниже 0x40h в T[6:0]
WDGTB[1:0] - делитель частоты. мы берем (PCLK1/4096)/(WDGTB+1)
W[6:0] - значение для сравнения

в третьем
EWIF - флаг что сработало прерывание.

EWIF как EWI все понятно, только смущает "Early wakeup"(раннее пробуждение) такое ощущение что он сбрасывает систему а потом после перезапуска срабатывает прерывание.
Когда я быстро просмотрел его, для того чтоб проверить подходит он мне или нет, у меня возникло впечетление что можно отключить ресет при помощи WDGA и компаратор будет просто генерировать прерывания. Но теперь мне кажется что это не так((( поэтому лезу в Application note AN3268.
(файл с фунциями http://dox.openpilot.org/Firmware/OpenPilo..._8c_source.html , а main и stm32f10x_it приложил)

/* NVIC configuration */
//++++++++++++++++++++++++++++
#define ena_WWDT NVIC_ISER_SETENA_0;
NVIC->ISER[0] |= ena_WWDT;
/* WWDG configuration */
/* Enable WWDG clock */
RCC->APB1ENR |= RCC_APB1ENR_WWDGEN;
/* WWDG clock counter */
WWDG->CFR |= WWDG_CFR_WDGTB0;
/* Set Window value to 65 */
WWDG->CFR |= 0x41;
/* Enable WWDG and set counter value to 127*/
WWDG->CR |= 0x7F;
/* Clear EWI flag */
WWDG->SR &=~WWDG_SR_EWIF;
/* Enable EW interrupt */
WWDG->CFR |=WWDG_CFR_EWI;
//++++++++++++++++++++++++++


void WWDG_IRQHandler(void){
/* Update WWDG counter */
WWDG->CR |= 0x7F;
/* Clear EWI flag */
WWDG->SR &=~WWDG_SR_EWIF;
//+++++++
//действие
//+++++++}

Ну вот мы его инизилизировали и включили. но как его выключить?

единственная мысль это сделать так.
void WWDT_ON(void)
{
/* Enable WWDG clock */
RCC->APB1ENR |= RCC_APB1ENR_WWDGEN;
/* Update WWDG counter */
WWDG->CR |= 0x7F;
/* Clear EWI flag */
WWDG->SR &=~WWDG_SR_EWIF;
}

void WWDT_OFF(void)
{
/* disable WWDG clock */
RCC->APB1ENR |= RCC_APB1ENR_WWDGRST;
}

кто знает лучше??? подскажите. Плз.


Прикрепленные файлы
Прикрепленный файл  main.txt ( 4.57 килобайт ) Кол-во скачиваний: 167
Прикрепленный файл  stm32f10x_it.txt ( 5.21 килобайт ) Кол-во скачиваний: 36
 
Go to the top of the page
 
+Quote Post



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

 


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


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