СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №5/2015
ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 34 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 5 2015 при достижении счётчиком значения 0x40 генерируется прерывание. Обну- ляется этот бит аппаратно, путём обще- го сброса микроконтроллера. Биты 8 и 7 группыWDGTB[1:0] назна- чают коэффициент дополнительно- го деления частоты входного сигнала счётчика. Они могут иметь следующие значения: ● 00 – деление на 1; ● 01 – деление на 2; ● 10 – деление на 4; ● 11 – деление на 8. РазрядыW[6:0] организуют 7-битное значение окна времени, с которым срав- нивается значение обратного счётчика. Регистр статуса WWDG_SR содержит всего один бит статуса EWIF, представ- ляющий собой флаг прерывания про- буждения процессора. Этот бит прини- мает единичное значение аппаратно, когда счётчик достигает значения 0x40 и тогда, когда прерывание выключено. Очищается он программно, записью в него нулевого значения. Запись в этот разряд значения 1 эффекта не имеет. Примеры программ для оконного сторожевого таймера В листинге 2 приведеныфункции для работы с таймеромWWDG с коммента- риями, позволяющими понять назна- чение всех операций, выполняемых в этой программе. С помощью таких несложных функ- ций можно организовать контроль работы программы, обеспечивая тем самым защиту от сбоев. Подробнее ознакомиться с таймерами микро- контроллера STM32 можно на сайте STMicroelectronics [2]. Л ИТЕРАТУРА 1. www.st.com . 2. www.st.com/web/en/resource/tech- nical/document/reference_manual/ CD00246267.pdf. Листинг 2 // Функция инициализации сторожевого таймера WWDG void WWDG_Init(void) { // Инициализация прерывания NVIC->ISER[0] |= NVIC_ISER_SETENA_0; // Инициализация таймера WWDG RCC->APB1ENR |= RCC_APB1ENR_WWDGEN; // Включить тактирование WWDG WWDG->CFR |= WWDG_CFR_WDGTB0; // Задать частоту тактирования WWDG WWDG->CFR |= 0x41; // Задать окно WWDG->CR |= 0x7F; // Разрешить работу WWDG и установить начальное значение WWDG->SR &=~WWDG_SR_EWIF; // Очистить флаг EWI WWDG->CFR |=WWDG_CFR_EWI; // Разрешить прерывания } // Функция обработки прерывания сторожевого таймера WWDG void WWDG_IRQHandler(void) { WWDG->CR |= 0x7F; // Обновить значение таймера WWDG WWDG->SR &=~WWDG_SR_EWIF; // Очистить флаг EWI // Другие действия … } // Функция запуска сторожевого таймера WWDG void WWDT_ON(void) { RCC->APB1ENR |= RCC_APB1ENR_WWDGEN; // Включить тактирование WWDG WWDG->CR |= 0x7F; // Обновить значение таймера WWDG WWDG->SR &=~WWDG_SR_EWIF; // Очистить флаг EWI } // Функция останова сторожевого таймера WWDG void WWDT_OFF(void) { RCC->APB1ENR |= RCC_APB1ENR_WWDGRST; // Отключить тактирование WWDG } Таблица 4. Карта регистров WWDG и их значения после сброса Сдвиг Регистр 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0х00 WWDG_CR Резерв WDGA T[6:0] Исх. значение 0 1 1 1 1 1 1 1 0х04 WWDG_CFR Резерв EWI WDGTB1 WDGTB0 W[6:0] Исх. значение 0 0 0 1 1 1 1 1 1 1 0х08 WWDG_SR Резерв EWIF Исх. значение 0 сторожевой таймер включён и может производить сброс. С появлением каж- дого тактового импульса счётчик T[6:0] уменьшает своё значение на единицу. Сброс генерируется, когда счётчик меняет значение с 0x40 на 0x3F, то есть при обнулении разряда T6. Регистр конфигурации WWDG_CFR содержит три бита для настройки тай- мера и 7 разрядов W[6:0] для установки окна времени. Разряд 9 EWI служит для разреше- ния прерывания раннего пробужде- ния процессора. Если он установлен, то
RkJQdWJsaXNoZXIy MTQ4NjUy