@.CHARSET CP1251

@.DESC name=SYSCLK24 type=proc
@ +------------------------------------------------------------+
@ |               Модуль настройки тактирования                |
@ +------------------------------------------------------------+
@ | микроконтроллер: STM32F100RBxx                             |
@ | Отладочнвя плата: STM32 VL Discovery                       |
@ +------------------------------------------------------------+
@ | Модуль настроивает тактирование микроконтроллера           |
@ | на внешний кварцевый генератор HSE с частотой 8 мгц        |
@ | с умножением частоты при помощи блока PLL на 3 до 24 мгц   |
@ +------------------------------------------------------------+
@ | LATENCY не настраивается - частота 24 мгц этого не требует |
@ | блок контроля CSS работы HSE не настраивается              |
@ +------------------------------------------------------------+
@ | Видеоурок по этому модулю: https://youtu.be/Qtu_V-fOAjY    |
@ | ArmAsmEditor: STM32 на Ассемблере:  Настройка тактирования | 
@ | микроконтроллера на 24 мгц. Видео 11                       |
@ +------------------------------------------------------------+
@.ENDDESC

@ GNU AS
.syntax unified
.cpu cortex-m3
.thumb

.INCLUDE   "/src/inc/rcc.inc"            @ файл определений RCC

.SECTION  .asmcode

.GLOBAL SYSCLK24
SYSCLK24:           @ инициализация BB значения для записи
                    MOV        R1, 1

                 @ установим BB адрес RCC_CR
                    LDR        R2, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_CR ) * 32

                    STR        R1, [ R2, RCC_CR_HSEON_N * 4 ]    @ включим HSE

WAIT_HSE:           LDR        R3, [ R2, RCC_CR_HSERDY_N * 4 ]   @ флаг HSE Ready - готовность внешнего генератора
                    CMP        R3, 1                             @ ждем установки флага готовности HSE
                    BNE        WAIT_HSE
                 @ здесь HSE (внешний кварц) запущен и работает

                    LDR        R4, = RCC + RCC_CFGR                      @ регистр настройки
                    LDR        R3, = RCC_CFGR_PLLSRC + RCC_CFGR_PLLMUL3  @ PLLSRC=1 "Clock from PREDIV1 selected as the PLL inp clock" + множитель PLL=3
                    STR        R3, [ R4 ]

                    STR        R1, [ R2, RCC_CR_PLLON_N * 4 ]    @ включим PLL

WAIT_PLL:           LDR        R3, [ R2, RCC_CR_PLLRDY_N * 4 ]   @ флаг PLL Ready - готовность умножителя PLL
                    CMP        R3, 1                             @ ждем установки флага готовности PLL
                    BNE        WAIT_PLL
                 @ здесь PLL запущен и работает

                    LDR        R5, [ R4 ]
                    ORR        R5, R5, RCC_CFGR_SW_PLL       @ включим pll как источник sysclk
                    STR        R5, [ R4 ]

WAIT_SYSCLK:        LDR        R5, [ R4 ]
                    TST        R5, RCC_CFGR_SWS_PLL          @ ждем выбора PLL как источника системной частоты
                    BEQ        WAIT_SYSCLK

                    BX         LR

