Vittok007 0 23 декабря, 2012 Опубликовано 23 декабря, 2012 · Жалоба Привет всем. Подскажите как с помощью таймера в stm32 менять состояние вывода микроконтроллера на противоположное с достаточно высокой частотой(порядка 10 МГц)??? Делал вот так: #define TIM8_OUT_FREQ 1000000 //Настраивем таймер void TIM8_Config(void) { uint16_t PrescalerValue; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //Enable the TIM8 gloabal Interrupt NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //Вычисляем значение предделителя PrescalerValue = (uint16_t)((SystemCoreClock / TIM8_OUT_FREQ) - 1); //Настраиваем таймер TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 1; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //Prescaler configuration // TIM_PrescalerConfig(TIM8, PrescalerValue, TIM_PSCReloadMode_Immediate); //Разрешаем прерывание по обновлению TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE); //Врубаем таймер TIM_Cmd(TIM8, ENABLE); //Разрешаем обработку прерывания по переполнению счетчика TIM8 NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn); } //Обработчик прерывания void TIM8_UP_TIM13_IRQHandler() { if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET) { //Очищаем бит обрабатываемого прерывания TIM_ClearITPendingBit(TIM8, TIM_IT_Update); //Инвертируем сомтояние порта GPIO_Write(GPIOC, GPIO_ReadOutputData(GPIOC) ^ (GPIO_Pin_6)); } } Работает, но выходная частота не поднимается выше 428,5кГц(???), даже если задаю 1мегагерц, например. А если задаю более низкую частоту(например, 200кГц), то частота на выходе в 4 раза меньше(50кГц). В чем причина? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 23 декабря, 2012 Опубликовано 23 декабря, 2012 · Жалоба Привет всем. Подскажите как с помощью таймера в stm32 менять состояние вывода микроконтроллера на противоположное с достаточно высокой частотой(порядка 10 МГц)??? Работает, но выходная частота не поднимается выше 428,5кГц(???), даже если задаю 1мегагерц, например. А если задаю более низкую частоту(например, 200кГц), то частота на выходе в 4 раза меньше(50кГц). В чем причина? Использовать аппаратный ШИМ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nx6310 0 23 декабря, 2012 Опубликовано 23 декабря, 2012 · Жалоба Можно настроить таймер на ногодрыгание без прерываний. Тогда не будет тратится ресурсы на переключение состояния вывода. Пример попробую в понедельник скинуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 декабря, 2012 Опубликовано 23 декабря, 2012 · Жалоба Так рядом все есть. Все уже украдено до вас. http://electronix.ru/forum/index.php?showt...t&p=1123108 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nx6310 0 24 декабря, 2012 Опубликовано 24 декабря, 2012 · Жалоба Вот так можно настроить вывод на генерацию импульсов без использования прерываний TIM_TimeBaseStructure.TIM_Period = 3;// 4MHz TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse =0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM4, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Disable); TIM_Cmd(TIM4, ENABLE); настраивается канал TIM4-CH2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться