Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Системный файл
- ; Плата STM32F4-Discovery
- ; http://teplofizik.diary.ru/p179837417.htm
- ; Проверять выравнивание стека (8 байт)
- PRESERVE8
- ; Секция переменных
- AREA RAM, NOINIT, READWRITE, ALIGN=3
- EXPORT SysTickCount
- EXPORT SysTickInterruptEnable
- ; Счётчик миллисекунд
- SysTickCount DCD 0
- AREA |.text|, CODE, READONLY
- IMPORT DelayDivider
- EXPORT EnterNonPrivelegedMode
- EXPORT SysTickInit
- EXPORT delay
- GET stm32f4xx.inc
- ; Частота тактирования (МГц) HSI
- F_CPU EQU 168000000
- ; Значение для перезагрузки счётчика системного таймера для 1000 Гц
- F_SYSTICKRELOAD EQU (F_CPU / 8000 / 4)
- ; Настройка системного таймера
- ; Аргументы: нет
- ; Результат: нет
- SysTickInit PROC
- PUSH {LR}
- ; Обнулим счётчик миллисекунд
- MOV32 R0, SysTickCount
- MOV R1, #0
- STR R1, [R0]
- ; Базовый адрес системного таймера
- MOV32 R0, STK_BASE
- ; Значение для перезагрузки
- ; Частота таймера: F_CPU / 8 = 2000000 Гц
- ; Тик 1 раз в миллисекунду
- MOV32 R2, F_SYSTICKRELOAD
- MOV32 R1, DelayDivider
- LDR R1, [R1]
- ; Разделить
- UDIV R1, R2, R1
- STR R1, [R0, #STK_LOAD_OFFSET]
- MOV R1, #0
- ; Сбросить счётчик в 0
- STR R1, [R0, #STK_VAL_OFFSET]
- ; Запуск и разрешение прерывания
- ORR R1, #STK_CTRL_ENABLE ; Разрешить тактирование
- STRH R1, [R0, #STK_CTRL_OFFSET]
- POP {PC}
- ENDP
- ; Разрешить прерывания системного таймера
- ; Аргументы: 1
- ; R0: 1 - разрешить прерывания, 0 - запретить прерывания
- ; Результат: нет
- SysTickInterruptEnable PROC
- ; Базовый адрес системного таймера
- MOV32 R1, STK_BASE
- ; Загрузить содержимое регистра настройки
- LDR R2, [R1, #STK_CTRL_OFFSET]
- ; Установить или сбросить
- CMP R0, #1
- BEQ _setflags
- ; Остановим вовсе
- ; К сожалению, снятие бита TICKINT не предотвращает появление прерывания
- MOV R0, #0
- STR R0, [R1, #STK_CTRL_OFFSET]
- B _exit
- _setflags
- ORR R2, #STK_CTRL_TICKINT
- ORR R2, #STK_CTRL_ENABLE ; Разрешить тактирование
- STR R2, [R1, #STK_CTRL_OFFSET]
- _exit
- BX LR
- ENDP
- ; Включение непривелигерованного режима
- ; Аргументы: нет
- ; Результат: нет
- EnterNonPrivelegedMode PROC
- ; Запишем в PSP пока что значение MSP.
- ; Всё равно оно перезапишется потом при переключении процессов.
- MRS R0, MSP
- MSR PSP, R0
- ; Установим в регистре CONTROL разделение стеков:
- MRS R0, CONTROL
- ORR R0, #CONTROL_nPRIV ; Непривелегированный режим
- ORR R0, #CONTROL_SPSEL ; Раздельный SP для TM и HM
- MSR CONTROL, R0
- BX LR
- ENDP
- ; Программная задержка
- ; Аргументы: 1
- ; R0 - величина задержки
- ; Результат: нет
- delay PROC
- ; Вычитаем единицу
- SUBS R0, R0, #1
- ; Пока не обнулилась, крутим дальше
- BNE delay
- BX LR
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement