Ну, напимер, сторожевой таймер:
Код
#ifndef __WDT_HPP__
#define __WDT_HPP__
#include "430.hpp"
// здесь typedef bit unsigned char
// typedef byte unsigned char, и описания регистров связанных с прерываниями
// от разных устройств (комментарий для сообщения в форум)
struct WDTCTL{
bit WDTIS : 2; /* Выбор интервала сторожевого таймера. Эти биты определяют интервал времени
* сторожевого таймера, по истечении которого устанавливаетс
* флаг WDTIFG и/или генерируется сигнал PUC.
* 00 Частота источника тактирования сторожевого таймера / 32768
* 01 Частота источника тактирования сторожевого таймера / 8192
* 10 Частота источника тактирования сторожевого таймера / 512
* 11 Частота источника тактирования сторожевого таймера / 64 */
bit WDTSSEL : 1; /* Выбор источника тактирования сторожевого таймера
* 0 SMCLK 1 ACLK */
bit WDTCNTCL : 1; /* Очистка счетчика сторожевого таймера.
* Установкой WDTCNTCL=1 производится очистка счетчика до значения 0000h.
* Бит WDTCNTCL автоматически сбрасывается.
* 0 Действие не производитс
* 1 WDTCNT = 0000h */
bit WDTTMSEL : 1; /*a Выбор режима сторожевого таймера
* 0 Сторожевой режим
* 1 Режим интервального таймера */
bit WDTNMI : 1; /* Выбор NMI сторожевого таймера.
* Этот бит позволяет установить режим функционирования вывода nonRST/NMI.
* 0 Функция сброса
* 1 Функция NMI */
bit WDTNMIES : 1; /* Выбор фронта NMI сторожевого таймера. Этот бит позволяет выбрать
* фронт прерывания для NMI прерывания при WDTNMI=1.
* Изменение этого бита может вызвать NMI. Чтобы избежать
* случайного запуска NMI следует изменять этот бит при WDTNMI=0.
* 0 NMI прерывание происходит по переднему фронту
* 1 NMI прерывание происходит по спаду */
bit WDTHOLD : 1; /* Останов сторожевого таймера. Этот бит останавливает сторожевой таймер.
* Установка WDTHOLD=1, когда WDT не используется, позволяет снизить
* энергопотребление.
* 0 Сторожевой таймер не остановлен
* 1 Сторожевой таймер остановлен */
byte WDTPW; /* Пароль сторожевого таймера. Всегда читается как 069h.
* Должен записываться как 05Ah, в противном случае будет сгенерирован PUC. */
static const WDTCTL *address; // адрес настоящего регистра управления WDT
WDTCTL() // конструктор читает данные из настоящего регистра
{ *(int*)this = *(int*)address; }
void set(void) // установить данные в настоящий регистр
{
WDTPW = 0x5A;
*(int*)address = *(int*)this;
}
};
class WDT
{
public:
static void reset(void) // сброс и рестарт сторожевого таймера
{
WDTCTL wdtctl;
wdtctl.WDTCNTCL = 1;
wdtctl.set();
}
static void turnOff(void) // выключение сторожевого таймера
{
WDTCTL wdtctl;
wdtctl.WDTHOLD = 1;
wdtctl.set();
}
static void turnOn(void) // включение сторожевого таймера
{
WDTCTL wdtctl;
wdtctl.WDTHOLD = 0;
wdtctl.set();
}
enum dividers{ d32768, d8192, d512, d64}; // значения делителя частоты ст. тайм.
static void set_divider( const dividers divider) // установека значения делителя частоты
{
WDTCTL wdtctl;
wdtctl.WDTIS = divider;
wdtctl.set();
}
enum source{ SMCLK, ACLK}; // источники тактовой частоты ст. тайм.
static void set_source( source sour) // установека источника частоты
{
WDTCTL wdtctl;
wdtctl.WDTSSEL = sour;
wdtctl.set();
}
enum modes{ watchdog, interval}; // режимы сторожевой-интервальный
static void set_mode(modes mode)
{
WDTCTL wdtctl;
wdtctl.WDTTMSEL = mode;
wdtctl.set();
}
enum NMIs{ rst, NMI};
static void setNMI( NMIs nmi)
{
WDTCTL wdtctl;
wdtctl.WDTNMI = nmi;
wdtctl.set();
}
enum fronts{ front, back};
static void setNMI( fronts fr)
{
WDTCTL wdtctl;
wdtctl.WDTNMIES = fr;
wdtctl.set();
}
static int getWDTIFG(void)
{
return WDTIFG;
}
};
#endif