Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

STM32L476RG настройка Output Compare + DMA

Непрочитано 04.09.2020, 19:09  
gruffi
Прописка
 
Аватар для gruffi
 
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
gruffi на пути к лучшему
По умолчанию STM32L476RG настройка Output Compare + DMA

Добрый день.
Настроил генерирование импульсов в режиме сравнения, но никак не получается прикрутить DMA. Уже перепробовал все, но прерывание не генерируется...Подскажите в чем может быть затык. Вот настройка:
Код:
RCC-›AHB2ENR |= RCC_AHB2ENR_GPIOAEN;

    GPIOA-›MODER = (GPIOA-›MODER & ~(GPIO_MODER_MODE6)) | GPIO_MODER_MODE6_1;
    GPIOA-›OTYPER &= ~GPIO_OTYPER_OT6;
    GPIOA-›OSPEEDR |= GPIO_OSPEEDR_OSPEED6;
    GPIOA-›PUPDR &= ~GPIO_PUPDR_PUPD6;
    GPIOA-›AFR[0] = (GPIOA-›AFR[0] & ~(GPIO_AFRL_AFSEL6)) | (GPIO_AFRL_AFSEL6_3 | GPIO_AFRL_AFSEL6_2 | GPIO_AFRL_AFSEL6_1);

    RCC-›APB2ENR |= RCC_APB2ENR_TIM16EN;
    RCC-›AHB1ENR |= RCC_AHB1ENR_DMA1EN;

    uint16_t data[] = { 2400, 600, 600, 600, 1200, 600 };

    DMA1_Channel3-›CPAR = (uint32_t)&TIM16-›CCR1;
    DMA1_Channel3-›CMAR = (uint32_t)&data[0];
    DMA1_Channel3-›CNDTR = 6;
    DMA1_Channel3-›CCR &= ~(DMA_CCR_MSIZE | DMA_CCR_PSIZE | DMA_CCR_PINC | DMA_CCR_CIRC);
    DMA1_Channel3-›CCR |= DMA_CCR_PL | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0 | DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE;
    DMA1_Channel3-›CCR |= DMA_CCR_EN;

    TIM16-›PSC = 35;
    TIM16-›ARR = 60000;
    TIM16-›CCR1 = 100;
    TIM16-›CCMR1 = (TIM16-›CCMR1 & ~(TIM_CCMR1_OC1M | TIM_CCMR1_OC1PE | TIM_CCMR1_CC1S)) | (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0);
    TIM16-›CCER = (TIM16-›CCER & ~TIM_CCER_CC1P) | TIM_CCER_CC1E;
    TIM16-›BDTR |= TIM_BDTR_MOE;
    TIM16-›DIER |= TIM_DIER_CC1DE;

    TIM16-›CR1 |= TIM_CR1_CEN;

    NVIC_SetPriority(DMA1_Channel3_IRQn, 0);
    NVIC_EnableIRQ(DMA1_Channel3_IRQn);

    __enable_irq();
Спасибо.
Реклама:

Последний раз редактировалось gruffi; 05.09.2020 в 19:22.
gruffi вне форума  
Непрочитано 04.09.2020, 19:54  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: STM32L476RG настройка Output Compare + DMA

Читаем в референс-мануале раздел DMA request mapping и конфигурируем регистр DMA_CSELR на TIM16
NewWriter вне форума  
Сказали "Спасибо" NewWriter
gruffi (04.09.2020)
Непрочитано 04.09.2020, 20:05  
gruffi
Прописка
 
Аватар для gruffi
 
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
gruffi на пути к лучшему
По умолчанию Re: STM32L476RG настройка Output Compare + DMA

Спасибо большое, попробую.
gruffi вне форума  
Непрочитано 04.09.2020, 20:34  
gruffi
Прописка
 
Аватар для gruffi
 
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
gruffi на пути к лучшему
По умолчанию Re: STM32L476RG настройка Output Compare + DMA

Добавил:
Код:
DMA1_CSELR-›CSELR |= 0x02 ‹‹ DMA_CSELR_C3S_Pos;
Но это не помогло, 3й канал = 0100. Или я не так понял?
gruffi вне форума  
Непрочитано 04.09.2020, 20:45  
gruffi
Прописка
 
Аватар для gruffi
 
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
gruffi на пути к лучшему
По умолчанию Re: STM32L476RG настройка Output Compare + DMA

Ошибся однако
Надо 4, а не 2...
Код:
DMA1_CSELR-›CSELR = (DMA1_CSELR-›CSELR & ~DMA_CSELR_C3S) | (0x04 ‹‹ DMA_CSELR_C3S_Pos);
Большое спасибо, NewWriter!
gruffi вне форума  
Непрочитано 05.09.2020, 19:37  
gruffi
Прописка
 
Аватар для gruffi
 
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
gruffi на пути к лучшему
По умолчанию Re: STM32L476RG настройка Output Compare + DMA

Чтобы не плодить лишних тем, задам вопрос здесь. Настроил генерирование пачек импульсов, что-то типа ИК-пульта на таймерах TIM16, TIM17 и вывод PB9 (IR_OUT), но никак не пойму почему при указании размера пересылаемых данных не отправляется последняя пачка.

Почему приходится указывать размер передаваемых данных +1?

Вот настройки:
Код:
RCC-›AHB2ENR |= RCC_AHB2ENR_GPIOBEN;

GPIOB-›MODER = (GPIOB-›MODER & ~(GPIO_MODER_MODE9)) | GPIO_MODER_MODE9_1;
GPIOB-›OTYPER &= ~GPIO_OTYPER_OT9;
GPIOB-›OSPEEDR |= GPIO_OSPEEDR_OSPEED9;
GPIOB-›PUPDR &= ~GPIO_PUPDR_PUPD9;
GPIOB-›AFR[1] = (GPIOB-›AFR[1] & ~(GPIO_AFRH_AFSEL9)) | GPIO_AFRH_AFSEL9_0;
SYSCFG-›CFGR1 |= SYSCFG_CFGR1_I2C_PB9_FMP;

RCC-›APB2ENR |= RCC_APB2ENR_TIM16EN | RCC_APB2ENR_TIM17EN;
RCC-›AHB1ENR |= RCC_AHB1ENR_DMA1EN;

uint16_t data[] = { 2400, 3000, 3600, 4200, 5400, 6000, 7200 };

DMA1_Channel3-›CPAR = (uint32_t)&TIM16-›CCR1;
DMA1_Channel3-›CMAR = (uint32_t)&data[0];
DMA1_Channel3-›CCR &= ~(DMA_CCR_MSIZE | DMA_CCR_PSIZE | DMA_CCR_PINC | DMA_CCR_CIRC);
DMA1_Channel3-›CCR |= DMA_CCR_PL | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0 | DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE;
DMA1_CSELR-›CSELR = (DMA1_CSELR-›CSELR & ~DMA_CSELR_C3S) | (0x04 ‹‹ DMA_CSELR_C3S_Pos);

TIM16-›PSC = 35;
TIM16-›ARR = 60000;
TIM16-›CCR1 = 500;
TIM16-›CCMR1 = (TIM16-›CCMR1 & ~(TIM_CCMR1_OC1M | TIM_CCMR1_OC1PE | TIM_CCMR1_CC1S)) | (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0);
TIM16-›CCER |= TIM_CCER_CC1P | TIM_CCER_CC1E;
TIM16-›BDTR |= TIM_BDTR_MOE;
TIM16-›DIER |= TIM_DIER_CC1DE;

TIM17-›PSC = 9;
TIM17-›ARR = 99;
TIM17-›CCR1 = 50;
TIM17-›CCMR1 = (TIM17-›CCMR1 & ~(TIM_CCMR1_OC1M | TIM_CCMR1_OC1PE | TIM_CCMR1_CC1S)) | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
TIM17-›CCER |= TIM_CCER_CC1P | TIM_CCER_CC1E;
TIM17-›BDTR |= TIM_BDTR_MOE;

TIM16-›EGR |= TIM_EGR_UG | TIM_EGR_CC1G;
TIM17-›EGR |= TIM_EGR_UG | TIM_EGR_CC1G;

TIM16-›SR &= ~(TIM_SR_UIF | TIM_EGR_CC1G);
TIM17-›SR &= ~(TIM_SR_UIF | TIM_EGR_CC1G);

DMA1_Channel3-›CNDTR = 7;
DMA1_Channel3-›CCR |= DMA_CCR_EN;
TIM16-›CR1 |= TIM_CR1_CEN;
TIM17-›CR1 |= TIM_CR1_CEN;

NVIC_SetPriority(DMA1_Channel3_IRQn, 0);
NVIC_EnableIRQ(DMA1_Channel3_IRQn);

__enable_irq();
Несущая 36кГц.
На первом скрине, когда указан размер 7, а на втором, когда 8, т.е. на 1 больше, чем размер массива...
Миниатюры:
Нажмите на изображение для увеличения
Название: ir1.png
Просмотров: 0
Размер:	13.7 Кб
ID:	156101   Нажмите на изображение для увеличения
Название: ir2.png
Просмотров: 0
Размер:	13.2 Кб
ID:	156102  
gruffi вне форума  
Непрочитано 05.09.2020, 20:43  
dgrishin
Почётный гражданин KAZUS.RUN
 
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,164
Сказал спасибо: 46
Сказали Спасибо 316 раз(а) в 245 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: STM32L476RG настройка Output Compare + DMA

Сообщение от gruffi Посмотреть сообщение
Почему приходится указывать размер передаваемых данных +1?
Предположу что из за того, что вы проинициализировали заранее

TIM16-›CCR1 = 500;

Когда таймер совпадает с CCR1 первый раз (при CCR1 проинициализированным вручную) то CNDTR тоже уменьшается и в итоге массиве остаётся последний байт. Могу ошибатся - надо уточнить в доках логику работы счетчика DMA
dgrishin вне форума  
Непрочитано 05.09.2020, 20:52  
gruffi
Прописка
 
Аватар для gruffi
 
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
gruffi на пути к лучшему
По умолчанию Re: STM32L476RG настройка Output Compare + DMA

Спасибо, проверю.
И ещё один вопрос:
Если задать чётное количество данных, то последняя пауза и она сливается, можно как-то ее отделить импульсом.
gruffi вне форума  
Непрочитано 05.09.2020, 21:23  
gruffi
Прописка
 
Аватар для gruffi
 
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
gruffi на пути к лучшему
По умолчанию Re: STM32L476RG настройка Output Compare + DMA

Если убрать начальную инициализацию регистра CCR1, то ничего не меняется, т.е. все равно надо задавать размер +1...
На скине указал визуально, о том что писал выше, т.е. если задать четное количество данных, то получается, что последний импульс приходится на паузу (отмечено красным цветом). Можно ли настроить так, чтобы в конце был кратковременный импульс, чтобы обозначить эту паузу (показал зеленым цветом)?
Спасибо.
Миниатюры:
Нажмите на изображение для увеличения
Название: ir3.png
Просмотров: 0
Размер:	6.9 Кб
ID:	156104  
gruffi вне форума  
Непрочитано 05.09.2020, 21:39  
dgrishin
Почётный гражданин KAZUS.RUN
 
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,164
Сказал спасибо: 46
Сказали Спасибо 316 раз(а) в 245 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: STM32L476RG настройка Output Compare + DMA

Я чего то не понимаю. У вас настронн PWM mode 1
(TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0)

а что за заполнение меандром ?? Или это вы это сделали вне микроконтроллера ??

Аааа. Master - slave.

Последний раз редактировалось dgrishin; 05.09.2020 в 21:44.
dgrishin вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32 - Tips 'N Tricks nahimovv ARM 28 14.10.2024 06:42
Как отправить массив по I2C через DMA на STM32F105 или F030? Donker ARM 15 17.03.2019 18:34
Tim19 -> DMA -> значение ADC в memory kvark85 ARM 6 03.06.2014 15:00
На чём написано ??? Koka Proteus, KiCAD и другие ECAD 18 08.10.2006 15:50


Часовой пояс GMT +4, время: 19:19.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.