Hermano de Castro Pinheiro / HardwarePulseCounter
Revision:
0:baad428cbcc7
Child:
1:2bbb30dc3ed3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HardwarePulseCounter.cpp	Mon Oct 07 11:00:51 2019 +0000
@@ -0,0 +1,133 @@
+#include "HardwarePulseCounter.h"
+
+/*Parametros ex: TIM1, GPIOA, GPIO_PIN_0*/
+
+PulseCounter::PulseCounter(TIM_TypeDef *TIMx, GPIO_TypeDef *GPIOx, uint16_t PINx){
+    this->TIM = TIMx;
+    this->GPIO = GPIOx;
+    this->PIN = PINx;
+};
+
+
+void PulseCounter::CounterConfig(){
+    
+    if(this->TIM == TIM1){
+        __HAL_RCC_TIM1_CLK_ENABLE();
+    }
+    
+    else if(this->TIM == TIM2){
+        __HAL_RCC_TIM2_CLK_ENABLE();
+    }
+    
+    else if(this->TIM == TIM3){
+        __HAL_RCC_TIM3_CLK_ENABLE();
+    }
+    
+    else if(this->TIM == TIM4){
+        __HAL_RCC_TIM4_CLK_ENABLE();
+    }
+    
+    this->htim.Instance = this->TIM;
+    this->htim.Init.Period = 1000;
+    this->htim.Init.Prescaler = 1;
+    this->htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+    this->htim.Init.CounterMode = TIM_COUNTERMODE_UP;
+    this->htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+    
+    this->sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
+}
+
+
+void PulseCounter::GpioConfig(void){
+    
+    if(this->GPIO == GPIOA){
+        __HAL_RCC_GPIOA_CLK_ENABLE();
+    }
+    
+    else if(this->GPIO == GPIOB){
+        __HAL_RCC_GPIOB_CLK_ENABLE();
+    }
+    
+    else if(this->GPIO == GPIOC){
+        __HAL_RCC_GPIOC_CLK_ENABLE();
+    }
+    
+    else if(this->GPIO == GPIOD){
+        __HAL_RCC_GPIOD_CLK_ENABLE();
+    }
+    
+    
+    this->GPIO_InitStruct.Pin = this->PIN;
+    this->GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;;
+    this->GPIO_InitStruct.Pull = GPIO_NOPULL;
+    this->GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    HAL_GPIO_Init(this->GPIO, &this->GPIO_InitStruct);
+}
+
+
+void PulseCounter::SlaveConfig(){
+    
+    this->sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;
+    this->sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
+    this->sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;
+    this->sSlaveConfig.TriggerFilter = 15;
+    HAL_TIM_SlaveConfigSynchronization(&this->htim, &this->sSlaveConfig);
+}
+
+
+void PulseCounter::MasterConfig(){
+    
+    this->sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
+    this->sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+    HAL_TIMEx_MasterConfigSynchronization(&this->htim, &this->sMasterConfig);
+}
+
+
+void PulseCounter::sConfig(){
+    
+    this->sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
+    this->sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
+    this->sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
+    this->sConfigIC.ICFilter = 0;
+}
+
+
+void PulseCounter::TIM_Start(){
+  
+  if(this->TIM == TIM2){
+    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
+  }
+  
+  else if(this->TIM == TIM3){
+    RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
+  }
+  
+  else if(this->TIM == TIM4){
+    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
+  }
+  
+  this->TIM->CR1 |= TIM_CR1_CEN;
+}
+
+void PulseCounter::Start_Configurations(){
+    
+    this->GpioConfig();
+    this->CounterConfig();
+    this->SlaveConfig();
+    this->MasterConfig();
+    this->sConfig();
+    this->TIM_Start();
+    
+    HAL_TIM_Base_Start(&this->htim);
+}
+
+uint32_t PulseCounter::getTimerValue(){
+    
+    this->count = this->TIM->CNT;
+    return this->count;
+}
+
+void PulseCounter::clearTimerValue(){
+    
+    this->TIM->CNT = 0;  
+}
\ No newline at end of file