WatchDog
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
WatchDog
Здравствуйте.
Проблема такая.
На частоте 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 работает
Проблема такая.
На частоте 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 работает
Re: WatchDog
Здравствуйте!
Возможно, ТО и errata требуют некоторых уточнений.
Использование пониженного Fvco не есть хорошо, однако, нет ничего страшного в том, что вы используете Fvco = 200 МГц.
Кроме применения внешнего делителя в конфигурациях где необходим сброс, стоит также ограничить Fvco сверху, которая должна быть меньше 300 МГц. А еще лучше Fvco<250. Впрочем, вы сами своими экспериментами это подтвердили.
Возможно, ТО и errata требуют некоторых уточнений.
Использование пониженного Fvco не есть хорошо, однако, нет ничего страшного в том, что вы используете Fvco = 200 МГц.
Кроме применения внешнего делителя в конфигурациях где необходим сброс, стоит также ограничить Fvco сверху, которая должна быть меньше 300 МГц. А еще лучше Fvco<250. Впрочем, вы сами своими экспериментами это подтвердили.
Re: WatchDog
Тогда еще пару вопросов
1) Когда будут внесены изменения в ТО и errata по вачдогу и тактированию?
2) Вы или кто-то еще из пользователей К1921ВК01Т использовали вачдог с данными настройками так,
что МК зависает?
1) Когда будут внесены изменения в ТО и errata по вачдогу и тактированию?
2) Вы или кто-то еще из пользователей К1921ВК01Т использовали вачдог с данными настройками так,
что МК зависает?
Re: WatchDog
1) В errata изменение внести и выложить дело нескольких дней. Правки в ТО - не ранее нескольких недель.
2) Никто пока не обращался с подобным.
2) Никто пока не обращался с подобным.
Re: WatchDog
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, но хотелось бы быть уверенным.
"Рекомендации и способы обхода
Использовать в качестве системной частоты 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, но хотелось бы быть уверенным.
Re: WatchDog
Под внешним понимается делитель, настраиваемый полем PLL_DIV регистра PLL_CTRL.
- Disona
- Сообщения: 81
- Зарегистрирован: 06 дек 2016, 11:18
- Предприятие: НПФ Вектор
- Откуда: Москва
- Контактная информация:
Re: WatchDog
Подскажите пожалуйста такую вещь.
Нам нужно сбрасывать проц вочдогом.
Для этого нужно использовать дополнительный делитель PLL.
Но ещё, как я понял из этой ветки, желательно Fvco ставить ниже 250 МГц. Но похоже, получить ровно 100 МГц на процессоре получится только при Fvco равной 200 МГц, а это на нижней границе допустимых значений, согласно ТО на К1921ВК01Т (200 MHz < Fvco < 500 MHz).
Мы проверили "на столе" с частотой 200 MHz вроде программа работает, и сброс работает.
С 400 MHz программа работает, но сброс - нет.
Возможно ли установить для Fvco какое-то значение, кроме 200 МГц, чтобы на процессоре получить ровно 100 МГц и при этом работал WD?
Допустимо работать с Fvco = 200 МГц? Нет ли подводных камней каких-то?
Нам нужно сбрасывать проц вочдогом.
Для этого нужно использовать дополнительный делитель PLL.
Но ещё, как я понял из этой ветки, желательно Fvco ставить ниже 250 МГц. Но похоже, получить ровно 100 МГц на процессоре получится только при Fvco равной 200 МГц, а это на нижней границе допустимых значений, согласно ТО на К1921ВК01Т (200 MHz < Fvco < 500 MHz).
Мы проверили "на столе" с частотой 200 MHz вроде программа работает, и сброс работает.
С 400 MHz программа работает, но сброс - нет.
Возможно ли установить для Fvco какое-то значение, кроме 200 МГц, чтобы на процессоре получить ровно 100 МГц и при этом работал WD?
Допустимо работать с Fvco = 200 МГц? Нет ли подводных камней каких-то?
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"
ООО "НПФ Вектор"
- Disona
- Сообщения: 81
- Зарегистрирован: 06 дек 2016, 11:18
- Предприятие: НПФ Вектор
- Откуда: Москва
- Контактная информация:
Re: WatchDog
Для справки:
Кварц стоит на 12 МГц, делители выбраны такие:
Кварц стоит на 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 МГц, вроде сходится
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"
ООО "НПФ Вектор"
- Disona
- Сообщения: 81
- Зарегистрирован: 06 дек 2016, 11:18
- Предприятие: НПФ Вектор
- Откуда: Москва
- Контактная информация:
Re: WatchDog
Напоминаю про свой вопрос в этой теме (последние два сообщения).
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"
ООО "НПФ Вектор"
Re: WatchDog
С Fvco = 200 МГц работать корректно, иного выбора при необходимости использовать PLL и WDT нет.