Комментарии 9
Давно уже отказался от К1986, вместо этого присмотрелся к Artery AT32, взял F437. И оказалось что не зря, достать легко, работает как надо, проблем никаких, примеров от производителя прилично. Только борд примерко 3-4к стоит, сам контроллер примерно за 800р найти можно.
(Да, это реклама, жду повышения социального рейтинга)
А нормальной читаемой библиотеки у микроконтроллера так и не появилось? Почему везде "магические константы"?
Я почти не пользуюсь SPL, "магические константы" нужны один раз при настройке. Для миландровских МК аналог куба сделали, генерирующий код инициализации периферии.
По миландровскому ПДП подробных материалов негусто, все моменты требующие внимания как раз расписаны подробно.
у меня на ассемблере код понятнее чем здесь приведенный на си
Тов VitGo явно статью внимательно не читали. Иначе, как спец по программированию, сразу бы указали на ошибку и несоответствие документации. Я этот кусок взял из статьи и отредактировал, остальное писал с нуля.
я не специалист по 1986, так что комментировать соответствие докам не могу...
но код ваш не читаем :-(
вот например инит дма на асме, и никаких магических чисел
@.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
Подскажите как приобрести К1986ВЕ92FI?
Запуск DMA на К1986ВЕ92FI пошагово