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);
}