Впрочем, на одном только TIM17 тоже неплохо получается. У TIM17
есть, у счастью, Repetition counter и регистр RCR, а в регистре CR1
есть бит OPM. Работает это всё так: таймер повторяет свой цикл работы столько раз, сколько записано в RCR, после чего если OPM==0, то начинает всё сначала, а при OPM==1 останавливается.
Но так можно сгенерировать не более 255 импульсов, а требуется 11кГц*31мс = 341. Многовато.
Поэтому придётся действовать чуть сложнее.
//настройка режима PWM, периода и длительности импульсов
TIM17->RCR =100; //сколько-нибудь импульсов, например 100:))
TIM17->DIER |= TIM_DIER_UIE; //Update interrupt enable
TIM17->CR1 |= TIM_CR1_CEN; //пуск таймера. бит OPM сейчас == 0
TIM17->RCR =num_pulses-100; //оставшиеся импульсы
В обработчике прерывания по update event
TIM17->SR = ~TIM_SR_UIF; //очищаем Update interrupt flag
TIM17->DIER |= ~TIM_DIER_UIE; //Update interrupt disable
TIM17->DIER |= TIM_CR1_OPM; //One pulse mode
После сотни импульсов у таймера произойдёт update event, из RCR будет загружено в repetition counter число оставшихся импульсов и выставлен запрос прерывания по флагу UIF.
В обработчике прерывания мы запрещаем прерывания и устанавливаем бит OPM.
Теперь, когда repetition counter дойдет до 0, таймер остановится.