Цитата
Ну так TRGO-то можно по-разному формировать.
Например, 100: Compare - OC1REF signal is used as trigger output (TRGO)
тогда на TRGO будет импульс совпадающий по форме с OC1REF.
Пока он ==1 на ведомый таймер поступает его нормальный клок, как стал 0 - так клок запрещается.
Я правильно понял, вы хотите ведомым, то есть контролирующим количество клоков, таймером останавилвать ведущий? Если да, и это возможно, то идея хорошая.
Цитата
только с TIM1 или TIM8 в качестве ведомого, потому что только они сидят на более быстрой шине APB2 и могут тактироваться 64МГц.
Этим таймером формировать OCx в режиме PWM (1 или 2), получится как раз 32МГц.
Я Вас наверное запутал. Мне не надо на ведомом 32 МГц.
Давайте еще раз по полочкам:
1. Нужна функция SendSomeClocks(unsigned int Clocks_count);
При вызове она должна сформировать на выходе таймера импульсы в количестве, обозначенном Clocks_count c частотой 32 МГц.
Как мне это видится (схематично):
Код
void EXT_FrequencyCounterConfig(void)
{
// Настраиваем ведущий таймер, формирующий клоки. Выбор таймера, источника тактирвоани, а также настройки периода и делителя должны обеспечить 32МГц
TIM_TimeBaseStructInit(&TIM_InitStructure);
TIM_InitStructure.TIM_Prescaler = 1-1;
TIM_InitStructure.TIM_Period = 1;
TIM_TimeBaseInit(TIM2, &TIM_InitStructure);
// Настраиваем канал, с которого будем снимать клоки.
TIM_OCStructInit(&TIM_OCConfig);
TIM_OCConfig.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC1Init(TIM2, &TIM_OCConfig);
// Настраиваем ведомый таймер. Он должен подсчитывать количество генерируемых ведущим клоков. Обратите внимание - не количество смен состояния, а именно количество импульсов. То есть если при каскадировании каким-то образом, если я правильно понял Ваше описание, частота делится на два - отлично, если нет, то нужно учесть это в настройках таймера
TIM_TimeBaseStructInit(&TIM_InitStructure);
TIM_InitStructure.TIM_Prescaler = 1-1; // или 2-1, в зависимости от пути решения проблемы, обозначенной выше.
TIM_InitStructure.TIM_Period = 1;
TIM_TimeBaseInit(TIM3, &TIM_InitStructure);
// ВРЕМЕННО настраиваем выход, просто чтобы осциллографом проконтролировать результат.
TIM_OCStructInit(&TIM_OCConfig);
TIM_OCConfig.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC1Init(TIM3, &TIM_OCConfig);
}
// В вышеописанной функции я пока не описывал настройку связей между таймерами, нужно определиться с режимами.
//По задумке, таймер 3 (ведомый) должен переполняться как раз тогда, когда все клоки протикали.
//Обрабатываем прерывание по переполнению
void TIM3_IRQHandler(void)
{
TIM_Cmd(TIM3, DISABLE); //Выключили
TIM_Cmd(TIM2, DISABLE); //Выключили
TIM3->SR &= ~TIM_SR_UIF; //reset interrupt flag
Ready_FLAG=1; // Доложили об исполнении
}
// СОБСТВЕННО ФУНКЦИЯ SendSomeClocks
void SendSomeClocks (unsigned int Clocks_count)
{
// Сообщаем Ведомому, когда же он должен остановиться, перенастраиваем и запускаем
TIM_InitStructure.TIM_Period = Clocks_count;
TIM_TimeBaseInit(TIM3, &TIM_InitStructure);
TIM_Cmd(TIM3, ENABLE); // таймер работает, но не тикает, пока не получены сигналы от TIM2
TIM_Cmd(TIM2, ENABLE); //Включили, пошли клоки.
}
// Пока тикает таймер, контрллер идет заниматься богоугодными делами.
Что скажете насчет режимов, каскадов, выбора таймеров и шины тактирования?