STM32F407VG: usando temporizadores para contar cada pulso de un reloj externo durante un tiempo específico

0

Estoy trabajando en un proyecto para contar los impulsos de una señal externa, estoy usando TIM2 para contar cada impulso de la señal y el TIM4 para establecer la duración del conteo.

Por ejemplo: tengo una señal externa con una frecuencia de 10 kHz, y quiero contar los pulsos por una duración de 10 ms (rationnally debe ser 100 pulsos en 10ms).

Las preguntas son: ¿Cómo configuro mi TIM4 para configurar la duración del conteo de TIM2?

Desarrollé el código que se muestra a continuación, pero no funcionó:

#include <stdio.h>
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_tim.h"

void GPIOAInit_TIM2(void);
void TIM2_Init(void);   // Timer to count every pulses of an external signal
void TIM4_Init(void);   // Timer to determine the duration


int variable = 0;
int var2 = 0;

int main(void)
{
// Initialize the source of the timer
GPIOAInit_TIM2();

// Initialize the timer to determine the duration
TIM4_Init();

// Initialize the timer to count every pulses of an external signal
TIM2_Init();

while(1)
{
    if ( TIM_GetCounter(TIM4) == 2000 )
    {
        variable = TIM_GetCounter(TIM2);
        TIM_SetCounter(TIM2, 0);
        TIM_SetCounter(TIM4, 0);
    }
    else
    {
        variable = -1;
    }
}
}

void GPIOAInit_TIM2(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);       // Enables the clock for port A
GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_TIM2);    // allows pin  15  (GPIO_PinSource15) of port A (GPIOA) to be used as alternative function for Timer 2, therefore the ETR or CH

GPIO_InitStructure.GPIO_Pin = GPIO_PinSource15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//Initialize the timer to count every pulses of an external signal
void TIM2_Init(void) 
{
TIM_TimeBaseInitTypeDef TIM_BaseStruct;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        // Enable The timer for the timer

TIM_BaseStruct.TIM_Prescaler = 0;                           // Since we want to count all pulses this member is initialized to 0
TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up;        // The order of counting is up_counting
//  TIM_BaseStruct.TIM_Period = 0xFFFF;                             // This value Specifies the period of counting before the content of the counter is reset back to 0
TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;            // Another divider of clock, In our case is skipped

TIM_TimeBaseInit(TIM2, &TIM_BaseStruct);                    // The timer is configured for counting direction, period and scaling

TIM_ETRClockMode2Config(TIM2,
                        TIM_ExtTRGPSC_OFF,
                        TIM_ExtTRGPolarity_NonInverted,
                        0x00);                              // Use external Clock Mode 2 (Since we use ETR pin as a pin source of the signal to count)
TIM_Cmd(TIM2, ENABLE);

}

// Initialize the timer to determine the duration
void TIM4_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseStruct;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

TIM_BaseStruct.TIM_Prescaler = 42000 - 1 ;          // from 84 MHz to 20kHz
TIM_BaseStruct.TIM_Period = 2000 ;                  // from 20 kHz to 1s
TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM4, &TIM_BaseStruct);

TIM_Cmd(TIM4, ENABLE);

}
    
pregunta Walid Amehri

0 respuestas

Lea otras preguntas en las etiquetas