Блок управления тактированием поддерживает:
- внутренний 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).
Для выбора 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);