STM32F100: RTC - инициализация и настройка будильника


Что бы запустить RTC, требуется выполнить несколько простейших шагов.


    ; Шаг первый. Разрешить доступ к backup domain
    ; Установкой бита DBP = 1
    MOV32 R0, (PWR_CR & 0x00FFFFFF) * 0x20 \
            + 0x42000000 \
            + 8 * 4
    STR R11, [R0]


    ; Проверить готовность CNF
    MOV32 R0, RTC_CRL
wait_cnf
    LDR R1, [R0]
    TST R1, RTC_CRL_RTOFF
    BEQ wait_cnf


    ; Разрешить перезапись регистров RTC
    ; Установкой в 1 бита CNF
    MOV32 R0, (RTC_CRL & 0x00FFFFFF) * 0x20 \
            + 0x42000000 \
            + 4 * 4
    STR R11, [R0]


    ; Включить усилитель часового кварца, LSEON = 1
    ; Для включения используем метод BitBand
    MOV32 R0, (RCC_BDCR & 0x00FFFFFF) * 0x20 \
            + 0x42000000 \
            + 0 * 4
            ;^^^ здесь 0 - номер бита, который нужно включить
    STR R11, [R0]


    ; Ждём готовности часового кварца
    ; Внимание! Если с кварцем будут проблемы
    ; Такой цикл рискует стать бесконечным!
    MOV32 R0, RCC_BDCR
wait_lserdy
    LDR R1, [R0]
    TST R1, RCC_BDCR_LSERDY
    BEQ wait_lserdy


    ; Выбираем внешний часовой кварц
    ; В качестве источника тактовых импульсов для часов
    ; RTCSEL = 01
    MOV32 R0, (RCC_BDCR & 0x00FFFFFF) * 0x20 \
            + 0x42000000 \
            + 8 * 4
    STR R11, [R0]


    ; Установить делитель часового кварца на 32.768 - 1 Гц
    MOV32 R0, RTC_PRLH
    STRH R10, [R0], 4
    MOV R1, 0x7FFF
    STRH R1, [R0]


    ; А теперь запустим наши часики, пущяй тикают
    ; RTCEN = 1
    MOV32 R0, (RCC_BDCR & 0x00FFFFFF) * 0x20 \
            + 0x42000000 \
            + 15 * 4
    STR R11, [R0]


    ; Теперь можно изменять значения часовых регистров.
    ; Внимание! Что бы регистры изменились, часы должны тикать!


    ; Установить какое-нибудь начальное время
    ; Обычно время задаётся в секундах с начала эпохи
    MOV32 R0, RTC_CNTL
    MOV32 R1, 1000000000
    STRH R1, [R0], -4
    ROR R1, R1, #16
    STRH R1, [R0]


    ; Задать время для будильника
    ; Очевидно, оно должно быть больше текущего времени
    MOV32 R0, RTC_ALRL
    MOV32 R1, 1000000000+100
    STRH R1, [R0], -4
    ROR R1, R1, #16
    STRH R1, [R0]


    ; Сбросить флаг CNF, что бы изменения часовых регистров вступили в силу
    MOV32 R0, (RTC_CRL & 0x00FFFFFF) * 0x20 \
            + 0x42000000 \
            + 4 * 4
    STR R10, [R0]


    ; Дождаться обновления регистров
    ; Не забудьте предварительно запустить часы (код выше)
    ; Иначе этот цикл станет бесконечным
    MOV32 R0, RTC_CRL
wait_cnf2
    LDR R1, [R0]
    TST R1, RTC_CRL_RTOFF
    BEQ wait_cnf2


    ; Теперь можно заблокировать доступ к backup domain
    ; Установкой бита DBP = 0
    MOV32 R0, (PWR_CR & 0x00FFFFFF) * 0x20 \
            + 0x42000000 \
            + 8 * 4
    STR R10, [R0]


Вот собственно и всё. Смотрите, не опоздайте! Вовремя заводите будильник!!