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