Запуск 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
Для тех, кто вообще не торопится