Página 1 de 1

STM32 LPTIM

MensagemEnviado: 01 Dez 2021 20:18
por tcpipchip
Estou utilizando LPTIM no STM32L0 (KEIL C), consigo receber pulsos, contar...porem nao consegui fazer gerar uma interrupt quando tenho overflow.

Alguem com experiencia ?

STM CUBE nao ajudou

Se sim...eu passo o projeto do KEIL...

PS: STM32L071

Re: STM32 LPTIM

MensagemEnviado: 02 Dez 2021 04:19
por cfreund
Use Auto-reload match interrupt.

Re: STM32 LPTIM

MensagemEnviado: 02 Dez 2021 08:06
por tcpipchip
Opa, abusando da sua boa vontade, se usas o STM32, fazer um exemplo com Auto-reload match interrupt lptim?

Se possivel, tudo dentro do main.c

Re: STM32 LPTIM

MensagemEnviado: 02 Dez 2021 09:00
por tcpipchip
Código: Selecionar todos

#include <stddef.h>
#include <string.h>
#include "stm32l0xx_hal.h"
#include <math.h>
#include "board.h"
#include "Utilities.h"
#include "misc.h"
#include "process.h"
#include "timer.h"
#include "init.h"
#include "timer.h"
#include "main.h"

#include "stm32l0xx_hal_lptim.h"
LPTIM_HandleTypeDef hlptim1;

/**
  * @brief LPTIM1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_LPTIM1_Init(void)
{

  /* USER CODE BEGIN LPTIM1_Init 0 */

  /* USER CODE END LPTIM1_Init 0 */

  /* USER CODE BEGIN LPTIM1_Init 1 */

  /* USER CODE END LPTIM1_Init 1 */
  hlptim1.Instance = LPTIM1;
  hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_ULPTIM;
  hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
  hlptim1.Init.UltraLowPowerClock.Polarity = LPTIM_CLOCKPOLARITY_FALLING;
  hlptim1.Init.UltraLowPowerClock.SampleTime = LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION;
  hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
  hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;
  hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
  hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_EXTERNAL;
  if (HAL_LPTIM_Init(&hlptim1) != HAL_OK)
  {
    //Error_Handler();
  }
   
   HAL_NVIC_SetPriority(LPTIM1_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(LPTIM1_IRQn);

  /* USER CODE BEGIN LPTIM1_Init 2 */

  /* USER CODE END LPTIM1_Init 2 */

}

void LPTIM1_IRQHandler(void)
{
        if((LPTIM1->ISR & LPTIM_FLAG_CMPM) != RESET)
        {
            /*  Clear compare match interrupt */
            LPTIM1->ICR = LPTIM_FLAG_CMPM;           
            /*  Turn off overflow interrupt */
            HAL_LPTIM_TimeOut_Stop_IT(&hlptim1);           
        }
}

uint16_t Counter;

unsigned char Msg[64];

int main(void)
{
   Start_Init();
   
   MX_LPTIM1_Init();
   /* 65535 is the value loaded into LPTIM1's ARR register */
  HAL_LPTIM_Counter_Start_IT(&hlptim1, 65535);
   
   while(1)
   {   
      Counter = HAL_LPTIM_ReadCounter(&hlptim1); // hlptim1 is a global variable   
      sprintf(Msg,"%d",Counter);
      PRINTF("\r\n+++++++++++%s+++++++++++\r\n", Msg);
///AQUI JÁ ENTRO EM DEEP SLEEP...AGUARDANDO DAR OVERFLOW NO LPTIM PARA SAIR DE DEEP...
   }   
}
#endif



Re: STM32 LPTIM

MensagemEnviado: 02 Dez 2021 11:23
por tcpipchip
Consegui, depois de ler varias vezes varias vezes como o KEIL usa HAL_, weak, VIRTUAL functions...
Agora foi....
Consegui tambem ter um contador de 32bits...

Falta agora uma dica de como alterar o LPTIM com um valor...

Ou seja...como faço ele para começar com 30.000, por exemplo ?

Re: STM32 LPTIM

MensagemEnviado: 07 Dez 2021 18:56
por tcpipchip
Resolvi com Interrupt overflow!

Hoje minha aplicacao conta pulsos (32 bits) e salva a cada 24 horas na FLASH...

No 7 dia manda para NUVEM a contagem via LoRaWAM