@.CharSet=CP1251
@GNU AS

.syntax unified     @ синтаксис исходного кода
.thumb              @ тип используемых инструкций Thumb
.cpu cortex-m3      @ процессор

.INCLUDE   "/src/inc/rcc.inc"    @ определения RCC
.INCLUDE   "/src/inc/gpio.inc"

.equ xtim1_fl_cnt, 20   @ число срабатываний до переключения на следующий х-таймер
.equ xtim1_period, 100  @ период срабатывания в миллисекундах

.equ xtim2_fl_cnt, 6
.equ xtim2_period, 1000

.equ xtim3_fl_cnt, 10
.equ xtim3_period, 500

.equ xtim4_fl_cnt, 4
.equ xtim4_period, 2000

.equ xtim5_fl_cnt, 50
.equ xtim5_period, 40

@ +------------------------------------------------------------------------------------------------+
@ |    логика работы:                                                                              |
@ |    создаем 5 х-таймеров с единым для всех колбэком, запускаем xtim1                            |
@ |      в колбэке переключаем LED и проверяем сколько раз сработал таймер по флагу-счетчику       |
@ |                и если он сработал нужное число раз, тогда останавливаем xtim1 и запускем xtim2 |
@ |      и так далее...                                                                            |
@ |   пример показывает последовательную работу 5 х-таймеров с одним колбэком.                     |
@ +------------------------------------------------------------------------------------------------+

.section .bss
xtim1: .word 0    @ переменые для хранения идентификаторов х-таймеров
xtim2: .word 0
xtim3: .word 0
xtim4: .word 0
xtim5: .word 0

fl_cnt:       .space  ( 5 * 4 )  @  массив пределов флаг-счётчиков

.section .asmcode

@ основная программа
.global Start
Start:              @ поместите код своей программы ниже
 @ системная частота на 72 MHz
                    BL         SYSCLK72

@ инициализация PC13
                    bl        PortC13_init

@ инициализация модуля х-таймеров
                    bl         xtimer_Init

@ добавление (создание) х-таймеров:
                    ldr        r0, = XTIMER_MODE_CYCLE_FLAG
                    ldr        r1, = xtim1_period
                    ldr        r2, = x_callback
                    bl         xtimer_Add    @ добавили новый х-таймер с частотой 100мс, в режиме XTIMER_MODE_CYCLE_FLAG (циклический с флагом-счетчиком)
                                             @ с колбэком по переполнению callback1
                    ldr        r3, = xtim1
                    str        r7, [ r3 ]    @ сохранили его идентификатор для дальнейшей работы
                         @ Следующий х-таймер
                    ldr        r0, = XTIMER_MODE_CYCLE_FLAG
                    ldr        r1, = xtim2_period    @ 1 раз в секунду
                    ldr        r2, = x_callback
                    bl         xtimer_Add    @ добавили новый х-таймер
                    ldr        r3, = xtim2
                    str        r7, [ r3 ]    @ сохранили его идентификатор
                         @ Следующий х-таймер
                    ldr        r0, = XTIMER_MODE_CYCLE_FLAG
                    ldr        r1, = xtim3_period
                    ldr        r2, = x_callback
                    bl         xtimer_Add    @ добавили новый х-таймер
                    ldr        r3, = xtim3
                    str        r7, [ r3 ]    @ сохранили его идентификатор
                         @ Следующий х-таймер
                    ldr        r0, = XTIMER_MODE_CYCLE_FLAG
                    ldr        r1, = xtim4_period    @ 1 раз в 2 секунды
                    ldr        r2, = x_callback
                    bl         xtimer_Add    @ добавили новый х-таймер
                    ldr        r3, = xtim4
                    str        r7, [ r3 ]    @ сохранили его идентификатор
                         @ Следующий х-таймер
                    ldr        r0, = XTIMER_MODE_CYCLE_FLAG
                    ldr        r1, = xtim5_period
                    ldr        r2, = x_callback
                    bl         xtimer_Add    @ добавили новый х-таймер
                    ldr        r3, = xtim5
                    str        r7, [ r3 ]    @ сохранили его идентификатор в xtim5

          @ это мы только создали новые х-таймеры, но ни один не запустили
          @ готовим массив fl_cnt
              ldr    r1, = fl_cnt
              ldr    r0, = xtim1_fl_cnt
              str    r0, [ r1 ], 4    @ Post-indexed адресация
              ldr    r0, = xtim2_fl_cnt
              str    r0, [ r1 ], 4
              ldr    r0, = xtim3_fl_cnt
              str    r0, [ r1 ], 4
              ldr    r0, = xtim4_fl_cnt
              str    r0, [ r1 ], 4
              ldr    r0, = xtim5_fl_cnt
              str    r0, [ r1 ]

          @ запустить xtim1
                    ldr        r3, = xtim1
                    ldr        r7, [ r3 ]      @ r0 = xtim1;
                    bl         xtimer_Start    @ запск xtim1

MAIN_LOOP:
                    nop
                    nop
                    nop
                    B          MAIN_LOOP



PortC13_init:
                    push       { r0 - r2 }
                    mov        r1, 1
                    ldr        r0, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_APB2ENR ) * 32
                    str        r1, [ r0, RCC_APB2ENR_IOPCEN_N * 4 ]

                    ldr        r0, = GPIOC
                    ldr        r1, [ r0, GPIO_CRH ]
                    mov        r2, GPIO_MODE_OUT2
                    bfi        r1, r2, GPIO_CRH_MODE13_N, 4
                    str        r1, [ r0, GPIO_CRH ]

                    pop        { r0 - r2 }
                    bx         lr


.EQU  pc13_out_bb   , PERIPH_BASE + PERIPH_BB_BASE + ( GPIOC_BASE + GPIO_ODR ) * 32 + 13 * 4
.global toggle_LED
toggle_LED:         push       { r1 - r3 }
                    mov        r1, 1
                    ldr        r2, = pc13_out_bb
                    ldr        r3, [ r2 ]
                    sub        r3, r1, r3    @ R3 = 1 - R3
                    str        r3, [ r2 ]
                    pop        { r1 - r3 }
                    bx         lr


x_callback:   push   { lr }  @ на входе r1 = compare, r3 = FlagCnt, r0 = r7 = tID индекс таймера
              bl     toggle_LED    @ переключим LED

              ldr    r1, = fl_cnt @ базовый адрес fl_cnt
              mov    r2, 4        @ множитель
              mla    r1, r7, r2, r1  @  r1 = tID * 4 + addr(fl_cnt)
              ldr    r1, [ r1 ]  @  r1 = fl_cnt[ tID ] - получили предел для флаг-счетчика текущего х-таймера.

              cmp    r3, r1
              it     ls    @ если не досчитали, то выходим
              popls  { pc }
         @ если досчитали, то останавливаем xtim1 и запускаем xtim2
              bl     xtimer_Stop          @ остановили текущий х-таймер ( используем r7 =tID )
              add    r7, 1  @ следующий по-порядку х-таймер
              cmp    r7, 4
              it     hi
              movhi  r7, 0  @ если идентификатор след.х-таймера больше 5, тогда обнуляем его
              mov    r3, 0
              bl     xtimer_SetFlagCnt    @ сбросили флаг-счетчик след.х-таймера
              bl     xtimer_Restart       @ запустили следующий х-таймер
              pop    { pc }



