Запуск RCC выходим на проектные 168 MHz
В данном примере рассматривается инициализация блока тактирования микроконтроллеров серии STM32F4.
В момент подачи питания на микроконтроллер или после сигнала сброса, независимо от других обстоятельств,
ядро тактируется от внутреннего RC-генератора частотой 16 мГц.
При этом PLL (умножитель частоты) отключен, а время задержки чтения из FLASH (latency time) равно нулю.
Такая схема включения гарантирует, что микроконтроллер запустится и начнёт работать всегда, даже если внешний кварц неисправен.
Запуск кварца осуществляется программным способом. Процесс инициализации можно контролировать,
а в случае неисправности функциональных блоков,
обработать ошибку и оставаться затактированным от внутреннего RC.
Микроконтроллеры STM32 имеют в своём составе ещё одну схему защиты, когда при сбое внешнего кварца,
схема тактирования может автоматически переключиться на внутренний RC и без остановок продолжить работу камня,
сигнализируя об ошибке. По умолчанию эта возможность отключена.
Что бы вывести микроконтроллер на проектную мощность - одноцикловый режим работы на частоте 168 мГц, нужно последовательно выполнить несколько простых шагов.
Давайте рассмотрим их поближе.
@ Синтаксис GCC AS
MOV32 R0, RCC_BASE
@ Шаг первый. Включить усилитель HSE
LDR R1, [R0, RCC_CR]
ORR R1, R1, RCC_CR_HSEON
STR R1, [R0, RCC_CR]
@ Ждём готовности кварца
Кварц_ещё_не_готов:
LDR R1, [R0, RCC_CR]
TST R1, RCC_CR_HSERDY
BEQ Кварц_ещё_не_готов
@ Затактировать POWER control
LDR R1, [R0, RCC_APB1ENR]
ORR R1, R1, RCC_APB1ENR_PWREN
STR R1, [R0, RCC_APB1ENR]
MOV32 R1, PWR_BASE+PWR_CR
LDR R2, [R1]
ORR R2, R2, PWR_CR_VOS
STR R2, [R1]
@ Настроить делители шин
@ Именно вот так, каждый по отдельности
LDR R1, [R0, RCC_CFGR]
ORR R1, R1, RCC_CFGR_HPRE_DIV1
STR R1, [R0, RCC_CFGR]
LDR R1, [R0, RCC_CFGR]
ORR R1, R1, RCC_CFGR_PPRE2_DIV2
STR R1, [R0, RCC_CFGR]
LDR R1, [R0, RCC_CFGR]
ORR R1, R1, RCC_CFGR_PPRE1_DIV4
STR R1, [R0, RCC_CFGR]
@ Настроить PLL
MOV32 R1, 8 + (336 << 6) + (((2 >> 1) -1) << 16) + RCC_PLLCFGR_PLLSRC_HSE + (7 << 24)
STR R1, [R0, RCC_PLLCFGR]
@ Включить питание PLL
LDR R1, [R0, RCC_CR]
ORR R1, R1, RCC_CR_PLLON
STR R1, [R0, RCC_CR]
@ Дождаться готовности PLL
PLL_не_готова:
LDR R1, [R0, RCC_CR]
TST R1, RCC_CR_PLLRDY
BEQ PLL_не_готова
@ Настроить instruction cache, data cache и wait state
MOV32 R2, FLASH_R_BASE+FLASH_ACR
LDR R1, [R2]
MOV32 R1, FLASH_ACR_ICEN + FLASH_ACR_DCEN + FLASH_ACR_LATENCY_5WS + FLASH_ACR_PRFTEN
STR R1, [R2]
@ Выбрать PLL в качестве источника тактовых импульсов для камня
LDR R1, [R0, RCC_CFGR]
BIC R1, R1, RCC_CFGR_SW
ORR R1, R1, RCC_CFGR_SW_PLL
STR R1, [R0, RCC_CFGR]
@ Дождаться завершения переходных процессов
PLL_не_выбрана:
LDR R1, [R0, RCC_CFGR]
TST R1, RCC_CFGR_SWS_PLL
BEQ PLL_не_выбрана
@ Ааааа! Держите его! Убежит!!
Ваш микроконтроллер уже молотит на частоте 168 MHz. Не верите??
Аналогичный startup для F103
Для тех, кто вообще не торопится