STM32F103 Режим канала таймера - PullRequest
0 голосов
/ 04 ноября 2018

Я не могу найти такую ​​информацию в руководстве, поэтому спрашиваю.

Я занимаюсь проектированием печатной платы и у меня проблемы с таймерами. Мне нужно настроить 8 независимых ШИМ и 6 счетчиков (входная частота варьируется от 50 Гц до 2 кГц), и у меня нет свободных выводов, поэтому переназначение не вариант. Можно ли смешивать режимы в пределах одного таймера, но на разных каналах?

Я имею в виду, можно ли настроить такую ​​конфигурацию:

  • TIM1_CH1 - PWM
  • TIM1_CH2 - PWM
  • TIM1_CH3 - CNT
  • TIM1_CH4 - CNT

  • TIM2_CH1 - CNT
  • TIM2_CH2 - CNT
  • TIM2_CH3 - вывод для этого канала, используемого для USART
  • TIM2_CH4 - вывод для этого канала, используемого для USART

  • TIM3_CH1 - PWM
  • TIM3_CH2 - PWM
  • TIM3_CH3 - PWM
  • TIM3_CH4 - PWM

  • TIM4_CH1 - PWM
  • TIM4_CH2 - ШИМ
  • TIM4_CH3 - CNT
  • TIM4_CH4 - CNT

1 Ответ

0 голосов
/ 04 ноября 2018

Можно ли смешивать режимы в пределах одного таймера, но на разных каналах?

Да, но они будут использовать счетчик и регистр перезагрузки. Это означает, что если ШИМ используют определенную частоту, то есть не просто считать до 65535 (что без прескалера даст ~ 1 кГц при 64 или 72 МГц), то регистры захвата получат временные метки только в этом диапазоне.

Каждый таймер имеет только один счетчик, который разделяется его четырьмя каналами. Он может рассчитывать некоторые события синхронизации (часы APB, которые обычно равны системным часам) или один вход внешнего триггера. Для генерации сигнала ШИМ счетчик должен предоставить частоту ШИМ. Для подсчета импульсов на других входных линиях необходимы каналы DMA или процедуры прерывания для подачи дополнительных счетчиков.

Подсчет с прерываниями по таймеру

Вы можете настроить 2 канала в режиме ШИМ и еще 2 в Режим захвата входа , как описано в соответствующих главах Справочное руководство . Разрешить прерывания на входных каналах захвата. В обработчике прерываний проверьте регистр состояния таймера, чтобы увидеть, какой канал вызвал прерывание, и выполните подсчет. Будьте внимательны при сбросе бита прерывания в регистре состояния, не сбрасывайте случайно биты события, которые вы не обработали. Это должно работать:

uint32_t t1c3, t1c4;
void TIM1_Handler(void) {
    if(TIM1->SR & TIM_SR_CC3IF) {
        t1c3++;
        TIM1->SR = ~TIM_SR_CC3IF;
    }
    if(TIM1->SR & TIM_SR_CC4IF) {
        t1c4++;
        TIM1->SR = ~TIM_SR_CC4IF;
    }
}

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

Подсчет с прерываниями EXTI

Любой вывод ввода-вывода может быть источником прерывания EXTI, с тем условием, что два вывода с одинаковым номером не могут быть одновременно отображены как источник прерывания EXTI, т. Е. PA0,PA1,PB2,PC3,PA4 Хорошо, но PA0,PB0 нет. Настройка прерываний EXTI может быть проще, чем каналы захвата таймера, недостатком является отсутствие временных меток и входных фильтров.

Подсчет с DMA

Подсчет 6 каналов с максимум 2 кГц, то есть сигналы находятся на расстоянии не менее 500 мкс, не должен быть проблемой для MCU, даже с прерываниями. Однако, если у MCI есть много других дел, и у вас есть много бесплатных каналов DMA, вы можете настроить каналы захвата для генерации запросов DMA вместо прерываний.

Обратите внимание, что TIM4_CH4 не связан ни с одним каналом DMA, поэтому вам необходимо немного переставить контакты или использовать этот канал в режиме прерывания.

Если вам не не нужны точные временные интервалы между событиями, тогда настройте каналы DMA как периферийное к памяти, 8-битный, кольцевой режим и отключите увеличение адреса как периферийного устройства, так и памяти. Адреса источника и назначения должны быть действительными и адресными в байтах, но значения не важны. Введите большое значение в CNDTR, например, 0x8000 (чтобы упростить обработку переполнения). Он будет считать события захвата таймера (вниз) при копировании одного и того же байта снова и снова. Вы можете проверить счетчик в контуре управления, когда это необходимо.

Это имеет то преимущество, что вообще не использует ядро ​​MCU, его можно перевести в режим ожидания для экономии энергии, периферийные блоки будут выполнять подсчет автономно. Недостатком является, конечно, то, что он использует 6 каналов DMA (из 7, например, на STM32F103C8).

Если вам нужны временные метки, вы можете разрешить DMA копировать их из регистров CCR в реальный буфер памяти с включенным увеличением памяти.

...