Skip to content

Instantly share code, notes, and snippets.

@futurelink
Last active April 19, 2020 03:18
Show Gist options
  • Select an option

  • Save futurelink/4ae383010971d5234a63f3dfe448937f to your computer and use it in GitHub Desktop.

Select an option

Save futurelink/4ae383010971d5234a63f3dfe448937f to your computer and use it in GitHub Desktop.
Конфигурация таймера 1 с DMA и кольцевым буфером для STM32F051C8 c выходом на PA8 в режиме ШИМ.
#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