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]
Вот собственно и всё. Смотрите, не опоздайте! Вовремя заводите будильник!!