@.CHARSET  CP1251

@ GNU AS
.SYNTAX   unified
.CPU      cortex-m4
.THUMB
.FPU      fpv4-sp-d16

.INCLUDE   "/src/inc/rcc.inc"
.INCLUDE   "/src/inc/tim2-5.inc"
.INCLUDE   "/src/inc/nvic.inc"
.INCLUDE  "/src/inc/gpio.inc"

@.DESC     name=TIM4_INIT type=proc
@ +--------------------------------------------------------+
@ |                                                        |
@ |      Настройка Timer 4 для генерации прерываний        |
@ |                    2 раза в секунду                    |
@ |                                                        |
@ +--------------------------------------------------------+
@.ENDDESC

.SECTION  .asmcode

.GLOBAL   TIM4_INIT
TIM4_INIT:

                    MOV        R1, 1

                     @ включим тактирование Timer 4
                    LDR        R2, = PERIPH_BB_BASE + ( RCC_BASE + RCC_APB1ENR ) * 32 + RCC_APB1ENR_TIM4EN_N * 4
                    STR        R1, [ R2 ]

                     @ настройка таймера Timer 4
                    LDR        R2, = TIM4

                    LDR        R0, = 42000 - 1    @ предделитель счетчика частота счета 42 000 000 / 42 000 = 1 000 гц
                    STR        R0, [ R2, TIM2T5_PSC ]

                    LDR        R0, = 500-1    @ максимальное значение счетчика (переполнение 2 раза в секунду)
                    STR        R0, [ R2, TIM2T5_ARR ]

                    LDR        R0, = TIM2T5_CR1_CEN + TIM2T5_CR1_APRE    @ включить таймер
                    STR        R0, [ R2, TIM2T5_CR1 ]

                @ включим прерывания по переполнению счетчика
                    MOV        R0, TIM2T5_DIER_UIE
                    STR        R0, [ R2, TIM2T5_DIER ]

                @ зададим приоритет прерывания
                    LDR        R0, = NVIC_BASE
                    LDR        R1, [ R0, NVIC_IPR7 ]
                    MOV        R2, 0xF0              @ 0xF0 - низший приоритет, 0х00 - высший приоритет
                    BFI        R1, R2, NVIC_IPR7_IP30_N, 8
                    STR        R2, [r0, NVIC_IPR7]

                @ включим прерывания по TIM4 в NVIC
                    MOV        R2, NVIC_ISER0_INT30   @ номер прерывания из RM0368 стр.203, колонка Position
                    STR        R2, [ R0, NVIC_ISER0 ]

                    BX         LR

.section .asmcode
@ обработчик прерывания Timer 4
.global IRQ_TIM4
IRQ_TIM4:
                 @ сбросим флаг прерывания
                    MOV        R1, 0
                    LDR        R0, = PERIPH_BB_BASE + ( TIM4_BASE + TIM2T5_SR ) * 32
                    STR        R1, [ R0, TIM2T5_SR_UIF_N * 4 ]

                 @ инверсия светодиода на GPIOC pin 13
                    LDR        R0, = GPIOC
                    LDR        R2, [ R0, GPIO_ODR ]

                    CMP        R2, 0
                    ITE        EQ
                    MOVEQ      R2, 1 << 13
                    MOVNE      R2, 0

                    STR        R2, [ R0, GPIO_ODR ]

                    BX         LR

