Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Пример работы с контроллером прерываний NVIC
- ; STM32F4-Discovery
- ; http://teplofizik.diary.ru/p185883429.htm
- ; Проверять выравнивание стека (8 байт)
- PRESERVE8
- ; Секция переменных
- AREA RAM, NOINIT, READWRITE, ALIGN=3
- Counter DCD 0 ; Счётчик переполнений таймера
- AREA |.text|, CODE, READONLY
- GET stm32f4xx.inc
- GET nvic.inc
- ; Внешнее прерывание
- EXPORT EXTI0_IRQHandler
- EXTI0_IRQHandler PROC
- ; Прерывание автоматически сохраняет состояние регистров 0-3, 12, LR, PC на стеке
- ; Увеличим счётчик на 1
- LDR R0, =Counter
- LDR R1, [R0]
- ADD R1, #1
- STR R1, [R0]
- ; Сбросим флаг прерывания (иначе никогда из него не выйдем)
- LDR R0, =EXTI_BASE
- ; Сброс выполняется записью бита
- MOV R1, #EXTI_PR_PR0
- STR R1, [R0, #EXTI_PR_OFFSET]
- BX LR
- ENDP
- ; Заглушка инициализации системы тактирования
- EXPORT SystemInit
- SystemInit PROC
- ; Возврат
- BX LR
- ENDP
- ; Главная программа
- EXPORT __main
- __main PROC
- ; Сбросим счётчик
- MOV R1, #0
- LDR R7, =Counter
- STR R1, [R7]
- ; Кнопка прицеплена на ногу PA0
- ; Разрешим прерывание от 0 линии EXTI
- MOV R0, #EXTI0_IRQn
- BL NVIC_EnableIRQ
- ; Загружаем базовое смещение регистра настройки тактирования
- LDR R0, =RCC_APB2ENR
- ; Установить флаг разрешения тактирования SYSCFG (он же тактирует и EXTI)
- LDR R1, [R0]
- ORR R1, #RCC_APB2ENR_SYSCFGEN
- STR R1, [R0]
- ; Загружаем базовое смещение SYSCFG
- LDR R0, =SYSCFG_BASE
- ; Записываем, с каого порта берём сигнал
- ; По-человечески надо считывать регистр, обнулять нужную часть и
- ; записывать необходимое число. Но пофиг.
- LDR R1, =0x0000 ; Порт A (0) на первые 4 пина
- STR R1, [R0, #SYSCFG_EXTICR1_OFFSET]
- ; Загружаем базовое смещение EXTI
- LDR R0, =EXTI_BASE
- ; Маска, разрешаем генерировать прерывание на канале 0
- LDR R1, =EXTI_IMR_MR0
- STR R1, [R0, #EXTI_IMR_OFFSET]
- ; Любой фронт
- ; В идеале тут тоже надо просто ставить бит, а не вот так
- MOV R1, #EXTI_FTSR_TR0
- STR R1, [R0, #EXTI_FTSR_OFFSET]
- MOV R1, #EXTI_RTSR_TR0
- STR R1, [R0, #EXTI_RTSR_OFFSET]
- __mainloop ; Вечный цикл
- ; Смотрим, что натикал счётчик
- LDR R0, =Counter
- LDR R1, [R0]
- ; Новый круг~
- B __mainloop
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement