@.CHARSET CP1251

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

.INCLUDE   "/src/inc/rcc.inc"
.INCLUDE   "/src/inc/dma.inc"
.INCLUDE   "/src/inc/tim2-5.inc"

.section .asmcode

@.desc name=DMA_INIT type=proc
@ +---------------------------------------------------------------------+
@ |    Запуск автоматического копирования данных буфера в TIM3_CCR1     |
@ |      при помощи DMA 1 (поток 6 канал 2) по запросу  (TIM4_UP)       |
@ +---------------------------------------------------------------------+
@.enddesc

.global DMA_INIT
DMA_INIT:
              @ тактирование DMA1
                    LDR        R0, =PERIPH_BB_BASE + ( RCC_BASE + RCC_AHB1ENR ) * 32 + RCC_AHB1ENR_DMA1EN_N * 4
                    STR        R1, [ R0 ]

                    LDR        R0, = DMA1

@ настройки DMA
                    @  размер периферии       размер памяти    инкремент памяти
.EQU  size          , DMA_SxCR_PSIZE_16B + DMA_SxCR_MSIZE_16B + DMA_SxCR_MINC

                    @         канал 2          циклически   из памяти в периферию    высший приоритет
.EQU  mode          , 2 << DMA_SxCR_CHSEL_N + DMA_SxCR_CIRC + DMA_SxCR_DIR_MTP     + DMA_SxCR_PL_VHIGH

                    LDR        R1, = mode + size
                    STR        R1, [ R0, DMA_S6CR ]   @ установим настройки

               @ старт DMA1 Stream 6
               @ сброс флагов, если есть установленные то без этого dma работать не будет
               @ но при первом запуске все флаги итак сброшены, поэтому и не сбрасываем
@                    MOV        R1, DMA_HIFCR_CFEIF6 + DMA_HIFCR_CDMEIF6 + DMA_HIFCR_CTEIF6 + DMA_HIFCR_CHTIF6 + DMA_HIFCR_СTCIF6
@                    STR        R1, [ R0, DMA_LIFCR ]

                    MOV        R1, 31                      @ количество передач = 31
                    STR        R1, [ R0, DMA_S6NDTR ]

                    LDR        R1, = VALUES                @ адрес массива данных
                    STR        R1, [ R0, DMA_S6M0AR ]

                    LDR        R1, = TIM3 + TIM2T5_CCR1    @ адрес регистра сравнения TIM3_CCR1
                    STR        R1, [ R0, DMA_S6PAR ]

                @ включим DMA1 при помощи bitbanding
                    LDR        R0, = PERIPH_BB_BASE + ( DMA1_BASE + DMA_S6CR ) * 32
                    MOV        R1, 1
                    STR        R1, [ R0, DMA_SxCR_EN_N * 4 ]

                    BX         LR

@ массив яркости светодиода
.align 4
VALUES:             .SHORT      10, 30, 50, 90, 70, 60, 40
                    .SHORT      25
                    .SHORT      10, 30, 50, 90, 70, 60, 55
                    .SHORT      50, 45, 40, 35, 30, 20, 15
                    .SHORT      10, 5, 1, 1, 1, 1, 1, 1, 1


