
Тема этой части статьи — система тактирования МК GD32F303CCT6. Блок управления тактированием GD32F303CCT6 поддерживает:
• внутренний RC-генератор 8 MГц (IRC8M),
• внутренний RC-генератор 48 MГц (IRC48M),
• высокоскоростной кварцевый осциллятор (HXTAL),
• низкоскоростной внутренний RC-генератор 40 кГц (IRC40K),
• низкоскоростной кварцевый генератор (LXTAL),
• ФАПЧ (PLL).
Тактирование большей части периферии и ядра осуществляется от IRC8M (дефолтный), HXTAL или PLL. Максимальная частота системного тактирования (CK_SYS) может достигать 120 МГц.
Настройка CK_SYS осуществляется через регистры CTL и CFG0 блока RCU (подробнее смотрите “Reset and clock unit (RCU)”, User Manual).
Следует иметь в виду, что дефолтное значение регистра CTL - 0x0000xx83 (0bxxxxxxxx10000011), т.е. установлены биты 0, 1 и 7, а значение битов 8-15 – неопределённо.
Для выбора 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 IRC8MEN */
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 IRC8MEN */
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);
Файлы
🎁code.zip 382.32 Kb ⇣ 8Продолжение следует!
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.