Найти тему

GD32F303. Тактирование

Блок управления тактированием поддерживает:

  • внутренний RC-генератор 8M (IRC8M),
  • внутренний RC-генератор 48M (IRC48M),
  • высокоскоростной кварцевый осциллятор (HXTAL),
  • низкоскоростной внутренний RC-генератор 40K (IRC40K),
  • низкоскоростной кварцевый генератор (LXTAL),
  • ФАПЧ (PLL).

Тактирование большей части периферии и ядра осуществляется от IRC8M (дефолтный), HXTAL или PLL. Максимальная частота системного тактирования (CK_SYS) может достигать 120 МГц.
Настройка CK_SYS осуществляется через регистры CTL и CFG0 блока RCU (смотрите “Reset and clock unit (RCU)”, User Manual).

-2

Для выбора IRC8M в качестве источника системного тактирования необходимо:

  • Сбросить биты SCS регистра CFG0,
  • Установить биты IRC8MADJ4 и IRC8MEN регистра CTL и дождаться установки флага стабилизации IRC8MSTB.

Bare metal
/* select IRC8M as CK_SYS source */
RCU->CFG0 = 0;
while(RCU->CFG0);
/* enable oscillator */
RCU->CTL = RCU_CTL_IRC8MADJ_4 | RCU_CTL_IRC8MEN;
while(!(RCU->CTL & RCU_CTL_IRC8MSTB));

Driver
/* select IRC8M as CK_SYS source */
rcu_system_clock_source_config(RCU_CKSYSSRC_IRC8M);
/* enable oscillator */
rcu_osci_on(RCU_IRC8M);
rcu_osci_stab_wait(RCU_IRC8M);

Для выбора HXTAL в качестве источника системного тактирования необходимо:

  • Установить бит SCS0 регистра CFG0,
  • Установить бит HXTALEN регистра CTL и дождаться установки флага стабилизации HXTALSTB,
  • Сбросить бит IRC8MEN регистра CTL.

Bare metal
/* select HXTAL as CK_SYS source */
RCU->CFG0 = RCU_CFG0_SCS_0;
/* enable oscillator */
RCU->CTL |= RCU_CTL_HXTALEN;
while(!(RCU->CTL & RCU_CTL_HXTALSTB));
/* disable IRC8M */
RCU->CTL &= ~RCU_CTL_IRC8MEN;

Driver
/* select HXTAL as CK_SYS source */
rcu_system_clock_source_config(RCU_CKSYSSRC_HXTAL);
/* enable oscillator */
rcu_osci_on(RCU_HXTAL);
rcu_osci_stab_wait(RCU_HXTAL);

Для выбора PLL от IRC8M/2 в качестве источника системного тактирования необходимо:

  • Установить бит SCS1 регистра CFG0,
  • Записать требуемое значение в биты PLLMF регистра CFG0 (например, 0b1000 для умножения на 10),
  • Установить бит IRC8MEN регистра CTL и дождаться установки флага стабилизации IRC8MSTB,
  • Установить бит PLLEN регистра CTL и дождаться установки флага стабилизации PLLSTB.

Bare metal
/* select PLL as CK_SYS source */
RCU->CFG0 = RCU_CFG0_SCS_1;
/* multiply by 10 */
RCU->CFG0 |= RCU_CFG0_PLLMF_3;
/* enable oscillator */
RCU->CTL = RCU_CTL_IRC8MEN;
while(!(RCU->CTL & RCU_CTL_IRC8MSTB));
/* enable PLL */
RCU->CTL |= RCU_CTL_PLLEN;
while(!(RCU->CTL & RCU_CTL_PLLSTB));

Driver
/* select PLL as CK_SYS source */
rcu_system_clock_source_config(RCU_CKSYSSRC_PLL);
/* select IRC8M/2 as oscillator */
/* multiply by 10 */
rcu_pll_config(RCU_PLLSRC_IRC8M_DIV2, RCU_PLL_MUL10);
/* enable oscillator */
rcu_osci_on(RCU_PLL_CK);
rcu_osci_stab_wait(RCU_PLL_CK);

Для выбора PLL от HXTAL в качестве источника системного тактирования необходимо:

  • Установить бит SCS1 регистра CFG0,
  • Установить бит PLLSEL регистра CFG0,
  • Записать требуемое значение в биты PLLMF регистра CFG0 (например, 0b1000 для умножения на 10),
  • Установить бит HXTALEN регистра CTL и дождаться установки флага стабилизации HXTALSTB,
  • Сбросить бит IRC8MEN регистра CTL.
  • Установить бит PLLEN регистра CTL и дождаться установки флага стабилизации PLLSTB.

Bare metal
/* select PLL as CK_SYS source */
RCU->CFG0 = RCU_CFG0_SCS_1;
/* select HXTAL as oscillator */
RCU->CFG0 |= RCU_CFG0_PLLSEL;
/* multiply by 10 */
RCU->CFG0 |= RCU_CFG0_PLLMF_3;
/* enable oscillator */
RCU->CTL = RCU_CTL_HXTALEN;
while(!(RCU->CTL & RCU_CTL_HXTALSTB));
/* disable IRC8M */
RCU->CTL &= ~RCU_CTL_IRC8MEN;
/* enable PLL */
RCU->CTL |= RCU_CTL_PLLEN;
while(!(RCU->CTL & RCU_CTL_PLLSTB));

Driver
/* select PLL as CK_SYS source */
rcu_system_clock_source_config(RCU_CKSYSSRC_PLL);
/* select HXTAL as oscillator */
/* multiply by 10 */

rcu_pll_config(RCU_PLLPRESRC_HXTAL, RCU_PLL_MUL10);
/* enable oscillator */
rcu_osci_on(RCU_PLL_CK);
rcu_osci_stab_wait(RCU_PLL_CK);