@.CHARSET =CP1251
@GNU AS

@ +----------------------------------------------+
@ |       Пример генерации PWM на STM32F401      |
@ |                                              |
@ | Подключения:                                 |
@ | PA6 - светодиод, прямое включение (на gnd)   |
@ |                                              |
@ +----------------------------------------------+

.SYNTAX    unified                  @ синтаксис исходного кода
.THUMB                              @ тип используемых инструкций Thumb
.CPU       cortex-m4                @ процессор

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

.SECTION   .asmcode

@ основная программа
.GLOBAL    Start
Start:
                    @ настройка  тактирования
                         BL          SYSCLK84_START         @ запуск тактирования на 84 мгц
                         BL          SYSTICK_START          @ настройка SysTick 1000 гц

.INCLUDE   "/src/periph/rcc/rcc_ahb1enr_gpio_set.inc"       @ включение GPIO
.INCLUDE   "/src/periph/gpio/gpio_a_conf.inc"               @ настройка пинов GPIOA

                         MOV         R1, 1

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

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

                         LDR         R0, =  840-1                             @ предделитель счетчика частота счета 84Mhz / 840 = 100 Кгц
                         STR         R0, [ R2, TIM2T5_PSC ]

                         LDR         R0, = 100                                 @ максимальное значение счетчика
                         STR         R0, [ R2, TIM2T5_ARR ]

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

                     @ настройка блока сравнения
                         LDR         R0, = TIM2T5_CCMR1_OC1M_PWM1              @ режим pwm 1
                         STR         R0, [ R2, TIM2T5_CCMR1 ]

                         LDR         R0, = 50                                 @ значение сравнения
                         STR         R0, [ R2, TIM2T5_CCR1 ]

                         LDR         R0, = TIM2T5_CCER_CC1E                    @ включим выход  CH1
                         STR         R0, [ R2, TIM2T5_CCER ]

                     @ плавное увеличение и уменьшение значения сравнения
                         MOV         R3, 1                   @ значение сравнения
                         MOV         R4, 1                   @ 1 - для увеличения значения, 0хFFFFFFFF - для уменьшения значения

MAIN_LOOP:
                         ADD         R3, R3, R4
                         AND         R3, R3, 0xFF

                         CMP         R3, 1                     @ переключить на нарастание яркости (увеличение значения сравнения)
                         IT          EQ
                         MOVEQ       R4, 1

                         CMP         R3, 99                    @ переключить на убывание яркости (уменьшение значения сравнения)
                         IT          EQ
                         LDREQ       R4, =0xFFFFFFFF

                         STR         R3, [ R2, TIM2T5_CCR1 ]   @ сохраняем значение сравнения в регистре Timer 3

                         MOV         R0, 10
                         BL          SYSTICK_DELAY         @ пауза 10 мс (0.01 сек)

                         B           MAIN_LOOP


