WatchDog

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: dav, bkolbov, Alis, pip, _sva_, dav, bkolbov, Alis, pip, _sva_, dav, bkolbov, Alis, pip, _sva_

Ответить
steksor
Сообщения: 3
Зарегистрирован: 28 апр 2017, 14:23
Предприятие: Сумма Технологии

WatchDog

Сообщение steksor » 03 июл 2017, 18:17

Здравствуйте.

Проблема такая.
На частоте 100 МГц при тактировании МК от PLL_DIV от внешнего кварца на 16 МГц вачдог зависает.
При этом тестовая программа запускается, зажигает диодик и ровно через сконфигурированное время
диодик гаснет и МК зависает. То есть вачдог отсчитывает время правильно и тактирование МК работает верно.
В HardFault программа не попадает.

НО. На частоте 72 МГц от кварца и PPL_DIV вачдог работает нормально. Все сбрасывается и временные
интервалы верны.
При настройке в п.1 ниже коэффициенты подобраны так, что Fvco = 200000000 Гц. А должно быть
больше. При этом вачдог нормально работает на частоте 100 МГц. Если же поправить коэффициенты так, чтобы
удовлетворять ограничениям, то вачдог на 100 МГц зависает.

Согласно errata_K1921VK01T вачдог должен работать только от PLL_DIV. Но при настройках на частоту
72 МГц от PLL в п.6 ниже нарушая условие Fvco = 144 МГц (должно быть Fvco > 200 МГц) МК и вачдог
работают исправно от PLL без делителя.

Рассчеты и проверку коэффициентов делал согласно даташиту на К1921ВК01Т п.4.1 (стр.28)


Код тестовой программы:

int main()
{
// Тест вачдога
pin_init(LED1);

// Настраиваем тактирование МК
NT_COMMON_REG->PLL_CTRL_bit.REFSEL = 0; // 0 - XI_OSC (кварц) Источник тактирования для PLL

NT_COMMON_REG->PLL_CTRL_bit.PLL_DIV = 0; // N = 2*(PLL_DIV+1) Делитель на выходе PLL
NT_COMMON_REG->PLL_OD = 1; // NO = PLL_OD (м.б.: выкл, 1/2, 1/4)
NT_COMMON_REG->PLL_NR = 2; // NR = PLL_NR+2 (PLL_NR: 0..31)
NT_COMMON_REG->PLL_NF = 98; // NF = PLL_NF+2 (PLL_NF: 0..255)

NT_COMMON_REG->SYS_CLK = 4; // 3 - PLL без делителя, 4 - с делителем. Источник тактовой частоты МК
while (NT_COMMON_REG->SYS_CLK_bit.CURR_SRC != 4) {}

delay_ms (200);
pin_set(LED1);

// Запускаем вачдог
NT_COMMON_REG->APB_CLK |= RCC_PeriphClk_WD;
NT_COMMON_REG->PER_RST0 |= (1<<RCC_PeriphRst_WD);
NT_WDT->LOAD = 8000000;
NT_WDT->CTRL_bit.RESEN = (uint32_t)1; // ENABLE
NT_WDT->CTRL_bit.INTEN = (uint32_t)1; // ENABLE

while (1){}
}

Варианты настройки тактирования для вачдога:

1)
SYS_CLK = 4; // такирование от PLLDIV
FIN = 16000000
PLL_DIV = 0 N_DIV = 2
PLL_OD = 0 NO = 1
PLL_NR = 0 NR = 2
PLL_NF = 23 NF = 25

Fvco = 200000000 (должно быть больше 200 МГц)

FOUT_PLL = 200000000
FOUT_PLLDIV = 100000000

WDT Работает от кварца, но Fvco = 200000000
WDT также работает и от POR


2)
SYS_CLK = 4 // Тактирование от PLL_DIV
FIN = 16000000
PLL_DIV = 0 N_DIV = 2
PLL_OD = 1 NO = 2
PLL_NR = 2 NR = 4
PLL_NF = 98 NF = 100

Fvco = 400 МГц (ОК)
Fref = 2 МГц (ОК)

FOUT_PLL = 200000000
FOUT_PLLDIV = 100000000

WDT зависает от кварца
WDT от POR тоже зависает


3)
SYS_CLK = 4 // Тактирование от PLL_DIV
FIN = 16000000
PLL_DIV = 0 N_DIV =2
PLL_OD = 1 NO = 2
PLL_NR = 2 NR = 4
PLL_NF = 70 NF = 72

Fref = 2 МГц (ОК)
Fvco = 288 МГц (ОК)

FOUT_PLL = 144000000
FOUT_PLLDIV = 72000000

WDT работает от кварца
WDT от POR тоже работает


4)
SYS_CLK = 4 // Тактирование от PLL_DIV
FIN = 16000000
PLL_DIV = 0 N_DIV = 2
PLL_OD = 1 NO = 2
PLL_NR = 2 NR = 4
PLL_NF = 84 NF = 86

Fref = 2 МГц (ОК)
Fvco = 344 МГц (ОК)

FOUT_PLL = 172000000
FOUT_PLLDIV = 86000000

WDT работает от кварца
WDT от POR не работает

// -------------------------------------------------------------------------
// От PLL не должно работать по даташиту
// -------------------------------------------------------------------------
5)
SYS_CLK = 3 // Тактирование от PLL напрямую
FIN = 16000000
PLL_DIV = 0 N_DIV = 2
PLL_OD = 3 NO = 4
PLL_NR = 0 NR = 2
PLL_NF = 48 NF = 50

Fref = 4 МГц (ОК)
Fvco = 400 МГц (ОК)

FOUT_PLL = 100000000
FOUT_PLLDIV = 50000000

WDT зависает
WDT от POR зависает


6)
SYS_CLK = 3 // Тактирование от PLL напрямую
FIN = 16000000
PLL_DIV = 0 N_DIV = 2
PLL_OD = 1 NO = 2
PLL_NR = 2 NR = 4
PLL_NF = 34 NF = 36

Fref = 2 МГц (ОК)
Fvco = 144 МГц (должно быть больше 200 МГц)

FOUT_PLL = 72000000
FOUT_PLLDIV = 36000000

WDT работает, но Fvco = 144000000
WDT от POR работает

bkolbov
Сообщения: 238
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: WatchDog

Сообщение bkolbov » 04 июл 2017, 09:40

Здравствуйте!

Возможно, ТО и errata требуют некоторых уточнений.
Использование пониженного Fvco не есть хорошо, однако, нет ничего страшного в том, что вы используете Fvco = 200 МГц.

Кроме применения внешнего делителя в конфигурациях где необходим сброс, стоит также ограничить Fvco сверху, которая должна быть меньше 300 МГц. А еще лучше Fvco<250. Впрочем, вы сами своими экспериментами это подтвердили.

steksor
Сообщения: 3
Зарегистрирован: 28 апр 2017, 14:23
Предприятие: Сумма Технологии

Re: WatchDog

Сообщение steksor » 04 июл 2017, 12:44

Тогда еще пару вопросов

1) Когда будут внесены изменения в ТО и errata по вачдогу и тактированию?

2) Вы или кто-то еще из пользователей К1921ВК01Т использовали вачдог с данными настройками так,
что МК зависает?

bkolbov
Сообщения: 238
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: WatchDog

Сообщение bkolbov » 04 июл 2017, 14:20

1) В errata изменение внести и выложить дело нескольких дней. Правки в ТО - не ранее нескольких недель.
2) Никто пока не обращался с подобным.

evgen
Сообщения: 1
Зарегистрирован: 28 июн 2018, 18:55
Предприятие: Wolpike

Re: WatchDog

Сообщение evgen » 29 июн 2018, 16:12

Errata К1921ВК01Т (версия от 19.04.2017) в пункте "22. Программный сброс при тактировании от PLL" говорит нам:
"Рекомендации и способы обхода
Использовать в качестве системной частоты PLL с внешним делителем. Так например, для получения системной частоты в 100 МГц необходимо настроить выход PLL на 200 МГц и включить внешний делитель на 2."

Чтобы найти какую же сущность нужно считать внешним делителем смотрим "Руководство пользователя К1921ВК01Т" и находим следующие:

"Частота выходного сигнала PLL может быть уменьшена с помощью делителя, значение которого задается полем PLL_DIV регистра PLL_CTRL. Коэффициент делителя N (см. рисунок 4.1) рассчитывается по формуле N = 2 x (PLL_DIV + 1)."

"NO – значение выходного делителя, которое зависит от состояния поля PL_OD регистра PLL_OD."

Господа, будьте добры уточнить какой именно делитель имеется в виду в errata под "внешний делитель на 2":
a) N = 2 (при PLL_DIV = 0)
или
b) NO = то ли 2, то ли 1/2 (при PLL_OD = 1)
:?:

Если исходить из рисунка 4.1, то внешним делителем нужно считать N, но хотелось бы быть уверенным.

bkolbov
Сообщения: 238
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: WatchDog

Сообщение bkolbov » 02 июл 2018, 09:14

Под внешним понимается делитель, настраиваемый полем PLL_DIV регистра PLL_CTRL.

Disona
Сообщения: 35
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Contact:

Re: WatchDog

Сообщение Disona » 16 ноя 2020, 14:55

Подскажите пожалуйста такую вещь.

Нам нужно сбрасывать проц вочдогом.
Для этого нужно использовать дополнительный делитель PLL.

Но ещё, как я понял из этой ветки, желательно Fvco ставить ниже 250 МГц. Но похоже, получить ровно 100 МГц на процессоре получится только при Fvco равной 200 МГц, а это на нижней границе допустимых значений, согласно ТО на К1921ВК01Т (200 MHz < Fvco < 500 MHz).

Мы проверили "на столе" с частотой 200 MHz вроде программа работает, и сброс работает.
С 400 MHz программа работает, но сброс - нет.

Возможно ли установить для Fvco какое-то значение, кроме 200 МГц, чтобы на процессоре получить ровно 100 МГц и при этом работал WD?
Допустимо работать с Fvco = 200 МГц? Нет ли подводных камней каких-то?
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"

Disona
Сообщения: 35
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Contact:

Re: WatchDog

Сообщение Disona » 17 ноя 2020, 13:23

Для справки:
Кварц стоит на 12 МГц, делители выбраны такие:

Код: Выделить всё

	NT_COMMON_REG->PLL_OD = 0;			// Выходной делитель NO = 1
	NT_COMMON_REG->PLL_NR = 1;			// Опорный делитель NR = PLL_NR + 2 = 3
	NT_COMMON_REG->PLL_CTRL_bit.PLL_DIV = 0;	// N = 2 * (PLL_DIV + 1) = 2
	NT_COMMON_REG->PLL_NF = 48;		// Делитель обратной связи PLL NF=F_PLL+2=50
	// Для кварца 12 МГц:
	// Fvco = 12 * (50 / 3) = 200 MHz
	// Fref = 12 / (2 * 3) = 2 MHz
	// FOUT = 12 * 50 / (3 * 1) / 2 = 100 МГц, вроде сходится
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"

Ответить

Вернуться в «32-разрядные микроконтроллеры»

Пользователи онлайн

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость