#include "stm32f4xx_conf.h" static uint32_t messwert=0; static float frequenz=0; void init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // Clock Enable RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); // Clock enable RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // Config des Pins als AF-Input GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); // Alternative-Funktion mit dem IO-Pin verbinden GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3); TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // Vorteiler einstellen (83 => 1MHz) TIM_PrescalerConfig(TIM3, 1, TIM_PSCReloadMode_Immediate); // Channel 4 TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInit(TIM3, &TIM_ICInitStructure); // Timer enable TIM_Cmd(TIM3, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE); } void TIM3_IRQHandler(void) { static uint16_t pos=0; static uint32_t t1=0; static uint32_t t2=0; if(TIM_GetITStatus(TIM3, TIM_IT_CC4) == SET) { // Interrupt Flags loeschen TIM_ClearITPendingBit(TIM3, TIM_IT_CC4); if(pos==0) { pos=1; t1=TIM_GetCapture4(TIM3); } else { t2=TIM_GetCapture4(TIM3); if(t2>=t1) { messwert=t2-t1; } else { messwert=(0xFFFF - t1) + t2; } t1 = t2; } } } int main(void) { init(); SystemInit(); while(1) { frequenz = 42000000/messwert; } }