Цитата(Quantum1 @ Aug 13 2014, 09:00)

Раз уж вы так хотите пины*)) без проблем... берем TIM1 - он будет ведущим, каждые 500мкс при CNT=CCR1, он инициирует один запуск TIM3_CH1(длительность импульса 40мкс, выводится на PA6) и TIM3_CH2(длительность импульса 5мкс, выводится на PA7).
Т.е. процесс должен быть периодическим, или нужен ручной запуск однократной последовательности?
Это для периодической генерации
CODE
TIM1->CR1 = 0;
TIM1->CR2 = (4 << TIM_CR2_MMS); // OC1REF -> TRGO
TIM1->PSC = 72 - 1;
TIM1->ARR = 500 - 1;
TIM1->EGR = (1 << TIM_EGR_UG);
TIM1->CCMR1 = (OC_MODE_PWM2 << TIM_CCMR1_OC1M);
TIM1->CCER = (1 << TIM_CCER_CC1E);
TIM1->BDTR = (1 << TIM_BDTR_MOE);
TIM1->CCR1 = 100;
TIM3->CR1 = 0;
TIM3->PSC = 72 - 1;
TIM3->ARR = 0xffff;
TIM3->EGR = (1 << TIM_EGR_UG);
TIM3->CCMR1 = (OC_MODE_PWM1 << TIM_CCMR1_OC1M) | (OC_MODE_PWM1 << TIM_CCMR1_OC2M);
TIM3->CCER = (1 << TIM_CCER_CC1E) | (1 << TIM_CCER_CC2E);
TIM3->SMCR =
(0 << TIM_SMCR_TS) // TRGI -> ITR0 (TIM1)
| (4 << TIM_SMCR_SMS); // Reset Mode
TIM3->CCR1 = 40;
TIM3->CCR2 = 5;
TIM3->CR1 = (1 << TIM_CR1_CEN);
TIM1->CR1 = (1 << TIM_CR1_CEN);
Для однократного запуска
CODE
// pulse
TIM1->CR1 = 0;
TIM1->CR2 = (4 << TIM_CR2_MMS); // OC1REF -> TRGO
TIM1->PSC = 72 - 1;
TIM1->ARR = 500 - 1;
TIM1->EGR = (1 << TIM_EGR_UG);
TIM1->CCMR1 = (OC_MODE_PWM2 << TIM_CCMR1_OC1M);
TIM1->CCER = (1 << TIM_CCER_CC1E);
TIM1->BDTR = (1 << TIM_BDTR_MOE);
TIM1->CCR1 = 100 - 1; // на один такт меньше
TIM3->CR1 = 0;
TIM3->PSC = 72 - 1;
TIM3->ARR = 0xffff;
TIM3->EGR = (1 << TIM_EGR_UG);
TIM3->CCMR1 = (OC_MODE_PWM1 << TIM_CCMR1_OC1M) | (OC_MODE_PWM1 << TIM_CCMR1_OC2M);
TIM3->CCER = (1 << TIM_CCER_CC1E) | (1 << TIM_CCER_CC2E);
TIM3->SMCR =
(0 << TIM_SMCR_TS) // TRGI -> ITR0 (TIM1)
| (5 << TIM_SMCR_SMS); // Gated Mode
TIM3->CCR1 = 40;
TIM3->CCR2 = 5;
TIM3->CR1 = (1 << TIM_CR1_CEN);
while(1)
{
if(pulse)
{
TIM3->CNT = 0xffff; // -1 для генерации события UR
TIM1->CR1 = (1 << TIM_CR1_CEN) | (1 << TIM_CR1_OPM);
pulse = 0;
}
}
Проверено в железе (STM32F103T8U6 @ 72MHz) - работает.
Цитата(Golikov A. @ Aug 13 2014, 10:30)

почему всегда все так сложно?
я скачал реф мануал от 32f103c6, и в нем поглядел раздел таймеры. И там очень быстро нашел ссылку как сделать один таймер запускателем второго
Using one timer to enable another timer, страница 392.
куда уж лучшие примеры? Там и описано все по шагам чего куда настроить и так далее... Ну да без библиотек идиотских с кучей функций перекрывающих друг друга, зато по сути, настроил регистры так, эти сяк, этот досчитал, эти поехали...
Там есть тонкости в работе ШИМ для однокрытного запуска. По сути при сработке UR (досчитал до конца) уровень ШИМ выставляется, при достижении сравнения - снимается.
Так вот, когда таймер стартует UR не происходит, а выставляется уровень только после окончания счета (CNT > ARR). Это надо прочувствовать))