В случае использования PLL, могут возникнуть проблемы с программным сбросом (см. пункт 22 Errata https://niiet.ru/wp-content/uploads/err ... 170419.pdf). В большинстве случаев обойти данную ситуацию помогает рекомендация из Errat:
"Использовать в качестве системной частоты PLLс внешним делителем.
Так, например, для получения системной частоты в 100 МГц необходимо настроить выход PLL на 200 МГц и включить внешний делитель на 2."
Обязательно должно соблюдаться условие для Fvco : 200 МГц ≤ Fvco ≤ 300 МГц.
При повторении рекомендации, получилось достичь значения (70-72) МГц системной частоты, при которой сохраняется работоспособность сторожевого таймера.
Так при входной частоте 10МГц (частоте кварцевого резонатора) можно получить системную частоту 69,16МГц, применив следующие настройки:
PLL_OD = 1, PLL_NF=164, PLL_NR=4, PLL_DIV =0. (Fvco = 276,666 667 МГц) - функция инициализации PLL69_OSC10MHz_Init()
При входной частоте 12МГц (частоте кварцевого резонатора) можно получить системную частоту 71МГц, применив следующие настройки:
PLL_OD = 1, PLL_NF=140, PLL_NR=4, PLL_DIV =0. (Fvco = 284 МГц) - функция инициализации PLL71_OSC12MHz_Init()
Код функции PLL69_OSC10MHz_Init():
Код: Выделить всё
void PLL69_OSC10MHz_Init()
{
NT_COMMON_REG->SYS_CLK = COMMON_REG_SYS_CLK_SEL_SRC_ExtOsc;
uint32_t pll_stable_wait = 1000;
while (pll_stable_wait) {
pll_stable_wait--;
}
NT_COMMON_REG->PLL_CTRL_bit.REFSEL = COMMON_REG_PLL_CTRL_REFSEL_ExtOsc;
NT_COMMON_REG->PLL_OD = 1;
NT_COMMON_REG->PLL_NF = 164;
NT_COMMON_REG->PLL_NR = 4;
NT_COMMON_REG->PLL_CTRL_bit.PLL_DIV = 0;
pll_stable_wait = 1000;
while (pll_stable_wait) {
pll_stable_wait--;
}
NT_BOOTFLASH->T_ACC = 6;
NT_COMMON_REG->SYS_CLK = COMMON_REG_SYS_CLK_SEL_SRC_PLLDiv;
}
Код: Выделить всё
void PLL71_OSC12MHz_Init()
{
NT_COMMON_REG->SYS_CLK = COMMON_REG_SYS_CLK_SEL_SRC_ExtOsc;
uint32_t pll_stable_wait = 1000;
while (pll_stable_wait) {
pll_stable_wait--;
}
NT_COMMON_REG->PLL_CTRL_bit.REFSEL = COMMON_REG_PLL_CTRL_REFSEL_ExtOsc;
NT_COMMON_REG->PLL_OD = 1;
NT_COMMON_REG->PLL_NF = 140;
NT_COMMON_REG->PLL_NR = 4;
NT_COMMON_REG->PLL_CTRL_bit.PLL_DIV = 0;
pll_stable_wait = 1000;
while (pll_stable_wait) {
pll_stable_wait--;
}
NT_BOOTFLASH->T_ACC = 6;
NT_COMMON_REG->SYS_CLK = COMMON_REG_SYS_CLK_SEL_SRC_PLLDiv;
}