Пн мар 17, 2014 13:01:40
// STM32 TIM2 4 Channel Input Capture STM32F0-Discovery - sourcer32@gmail.com
#include "stm32f0xx.h"
#include "stm32f0_discovery.h"
//**************************************************************************************
void TIM2_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
/* TIM2 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* TIM2 Configuration */
TIM_DeInit(TIM2);
/* Time base configuration */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 1000000) - 1; // 1 MHz, from 48 MHz
TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF; // Maximal, TIM2 is 32-bit counter
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // Rising/Falling/BothEdge
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
/* TIM1 enable counter */
TIM_Cmd(TIM2, ENABLE);
/* Enable the CCx Interrupt Request */
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
}
//**************************************************************************************
volatile uint32_t Freq[4];
void TIM2_IRQHandler(void)
{
uint32_t Current, Delta;
static uint32_t Last[4];
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
/* Clear TIM2_CH1 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
Current = TIM_GetCapture1(TIM2);
Delta = Current - Last[0];
Last[0] = Current;
if (Delta)
Freq[0] = 1000000 / Delta; // 1MHz clock
// ..
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
/* Clear TIM2_CH2 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
Current = TIM_GetCapture2(TIM2);
Delta = Current - Last[1];
Last[1] = Current;
if (Delta)
Freq[1] = 1000000 / Delta; // 1MHz clock
// ..
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
/* Clear TIM2_CH3 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
Current = TIM_GetCapture3(TIM2);
Delta = Current - Last[2];
Last[2] = Current;
if (Delta)
Freq[2] = 1000000 / Delta; // 1MHz clock
// ..
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
{
/* Clear TIM2_CH4 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
Current = TIM_GetCapture4(TIM2);
Delta = Current - Last[3];
Last[3] = Current;
if (Delta)
Freq[3] = 1000000 / Delta; // 1MHz clock
// ..
}
}
//**************************************************************************************
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable and set TIM2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//**************************************************************************************
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOA Periph clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* Configure TIM2 input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Connect TIM pins to AF2 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_2); // TIM2_CH1 PA5
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_2); // TIM2_CH2 PA1
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_2); // TIM2_CH3 PA2
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_2); // TIM2_CH4 PA3
}
//**************************************************************************************
int main(void)
{
NVIC_Config();
GPIO_Config();
TIM2_Config();
while(1); /* Infinite loop */
}
Пн мар 17, 2014 13:05:10
Пн мар 17, 2014 13:15:00
Пн мар 17, 2014 15:02:33
Ср мар 19, 2014 12:01:18
Ср мар 19, 2014 12:26:29
Ср мар 19, 2014 12:36:04
HHIMERA писал(а):Назови причины невозможности "красивого" написания... слушаем...
Ср мар 19, 2014 12:44:32
Ср мар 19, 2014 14:30:43
Я тоже так подумал.Леонид Иванович писал(а):Какая там халява - если задача требует точного измерения частоты за короткий интервал времени, то здесь как раз место для Reciprocal Counting
himera хвастал(а)сь.Леонид Иванович писал(а):, но его для STM32 пока никто красиво не написал.
Ср мар 19, 2014 14:56:46
Ср мар 19, 2014 15:00:17
dosikus писал(а):kybin, HHIMERA не хвастался - он сделал и работает...
Ср мар 19, 2014 15:10:40
Ср мар 19, 2014 15:28:31
Чт мар 20, 2014 13:08:32
HHIMERA писал(а):Назови причины невозможности "красивого" написания... слушаем...
kybin писал(а):Да, ничего особенно сложного, если почитать Ref.manual. И уже считает.
kybin писал(а):Кварц у контроллера 8 МГц (нестабильность +-50ppm). Внутри частота умножается до 168 МГц. Там свои ppm'ы. Вопрос: может стоит использовать внешнее тактирование для таймера? Там есть такая возможность (ETR).
Чт мар 20, 2014 17:00:06
Вы уже реализовали Reciprocal Counting? Как Вам это удалось?
Чт мар 20, 2014 18:44:18
Чт мар 20, 2014 20:50:58
kybin писал(а):Жаль делиться не хочет.
Чт мар 27, 2014 10:44:07
Да.Леонид Иванович писал(а):Вы уже реализовали Reciprocal Counting? Как Вам это удалось?.
Пт фев 16, 2018 21:53:15