Что то я не могу понять в 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;
}
кто знает лучше??? подскажите. Плз.