Advertisement
teplofizik

main.s (exti)

Mar 1st, 2013
345
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Пример работы с контроллером прерываний NVIC
  2. ; STM32F4-Discovery
  3. ; http://teplofizik.diary.ru/p185883429.htm
  4.  
  5.     ; Проверять выравнивание стека (8 байт)
  6.     PRESERVE8
  7.    
  8.     ; Секция переменных
  9.     AREA    RAM, NOINIT, READWRITE, ALIGN=3
  10.  
  11. Counter             DCD 0 ; Счётчик переполнений таймера
  12.    
  13.     AREA    |.text|, CODE, READONLY
  14.     GET stm32f4xx.inc
  15.     GET nvic.inc
  16.  
  17. ; Внешнее прерывание
  18.             EXPORT EXTI0_IRQHandler
  19. EXTI0_IRQHandler  PROC
  20.                     ; Прерывание автоматически сохраняет состояние регистров 0-3, 12, LR, PC на стеке
  21.                    
  22.                     ; Увеличим счётчик на 1
  23.                     LDR   R0, =Counter
  24.                     LDR   R1, [R0]
  25.                     ADD   R1, #1
  26.                     STR   R1, [R0]
  27.                    
  28.                     ; Сбросим флаг прерывания (иначе никогда из него не выйдем)
  29.                     LDR   R0, =EXTI_BASE
  30.                    
  31.                     ; Сброс выполняется записью бита
  32.                     MOV   R1, #EXTI_PR_PR0
  33.                     STR   R1, [R0, #EXTI_PR_OFFSET]
  34.                    
  35.                     BX LR
  36.                     ENDP
  37.                    
  38. ; Заглушка инициализации системы тактирования
  39.             EXPORT SystemInit
  40. SystemInit  PROC
  41.             ; Возврат
  42.             BX    LR
  43.             ENDP
  44.            
  45. ; Главная программа
  46.             EXPORT __main
  47. __main      PROC
  48.             ; Сбросим счётчик
  49.             MOV   R1, #0
  50.             LDR   R7, =Counter
  51.             STR   R1, [R7]
  52.  
  53.             ; Кнопка прицеплена на ногу PA0
  54.  
  55.             ; Разрешим прерывание от 0 линии EXTI
  56.             MOV   R0, #EXTI0_IRQn
  57.             BL    NVIC_EnableIRQ
  58.  
  59.             ; Загружаем базовое смещение регистра настройки тактирования
  60.             LDR   R0, =RCC_APB2ENR
  61.            
  62.             ; Установить флаг разрешения тактирования SYSCFG (он же тактирует и EXTI)
  63.             LDR   R1, [R0]
  64.             ORR   R1, #RCC_APB2ENR_SYSCFGEN
  65.             STR   R1, [R0]
  66.            
  67.             ; Загружаем базовое смещение SYSCFG
  68.             LDR   R0, =SYSCFG_BASE
  69.            
  70.             ; Записываем, с каого порта берём сигнал
  71.             ; По-человечески надо считывать регистр, обнулять нужную часть и
  72.             ; записывать необходимое число. Но пофиг.
  73.             LDR   R1, =0x0000         ; Порт A (0) на первые 4 пина
  74.             STR   R1, [R0, #SYSCFG_EXTICR1_OFFSET]
  75.            
  76.             ; Загружаем базовое смещение EXTI
  77.             LDR   R0, =EXTI_BASE
  78.            
  79.             ; Маска, разрешаем генерировать прерывание на канале 0
  80.             LDR   R1, =EXTI_IMR_MR0
  81.             STR   R1, [R0, #EXTI_IMR_OFFSET]
  82.            
  83.             ; Любой фронт
  84.             ; В идеале тут тоже надо просто ставить бит, а не вот так
  85.             MOV   R1, #EXTI_FTSR_TR0
  86.             STR   R1, [R0, #EXTI_FTSR_OFFSET]
  87.             MOV   R1, #EXTI_RTSR_TR0
  88.             STR   R1, [R0, #EXTI_RTSR_OFFSET]
  89.            
  90. __mainloop  ; Вечный цикл
  91.             ; Смотрим, что натикал счётчик
  92.             LDR   R0, =Counter
  93.             LDR   R1, [R0]
  94.            
  95.             ; Новый круг~
  96.             B __mainloop
  97.  
  98.             ENDP
  99.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement