Advertisement
Guest User

main.s (asm_nvic)

a guest
Nov 19th, 2012
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Пример работы с контроллером прерываний NVIC
  2. ; STM32F4-Discovery
  3.  
  4.     ; Проверять выравнивание стека (8 байт)
  5.     PRESERVE8
  6.    
  7.     ; Секция переменных
  8.     AREA    RAM, NOINIT, READWRITE, ALIGN=3
  9.  
  10. Counter             DCD 0 ; Счётчик переполнений таймера
  11.    
  12.     AREA    |.text|, CODE, READONLY
  13.     GET stm32f4xx.inc
  14.     GET nvic.inc
  15.  
  16. ; Прерывание от таймера 6
  17.             EXPORT TIM6_DAC_IRQHandler
  18. TIM6_DAC_IRQHandler PROC
  19.                     ; Прерывание автоматически сохраняет состояние регистров 0-3, 12, LR, PC на стеке
  20.                    
  21.                     ; Увеличим счётчик на 1
  22.                     LDR   R0, =Counter
  23.                     LDR   R1, [R0]
  24.                     ADD   R1, #1
  25.                     STR   R1, [R0]
  26.                    
  27.                     ; Сбросим флаг прерывания (иначе никогда из него не выйдем)
  28.                     LDR   R0, =TIMER6_BASE
  29.                    
  30.                     LDR   R1, [R0, #TIM_SR_OFFSET]
  31.                     MVN   R2, #TIM_SR_UIF
  32.                     AND   R1, R2
  33.                     STR   R1, [R0, #TIM_SR_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.             ; Разрешим прерывание от таймера 6
  54.             MOV   R0, #TIM6_DAC_IRQn
  55.             BL    NVIC_EnableIRQ
  56.  
  57.             ; Загружаем базовое смещение регистра настройки тактирования
  58.             LDR   R0, =RCC_APB1ENR
  59.            
  60.             ; Установить флаг разрешения тактирования таймера 6
  61.             LDR   R1, [R0]
  62.             ORR   R1, #RCC_APB1ENR_TIM6EN
  63.             STR   R1, [R0]
  64.            
  65.             ; Загружаем базовое смещение таймера 6
  66.             LDR   R0, =TIMER6_BASE
  67.            
  68.             ; Записываем, до скольки считать
  69.             LDR   R1, =0x8000         ; Числа от балды
  70.             STR   R1, [R0, #TIM_ARR_OFFSET]
  71.            
  72.             ; Настраиваем предделитель таймера
  73.             LDR   R1, =0x0100         ; Числа от балды
  74.             STR   R1, [R0, #TIM_PSC_OFFSET]
  75.            
  76.             ; Разрешаем генерацию прерывания
  77.             MOV   R1, #TIM_DIER_UIE
  78.             STR   R1, [R0, #TIM_DIER_OFFSET]
  79.            
  80.             ; Включаем таймер TIM6
  81.             MOV   R1, #TIM_CR1_CEN   ; Разрешить счёт
  82.             STR   R1, [R0, #TIM_CR1_OFFSET]
  83.  
  84. __mainloop  ; Вечный цикл
  85.             ; Прочитаем регистр CNT (сколько насчитал таймер)
  86.             LDR   R1, [R0, #TIM_CNT_OFFSET]
  87.            
  88.             ; Прочитаем содержимое переменной-счётчика
  89.             LDR   R3, [R7]
  90.            
  91.             ; Новый круг~
  92.             B __mainloop
  93.  
  94.             ENDP
  95.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement