WatchDog
Добавлено: 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 работает
Проблема такая.
На частоте 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 работает