STM32L476RG настройка Output Compare + DMA
04.09.2020, 19:09
|
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
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.
|
|
|
|
04.09.2020, 19:54
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
|
Re: STM32L476RG настройка Output Compare + DMA
Читаем в референс-мануале раздел DMA request mapping и конфигурируем регистр DMA_CSELR на TIM16
|
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
04.09.2020, 20:05
|
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: STM32L476RG настройка Output Compare + DMA
Спасибо большое, попробую.
|
|
|
|
04.09.2020, 20:34
|
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: STM32L476RG настройка Output Compare + DMA
Добавил:
|
Код:
|
DMA1_CSELR-›CSELR |= 0x02 ‹‹ DMA_CSELR_C3S_Pos; |
Но это не помогло, 3й канал = 0100. Или я не так понял?
|
|
|
|
04.09.2020, 20:45
|
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: STM32L476RG настройка Output Compare + DMA
Ошибся однако 
Надо 4, а не 2...
|
Код:
|
DMA1_CSELR-›CSELR = (DMA1_CSELR-›CSELR & ~DMA_CSELR_C3S) | (0x04 ‹‹ DMA_CSELR_C3S_Pos); |
Большое спасибо, NewWriter!
|
|
|
|
05.09.2020, 19:37
|
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
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 больше, чем размер массива...
|
|
|
|
05.09.2020, 20:43
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,164
Сказал спасибо: 46
Сказали Спасибо 316 раз(а) в 245 сообщении(ях)
|
Re: STM32L476RG настройка Output Compare + DMA
Сообщение от gruffi
|
|
Почему приходится указывать размер передаваемых данных +1?
|
Предположу что из за того, что вы проинициализировали заранее
TIM16-›CCR1 = 500;
Когда таймер совпадает с CCR1 первый раз (при CCR1 проинициализированным вручную) то CNDTR тоже уменьшается и в итоге массиве остаётся последний байт. Могу ошибатся - надо уточнить в доках логику работы счетчика DMA
|
|
|
|
05.09.2020, 20:52
|
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: STM32L476RG настройка Output Compare + DMA
Спасибо, проверю.
И ещё один вопрос:
Если задать чётное количество данных, то последняя пауза и она сливается, можно как-то ее отделить импульсом.
|
|
|
|
05.09.2020, 21:23
|
|
|
Прописка
Регистрация: 01.02.2012
Сообщений: 131
Сказал спасибо: 9
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: STM32L476RG настройка Output Compare + DMA
Если убрать начальную инициализацию регистра CCR1, то ничего не меняется, т.е. все равно надо задавать размер +1...
На скине указал визуально, о том что писал выше, т.е. если задать четное количество данных, то получается, что последний импульс приходится на паузу (отмечено красным цветом). Можно ли настроить так, чтобы в конце был кратковременный импульс, чтобы обозначить эту паузу (показал зеленым цветом)?
Спасибо.
|
|
|
|
05.09.2020, 21:39
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 12.02.2013
Адрес: На болотах
Сообщений: 1,164
Сказал спасибо: 46
Сказали Спасибо 316 раз(а) в 245 сообщении(ях)
|
Re: STM32L476RG настройка Output Compare + DMA
Я чего то не понимаю. У вас настронн PWM mode 1
(TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0)
а что за заполнение меандром ?? Или это вы это сделали вне микроконтроллера ??
Аааа. Master - slave.
Последний раз редактировалось dgrishin; 05.09.2020 в 21:44.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:19.
|
|