Advertisement
teplofizik

system.s (12)

Aug 20th, 2012
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Системный файл
  2. ; Плата STM32F4-Discovery
  3. ; http://teplofizik.diary.ru/p179837417.htm
  4.  
  5.     ; Проверять выравнивание стека (8 байт)
  6.     PRESERVE8
  7.  
  8.     ; Секция переменных
  9.     AREA    RAM, NOINIT, READWRITE, ALIGN=3
  10.  
  11.                 EXPORT SysTickCount
  12.                 EXPORT SysTickInterruptEnable
  13.  
  14. ; Счётчик миллисекунд
  15. SysTickCount    DCD 0
  16.  
  17.     AREA    |.text|, CODE, READONLY
  18.  
  19.             IMPORT DelayDivider
  20.  
  21.             EXPORT EnterNonPrivelegedMode
  22.             EXPORT SysTickInit
  23.             EXPORT delay
  24.            
  25.             GET stm32f4xx.inc
  26.  
  27. ; Частота тактирования (МГц) HSI
  28. F_CPU            EQU 168000000
  29. ; Значение для перезагрузки счётчика системного таймера для 1000 Гц
  30. F_SYSTICKRELOAD  EQU (F_CPU / 8000 / 4)
  31.  
  32. ; Настройка системного таймера
  33. ; Аргументы: нет
  34. ; Результат: нет
  35. SysTickInit PROC
  36.             PUSH {LR}
  37.            
  38.             ; Обнулим счётчик миллисекунд
  39.             MOV32 R0, SysTickCount
  40.             MOV   R1, #0
  41.             STR   R1, [R0]
  42.            
  43.             ; Базовый адрес системного таймера
  44.             MOV32 R0, STK_BASE
  45.            
  46.             ; Значение для перезагрузки
  47.             ; Частота таймера: F_CPU / 8 = 2000000 Гц
  48.             ; Тик 1 раз в миллисекунду
  49.             MOV32 R2, F_SYSTICKRELOAD
  50.             MOV32 R1, DelayDivider
  51.             LDR   R1, [R1]
  52.            
  53.             ; Разделить
  54.             UDIV  R1, R2, R1
  55.            
  56.             STR   R1, [R0, #STK_LOAD_OFFSET]
  57.  
  58.            
  59.             MOV   R1, #0
  60.             ; Сбросить счётчик в 0
  61.             STR   R1, [R0, #STK_VAL_OFFSET]
  62.             ; Запуск и разрешение прерывания
  63.             ORR   R1, #STK_CTRL_ENABLE  ; Разрешить тактирование
  64.             STRH  R1, [R0, #STK_CTRL_OFFSET]
  65.            
  66.             POP  {PC}
  67.             ENDP
  68.  
  69. ; Разрешить прерывания системного таймера
  70. ; Аргументы: 1
  71. ;  R0: 1 - разрешить прерывания, 0 - запретить прерывания
  72. ; Результат: нет
  73. SysTickInterruptEnable PROC
  74.             ; Базовый адрес системного таймера
  75.             MOV32 R1, STK_BASE
  76.            
  77.             ; Загрузить содержимое регистра настройки
  78.             LDR   R2, [R1, #STK_CTRL_OFFSET]
  79.            
  80.             ; Установить или сбросить
  81.             CMP   R0, #1
  82.             BEQ   _setflags
  83.            
  84.             ; Остановим вовсе
  85.             ; К сожалению, снятие бита TICKINT не предотвращает появление прерывания
  86.             MOV   R0, #0
  87.             STR   R0, [R1, #STK_CTRL_OFFSET]
  88.            
  89.             B   _exit
  90. _setflags
  91.             ORR   R2, #STK_CTRL_TICKINT
  92.             ORR   R2, #STK_CTRL_ENABLE  ; Разрешить тактирование
  93.            
  94.             STR   R2, [R1, #STK_CTRL_OFFSET]
  95. _exit  
  96.             BX    LR
  97.             ENDP
  98.  
  99. ; Включение непривелигерованного режима
  100. ; Аргументы: нет
  101. ; Результат: нет
  102. EnterNonPrivelegedMode PROC
  103.                        ; Запишем в PSP пока что значение MSP.
  104.                        ; Всё равно оно перезапишется потом при переключении процессов.
  105.                        MRS  R0, MSP
  106.                        MSR  PSP, R0
  107.  
  108.                        ; Установим в регистре CONTROL разделение стеков:
  109.                        MRS  R0, CONTROL
  110.                        ORR  R0, #CONTROL_nPRIV ; Непривелегированный режим
  111.                        ORR  R0, #CONTROL_SPSEL ; Раздельный SP для TM и HM
  112.                        MSR  CONTROL, R0
  113.                        
  114.                        BX   LR
  115.                        ENDP
  116.  
  117. ; Программная задержка
  118. ; Аргументы: 1
  119. ;  R0 - величина задержки
  120. ; Результат: нет
  121. delay       PROC
  122.             ; Вычитаем единицу
  123.             SUBS R0, R0, #1
  124.             ; Пока не обнулилась, крутим дальше
  125.             BNE  delay
  126.            
  127.             BX   LR
  128.             ENDP
  129.  
  130.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement