Last active
April 19, 2020 03:18
-
-
Save futurelink/4ae383010971d5234a63f3dfe448937f to your computer and use it in GitHub Desktop.
Конфигурация таймера 1 с DMA и кольцевым буфером для STM32F051C8 c выходом на PA8 в режиме ШИМ.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #define TIMER_PRESCALER 72 | |
| #define BUFFER_LENGTH 18 | |
| volatile uint16_t axis1Buffer[BUFFER_LENGTH] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | |
| /** | |
| * Конфигурация таймера 1 с DMA и кольцевым буфером для | |
| * STM32F051C8 c выходом на PA8 в режиме ШИМ. В буфере тройки | |
| * значений ARR (частота), RPT (кол-во импульсов), CCR1 (скважность). | |
| */ | |
| void TIM1_Config() { | |
| /* Настройка таймера 1 */ | |
| TIM1->PSC = TIMER_PRESCALER; // Константа | |
| TIM1->CR1 &= ~TIM_CR1_CKD; // Отключаем деление частоты | |
| TIM1->CR1 |= TIM_CLOCKDIVISION_DIV1; // Выставляем деление частоты на 1 | |
| TIM1->CR1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); // Сбрасываем направление счета | |
| TIM1->CR1 |= TIM_COUNTERMODE_UP; // Выставляем направление счета вверз | |
| TIM1->CCMR1 &= ~(TIM_CCMR1_OC1M | TIM_CCMR1_CC1S); // Сбрасывваем режим работы канала 1 | |
| TIM1->CCMR1 |= (TIM_OCMODE_PWM2 | TIM_CCMR1_OC1PE); // Включить загрузку и ШИМ | |
| TIM1->CR1 |= TIM_CR1_ARPE; // Включить авто перезагрузку | |
| TIM1->DIER |= TIM_DIER_UDE; // Включить запросы к DMA по обновлению | |
| TIM1->DCR = | |
| TIM_DMABASE_ARR | // Начинаем с регистра ARR | |
| TIM_DMABURSTLENGTH_3TRANSFERS; // Передаем 3 слова | |
| TIM1->EGR |= TIM_EGR_UG; | |
| while((TIM1->EGR & TIM_EGR_UG) == SET) {} | |
| TIM1->EGR |= TIM_EGR_UG; | |
| TIM1->BDTR |= TIM_BDTR_MOE; // Разрещаем выходы таймера | |
| TIM1->CCER |= TIM_CCER_CC1E; // Разрешаем выход канала 1 | |
| TIM1->CR1 |= TIM_CR1_CEN; // Разрешаем работу таймера | |
| /* Настройка DMA канала 5 для таймера 1 */ | |
| DMA1_Channel5->CCR = 0; | |
| DMA1_Channel5->CCR |= | |
| DMA_MEMORY_TO_PERIPH | // Память в периферию | |
| DMA_PINC_DISABLE | // Не инкрементировать указатель переферии | |
| DMA_MINC_ENABLE | // Инкрементировать указатель памяти | |
| DMA_PDATAALIGN_HALFWORD | // Данные в переферии 16 бит (пол слова) | |
| DMA_MDATAALIGN_HALFWORD | // Данные в памяти 16 бит (пол слова) | |
| DMA_CIRCULAR | // Режим кольцевого буфера | |
| DMA_PRIORITY_HIGH; // Высокий приоритет DMA | |
| DMA1_Channel5->CNDTR = BUFFER_LENGTH; // Количество данных в буфере | |
| DMA1_Channel5->CPAR = (uint32_t)(&(TIM1->DMAR)); // Адрес регистра DMAR таймера | |
| DMA1_Channel5->CMAR = (uint32_t)(&axis1Buffer[0]); // Адрес буфера DMA | |
| DMA1_Channel5->CCR |= (uint32_t)DMA_CCR_EN; // Запускаем DMA | |
| } | |
| extern "C" void DMA1_Channel4_5_IRQHandler(void) { | |
| // Обрбаотка буфера канала 5 завершена (ось 1) | |
| if ((DMA1->ISR & DMA_ISR_HTIF5) || | |
| (DMA1->ISR & DMA_ISR_TCIF5)) | |
| { | |
| if (DMA1->ISR & DMA_ISR_TCIF5) { | |
| // Передали 2 половину буфера | |
| DMA1->IFCR |= DMA_IFCR_CTCIF5; // Сбрасываем флаг окончания передачи | |
| } else { | |
| // Передали 1 половину буфера | |
| DMA1->IFCR |= DMA_IFCR_CHTIF5; // Сбрасываем флаг половины передачи | |
| } | |
| } | |
| // Обработка буфера канала 4 завершена | |
| if ((DMA1->ISR & DMA_ISR_HTIF4) || | |
| (DMA1->ISR & DMA_ISR_TCIF4)) | |
| { | |
| if (DMA1->ISR & DMA_ISR_TCIF4) { | |
| DMA1->IFCR |= DMA_IFCR_CTCIF4; // Сбрасываем флаг окончания передачи | |
| } else { | |
| DMA1->IFCR |= DMA_IFCR_CHTIF4; // Сбрасываем флаг окончания передачи | |
| } | |
| } | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment