@.CHARSET CP1251

@ GNU AS
.syntax unified
.cpu cortex-m4
.thumb
.fpu fpv4-sp-d16

.INCLUDE  "/src/inc/rcc.inc"
.INCLUDE  "/src/inc/tim1.inc"

@.desc name=TIM1_CH3_4_PWM_INIT type=proc
@ +--------------------------------------------------------+
@ |                                                        |
@ |             Настройка Timer 1 в режим PWM              |
@ |                                                        |
@ +--------------------------------------------------------+
@.enddesc

.SECTION .asmcode

.global TIM1_CH3_4_PWM_INIT
TIM1_CH3_4_PWM_INIT:
                         MOV         R1, 1

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

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

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

                         mov         R0, 500                 @ максимальное значение счетчика
                         STR         R0, [ R2, TIM1A8_ARR ]

                         LDR         R0, = TIM1A8_CR1_CEN + TIM1A8_CR1_APRE    @ включить таймер
                         STR         R0, [ R2, TIM1A8_CR1 ]

                     @ настройка блоков сравнения
                         LDR         R0, = TIM1A8_CCMR2_OC3M_PWM1 + TIM1A8_CCMR2_OC4M_PWM1   @ режим pwm 1 для OC3M (CH3), OC4M (CH4)
                         STR         R0, [ R2, TIM1A8_CCMR2 ]

                         LDR        R0, = TIM1A8_BDTR_MOE         @ главный выключатель выходов сравнения
                         STR        R0, [ R2, TIM1A8_BDTR ]       @ в других таймерах его нет и выходы управляются только через TIMx_CCER

                         mov         R0, 1                        @ значение сравнения
                         STR         R0, [ R2, TIM1A8_CCR3 ]
                         STR         R0, [ R2, TIM1A8_CCR4 ]

                         LDR         R0, = TIM1A8_CCER_CC3E + TIM1A8_CCER_CC4E         @ включим выходы  CH3, CH4
                         STR         R0, [ R2, TIM1A8_CCER ]

                         BX         LR


@.desc name=POWERLED_ON type=proc
@ +-----------------------------------------------------------+
@ |       Включим генерацию ШИМ для TIM1 CH3 (GreenLed)       |
@ +-----------------------------------------------------------+
@.enddesc

.global POWERLED_ON
POWERLED_ON:
                         PUSH       { R0, R1, R2 }

                         LDR        R2, = TIM1
                         LDR        R0, [ R2, TIM1A8_CCMR2 ]
                         mov        R1, 6                          @ TIM1A8_CCMR2_OCxM_PWM1: режим pwm 1 для OCxM
                         BFI        R0, R1, TIM1A8_CCMR2_OC3M_N, 3 @ вставим поле
                         STR        R0, [ R2, TIM1A8_CCMR2 ]

                         POP        { R0, R1, R2 }

                         BX         LR


@.desc name=POWERLED_OFF type=proc
@ +-----------------------------------------------------------+
@ |      Выключим генерацию ШИМ для TIM1 CH3 (GreenLed)       |
@ +-----------------------------------------------------------+
@.enddesc

.global POWERLED_OFF
POWERLED_OFF:
                         PUSH       { R0, R1, R2 }

                         LDR        R2, = TIM1
                         LDR        R0, [ R2, TIM1A8_CCMR2 ]
                         mov        R1, 4                          @ TIM1A8_CCMR2_OCxM_FIL: режим inactive level
                         BFI        R0, R1, TIM1A8_CCMR2_OC3M_N, 3 @ вставим поле
                         STR        R0, [ R2, TIM1A8_CCMR2 ]

                         POP        { R0, R1, R2 }

                         BX         LR


@.desc name=POWERLED_LEV type=proc
@ +--------------------------------------------------------------+
@ |   установка значения заполнения ШИМ для TIM1 CH3 (GreenLed)  |
@ +--------------------------------------------------------------+
@ | вход: R0 - значение заполнения (от 0 до 500)                 |
@ +--------------------------------------------------------------+
@.enddesc

.global POWERLED_LEV
POWERLED_LEV:
                    PUSH       { R2 }

                    LDR        R2, = TIM1
                    STR        R0, [ R2, TIM1A8_CCR3 ]

                    POP        { R2 }

                    BX         LR


@.desc name=CHARGELED_ON type=proc
@ +-----------------------------------------------------------+
@ |       Включим генерацию ШИМ для TIM1 CH3 (RedLed)         |
@ +-----------------------------------------------------------+
@.enddesc

.global CHARGELED_ON
CHARGELED_ON:
                         PUSH       { R0, R1, R2 }

                         LDR        R2, = TIM1
                         LDR        R0, [ R2, TIM1A8_CCMR2 ]
                         mov        R1, 6                          @ TIM1A8_CCMR2_OCxM_PWM1: режим pwm 1 для OCxM
                         BFI        R0, R1, TIM1A8_CCMR2_OC4M_N, 3 @ вставим поле
                         STR        R0, [ R2, TIM1A8_CCMR2 ]

                         POP        { R0, R1, R2 }

                         BX         LR


@.desc name=CHARGELED_OFF type=proc
@ +-----------------------------------------------------------+
@ |       Выключим генерацию ШИМ для TIM1 CH3 (RedLed)         |
@ +-----------------------------------------------------------+
@.enddesc

.global CHARGELED_OFF
CHARGELED_OFF:
                         PUSH       { R0, R1, R2 }

                         LDR        R2, = TIM1
                         LDR        R0, [ R2, TIM1A8_CCMR2 ]
                         mov        R1, 4                          @ TIM1A8_CCMR2_OCxM_FIL: режим inactive level
                         BFI        R0, R1, TIM1A8_CCMR2_OC4M_N, 3 @ вставим поле
                         STR        R0, [ R2, TIM1A8_CCMR2 ]

                         POP        { R0, R1, R2 }

                         BX         LR

@.desc name=CHARGELED_LEV type=proc
@ +--------------------------------------------------------------+
@ |   установка значения заполнения ШИМ для TIM1 CH4 (RedLed)    |
@ +--------------------------------------------------------------+
@ | вход: R0 - значение заполнения (от 0 до 500)                 |
@ +--------------------------------------------------------------+
@.enddesc

.global CHARGELED_LEV
CHARGELED_LEV:
                    PUSH       { R2 }

                    LDR        R2, = TIM1
                    STR        R0, [ R2, TIM1A8_CCR4 ]

                    POP        { R2 }

                    BX         LR




