Autor Tema: Problema con el timer del STM32F303VC  (Leído 1867 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Snaut

  • PIC12
  • **
  • Mensajes: 57
Problema con el timer del STM32F303VC
« en: 13 de Marzo de 2015, 21:31:24 »
Hola. Hace poco que he empezado con ARM, en concreto con los micros de ST,  y voy avanzando poco a poco pero ahora tengo un problema y hace días que estoy atascado en lo mismo. Quiero configurar el timer como comptador, es decir que cuente los pulsos de una señal. El problema es que no consigo que cuenta nada, después de leer los apartados que corresponden del datasheet y seguir los pasos indicados no soy capaz de que me funcione, le cargo un valor al timer y éste lo envio a un puerto exterior para visualizar con leds el valor per se queda fijo. Yo me temo que el problema puede venir de que me falte alguna habilitación de clock. Dejo el código por si alguien puede hecarle un ojo y ayudarme.

Código: [Seleccionar]

/* Includes ------------------------------------------------------------------*/
#include "stm32f3xx_hal.h"

/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim3;

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void TIM3_Config(void);


int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  TIM3_Config();

  while (1)
  {
GPIOA->ODR=TIM3->CNT;
  }
}

void SystemClock_Config(void)
{

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV8;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

  __SYSCFG_CLK_ENABLE();

}

void TIM3_Config(void)
{
__TIM3_CLK_ENABLE();
TIM3->CR1=0x0001;
TIM3->CR2=0x0000;
TIM3->SMCR=0x5000;
TIM3->DIER=0x0001;
TIM3->EGR=0x0000;
TIM3->CNT=0x0005; //valor inicial
TIM3->PSC=0x0000;
}

void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

  __GPIOA_CLK_ENABLE();
__GPIOD_CLK_ENABLE();
  
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|
GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

Adjunto una imagen de la explicación que dan para realizar dicha configuración.
Gracias de antemano.

« Última modificación: 13 de Marzo de 2015, 21:43:44 por Snaut »

Desconectado Snaut

  • PIC12
  • **
  • Mensajes: 57
Re: Problema con el timer del STM32F303VC
« Respuesta #1 en: 15 de Marzo de 2015, 10:21:04 »
Buenas. Al final lo he podido resolver. Mi intención era hacer las configuraciones directamente en los registros sin tocar las librerias pero al final he tenido que usarlas con la ayuda del STcube mx. Dejo el código por si puede ayudar a alguien algún día. Un saludo.

Código: [Seleccionar]
#include "stm32f3xx_hal.h"

TIM_HandleTypeDef htim3;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM3_Init(void);

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
  HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(RCC_IRQn);

  MX_GPIO_Init();
  MX_TIM3_Init();

  while (1)
  {
GPIOA->ODR=TIM3->CNT;
  }
}

void SystemClock_Config(void)
{

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV8;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

  __SYSCFG_CLK_ENABLE();

}

void MX_TIM3_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 32; //umbral máximo
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim3);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
  sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED;
  sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;
  sClockSourceConfig.ClockFilter = 0;
  HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);
__TIM3_CLK_ENABLE();
TIM3->CNT=0; //valor inicio
TIM3->CR1|=0x0001; //timer 3 en ON.
}

void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

  __GPIOA_CLK_ENABLE();
  __GPIOD_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
                          |GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
                          |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}