5.2.5. Регистры модуля LVD
(Руководство разработчика по микроконтроллерам семейства HCS08)Для настройки модуля LVD используются 3 регистра:
- SPMSC1 (System Power Management Status and Control 1) — регистр управления системой питания 1;
- SPMSC2 — регистр управления системой питания 2;
- SPMSC3 — регистр управления системой питания 3.
5.2.5.1. Регистр SPMSC1
Для МК серий Ax, Dx, Ex, JM, LC, Qx, Sx
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC1 | Чтение | LVDF | 0 | LVDIE | LVDRE* | LVDSE | LVDE* | 0 | BGBE |
Запись | — | LVDACK | — | ||||||
Сброс | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
Для МК серий GB/GT
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC1 | Чтение | LVDF | 0 | LVDIE | LVDRE* | LVDSE | LVDE* | 0 | 0 |
Запись | — | LVDACK | — | — | |||||
Сброс | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
Для МК серий RC,RD, RE и RG
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC1 | Чтение | LVDF | 0 | LVDIE | SAFE | LVDRE* | 0 | 0 | 0 |
Запись | — | LVDACK | — | — | — | ||||
Сброс | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
*Эти биты могут быть изменены один раз после сброса системы. Все остальные попытки записать в них данные будут проигнорированы.
Описание битов:
Имя бита | Описание | Символ в языке С |
---|---|---|
LVDF | Флаг события обнаружения низкого напряжения питания. Значение этого флага действительно, только если работа модуля LVD разрешена, т.е. бит LVDE = 1. Бит доступен только для чтения. | bLVDF |
LVDACK | Запись 1 в данный бит сбрасывает бит LVDF в 0. | bLVDACK |
LVDIE | Бит разрешения прерывания по событию LVD — событию обнаружения низкого напряжения питания: 0 — прерывание запрещено; 1 — прерывание разрешено. | bLVDIE |
LVDRE | Бит выбора реакции на событие LVD — событие обнаружения низкого напряжения питания: 0 — событие вызывает прерывание; 1 — событие вызывает сброс системы. | bLVDRE |
LVDSE | Бит разрешения работы модуля LVD в режиме STOP: 0 — модуль LVD отключен в режиме STOP; 1 — модуль LVD работает в режиме STOP. | bLVDSE |
LVDE | Бит разрешения работы модуля LVD: 0 — модуль отключен; 1 — модуль включен. | bLVDE |
SAFE | Этот бит управляет режимом SAFE в МК моделей Rx. Бит запрета пробуждения МК из режима STOP по событию в модуле LVD: 0 — события внутреннего сброса или прерывания от модуля LVD в режиме STOP с последующим переходом МК в активный режим работы разрешены, но при условии, что напряжение питания МК выше уровня уставки VREARM. 1 — события внутреннего сброса или прерывания от модуля LVD в режиме STOP или когда напряжение питания МК выше уровня уставки VREARM запрещены. | bSAFE |
5.2.5.2. Регистр SPMSC2
Для МК серий AC, AW, QD
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC2 | Чтение | LVWF | 0 | LVDV | LVWV | PPDF | 0 | — | PPDC* |
Запись | — | LVWACK | — | PPDACK | |||||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Для МК серий DN, DV, DZ, EL, EN, SG, SH, SL
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC2 | Чтение | 0 | 0 | LVDV | LVWV | PPDF | 0 | 0 | PPDC* |
Запись | — | — | — | PPDACK | — | ||||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Для МК серии QE
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC2 | Чтение | LPR | LPRS | LPWUI | 0 | PPDF | PPDE* | PPDC | |
Запись | — | — | — | PPDACK | |||||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Для МК серий LC, QA, QG
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC2 | Чтение | 0 | 0 | 0 | PPDF | 0 | PDC* | PPDC* | |
Запись | — | — | — | — | — | PPDACK | |||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Для МК серий GB, GT
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC2 | Чтение | LVWF | 0 | LVDV | LVWV | PPDF | 0 | PDC* | PPDC* |
Запись | — | LVWACK | — | PPDACK | |||||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Для МК серий RC, RD, RE, RG
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC2 | Чтение | LVWF | 0 | 0 | 0 | PPDF | 0 | PDC* | PPDC* |
Запись | — | LVWACK | — | — | — | PPDACK | |||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
*Эти биты могут быть изменены один раз после сброса системы. Все остальные попытки записать в них данные будут проигнорированы.
Описание битов:
Имя бита | Описание | Символ в языке С |
---|---|---|
LVWF | Флаг события предупреждения о низком напряжении питания LVW. Флаг доступен только для чтения и устанавливается, когда напряжение питания становится ниже уровня VLVW. | bLVWF |
LVWACK | Бит подтверждения для события LVW. Запись 1 вызывает сброс бита LVWF. Если напряжение все еще низкое, то бит LVWF не перейдет в нулевое состояние. | bLVWACK |
LVDV | Бит выбора напряжения сравнения для события LVD (см. Табл.5.2): 0 — выбирается нижний диапазон; 1 — выбирается верхний диапазон. | bLVDV |
LVWV | Бит выбора напряжения сравнения для события LVW (см. Табл.5.2): 0 — выбирается нижний диапазон; 1 — выбирается верхний диапазон. | bLVWV |
Остальные биты (PDC, PPDC, LPR, LPRS и PPDE) относятся к режимам низкого энергопотребления и будут рассмотрены далее в главе 8.
5.2.5.3. Регистр SPMSC3
Для МК серий QG, QA и LC
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
SPMSC2 | Чтение | LVWF | 0 | LVDV | LVWV | 0 | 0 | 0 | 0 |
Запись | — | LVWACK | — | — | — | — | |||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Регистр SPMSC3 присутствует только в устройствах серии QG, QA и LC!
Описание битов:
Имя бита | Описание | Символ в языке С |
---|---|---|
LVWF | Флаг события предупреждения о низком напряжении питания LVW. Флаг доступен только для чтения и устанавливается, когда напряжение питания становится ниже уровня VLVW. | bLVWF |
LVWACK | Бит подтверждения для события LVW. Запись 1 вызывает сброс бита LVWF. Если напряжение все еще низкое, то бит LVWF не перейдет в нулевое состояние. | bLVWACK |
LVDV | Бит выбора напряжения сравнения для события LVD (см. Табл.5.2): 0 — выбирается нижний диапазон; 1 — выбирается верхний диапазон. | bLVDV |
LVWV | Бит выбора напряжения сравнения для события LVW (см. Табл.5.2): 0 — выбирается нижний диапазон; 1 — выбирается верхний диапазон. | bLVWV |
5.3. Сторожевой таймер COP
В МК компании Freescale Semiconductor модуль сторожевого таймера носит название COP (Computer Operating Properly). Модуль COP предназначен для восстановления работоспособности прикладной программы при возникновении сбоев в ее работе. Поэтому можно сказать, что сторожевой таймер «следит» за правильным исполнением программы.
Механизм наблюдения за ходом выполнения программы прост. Сторожевой таймер — это счетчик. Если он запустился и досчитал до переполнения, то генерируется сигнал внутреннего сброса. Прикладное ПО должно не допускать переполнения счетчика, т.е. периодически сбрасывать сторожевой таймер.
Хорошо продуманное программное обеспечение должно сбрасывать сторожевой таймер как можно меньшее число раз. В идеале, операция сброса должна встречаться в программе 1 раз. Частый сброс сторожевого таймера по ходу программы уменьшает эффективность контроля ее исполнения.
В МК семейства HCS08 сторожевой таймер выполнен на основе двоичного счетчика с коэффициентом счета 8192 (213) или 262144 (218). Сторожевой таймер включается битом COPE и тактируется частотой BUSCLK. Выбор коэффициента счета таймера производится битом COPT в регистре SOPT или SOPT1. Форматы этих регистров приведены в разделе 5.5.
Сброс счетчика сторожевого таймера осуществляется посредством записи в регистр SRS любого числа. Записываемое значение не играет роли, важен сам факт записи:
МК серий QD, QE, QG и LC имеют дополнительный источник тактирования для сторожевого таймера: независимый генератор частотой 1кГц. По умолчанию выбрано тактирование COP именно этим генератором. Чтобы выбрать в качестве тактирования сигнал частотой BUSCLK, необходимо записать 1 в бит COPCLKS регистра SOPT2. Обратите внимание, что при выборе в качестве источника тактирования генератора 1кГц автоматически изменяется коэффициент счета счетчика COP (Табл.5.3).
Таблица5.3. Выбор периода работы сторожевого таймера COP
COPCLKS | COPT | Источник тактирования | Коэффициент счета |
---|---|---|---|
0 | 0 | Внутренний генератор 1кГц. | 32 (32мс) |
0 | 1 | Внутренний генератор 1кГц | 256 (256мс) |
1 | 0 | BUSCLK | 8192 |
1 | 1 | BUSCLK | 262144 |
Помните! После сброса МК сторожевой таймер включен, коэффициент счета равен 261144, счетчик тактируется с частотой системной шины BUSCLK.
В МК семейств QA, QD, QE, QG и LC источник тактирования — внутренний счетчик с частотой 1кГц, коэффициент счета равен 256, поэтому период COP составляет примерно 256мс.
Для отключения сторожевого таймера необходимо записать 0 в бит COPE:
SOPT=0; // Отключение сторожевого таймера и вывода отладки BKGD
Будьте осторожны: регистр SOPT можно изменить 1 раз. При выходе МК из режима останова, код счетчика сторожевого таймера автоматически сбрасывается.
В следующем примере показана программа «мигающий светодиод» с защитой с помощью сторожевого таймера. Когда программа запускается первый раз, светодиод 2 выключен, а первый светодиод мигает. Сторожевой таймер включен, период его счета равен 256мс. Если он не будет сбрасываться каждые 256мс, то МК будет переходить в режим сброса.
В приведенной программе сторожевой таймер обслуживается в цикле for. Если, по каким-то причинам, программа «потеряется» и перестанет сбрасывать сторожевой таймер, то система перейдет в режим сброса.
Для учебных целей в данной программе обнуление сторожевого таймера можно остановить, если нажать и удерживать кнопку SWI. Тогда примерно через 256мс произойдет сброс.
Процедура проверки в начале программы осуществляет включение светодиода LED2, если сброс был вызван сторожевым таймером, а не модулем POR. Так можно отличить сброс по сторожевому таймеру от сброса по включению питания.
Пример 5.3. Мигающий светодиод и проверка источника прерывания
#include
#include"derivative.h"/*Файлсобъявлениямирегистровпериферии*/
#include"hcs08.h"//Этонашфайлсобъявлениями!
#defineLED1PTBD_PTBD6//Светодиод1подключенкPTB6
#defineLED2PTBD_PTBD7//Светодиод2подключенкPTB7
#defineSW1PTAD_PTAD2//КнопкаSW1подключенакPTA2
#defineCLRCOP{SRS=0;}//Макроопределениесбросасторожевоготаймера
voidmain(void)
{
unsignedinttemp;
//НастройкарегистраSOPT1,включениесторожевоготаймераCOP
//(BKGDотключен)
SOPT1=bCOPT|bCOPE;
PTBDD=BIT_7|BIT_6;//НастройкаPTB6иPTB7навывод
PTAPE=BIT_2;//ПодключениеподтягивающихрезисторовдляPTA2
//Проверкаисточникапоследнегосброса
//ЕслиSRS_COP=1,товключаетсявторойсветодиодLED2
//ЕслиCOP_COP=0,товторойсветодиодотключается
if(SRS_COP)LED2=0;elseLED2=1;
while(1)
{
PTBD_PTBD6=1;//Отключитьсветодиод
for(temp=30000;temp;temp--)CLRCOP;//Ожидание
PTBD_PTBD6=0;//Включитьсветодиод
for(temp=3000;temp;temp--)CLRCOP;//Ожидание
while(!SW1);//ЕслинажатакнопкаSWI,то
//прерываемвыполнениепрограммы
}
}
Избегайте сброса сторожевого таймера в функциях обработки прерываний, поскольку основная программа может работать неправильно, а прерывания «извне» могут генерироваться корректно.
Лучше использовать как можно меньше процедур сброса сторожевого таймера (в идеале — одна команда на все приложение).
Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>