STM32 La alarma RTC no se configura por segunda vez

2

Estoy usando MCU STM32l151vbt6 y estoy tratando de configurar la alarma RTC cada 15 minutos. (Eso es 0, 15, 30 y 45 minutos de cada hora).

Puedo configurar la alarma y funcionará por primera vez, si intento configurarlo nuevamente después de que se active la alarma, se establecerá en el estado de alarma anterior. Si reinicio la MCU, puedo configurar la alarma y despertará al controlador del modo de parada cuando se produzca la alarma. Déjeme saber cómo puedo configurar la próxima alarma sin reiniciar la MCU.

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    /* 8(hour) and 19(day) are masked and there is no effect on the alarm */
    RTC_AlarmTypeDef    RTC_AlarmStructure =
    {
        0,
        0,
        0,
        RTC_H12_AM,
        (RTC_AlarmMask_DateWeekDay | RTC_AlarmMask_Hours),
        RTC_AlarmDateWeekDaySel_Date,
        19
    };
    const uint8_t       alarm_interval[4] = { 15, 30, 45, 0 };
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


    RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes =  alarm_interval[RTC_current_time.minute/15];
/*Alarm A will be configured*/
    RTC_Alarm_Config(&RTC_AlarmStructure);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void RTC_Alarm_Config(RTC_AlarmTypeDef *RTC_AlarmStructure)
{
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    EXTI_InitTypeDef    EXTI_InitStructure;
    NVIC_InitTypeDef    NVIC_InitStructure;
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

    RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
    RTC_AlarmCmd(RTC_Alarm_B, DISABLE);//Not using this


    /* EXTI configuration */
    EXTI_ClearITPendingBit(EXTI_Line17);
    EXTI_InitStructure.EXTI_Line = EXTI_Line17;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);


    /* Enable the RTC Alarm Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, RTC_AlarmStructure);


    /* Clear RTC AlarmA Flags */
    RTC_ClearITPendingBit(RTC_IT_ALRA);

    /* Enable AlarmA interrupt */
    RTC_ITConfig(RTC_IT_ALRA, ENABLE);


    /* Enable the alarmA */
    RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
}
    
pregunta Myanju

2 respuestas

5

Nos enfrentamos al mismo problema al trabajar con RTC en mi controlador STM32F030. Nuestra interrupción de alarma se activó una vez, pero nunca volvería a activarse.

El problema fue el siguiente:

  1. Necesitábamos poner el sistema en modo de bajo consumo cuando no está en uso
  2. Para habilitar el modo de bajo consumo, tuvimos que llamar a esta función %código%
  3. Esta función impide el acceso de escritura al bit DBP de registro PWR_CR y genera un bit DBP = 0. Este bit debe configurarse antes de que podamos cambiar los valores de los registros RTC (como se menciona en la referencia manual)

El manual de referencia RM0360 para STM32F030 y STM32F070 indica que:

  

Después del reinicio del sistema, los registros RTC están protegidos contra   acceso de escritura parásito borrando el bit DBP en el registro PWR_CR   (Consulte la sección de control de potencia). El bit DBP se debe configurar para   habilitar registros de RTC de acceso de escritura. Después de restablecer el dominio RTC, todos los RTC   Los registros están protegidos contra escritura. La escritura en los registros RTC está habilitada   escribiendo una clave en el registro de protección contra escritura, RTC_WPR. los   Se requieren los siguientes pasos para desbloquear la protección contra escritura en todas las   Registros RTC, excepto RTC_TAFCR y RTC_ISR [13: 8].

     
  1. Escriba '0xCA' en el registro RTC_WPR.

  2.   
  3. Escriba ‘0x53’ en el registro RTC_WPR.   Escribir una clave incorrecta reactiva la protección contra escritura. El mecanismo de protección no es   afectados por el reinicio del sistema.

  4.   

Resolvimos el problema realizando los siguientes cambios en el controlador IRQ de RTC:

void RTC_IRQHandler(void)
{
   /*  Check line 17 has triggered the IT */
   if ((EXTI->PR & 0x20000) != 0)  
   {  
      /* Makes the DBP bit of PWR_CR register write accessible */
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE);

      /* Writes 1 in the DBP bit of PWR_CR register */
      PWR_BackupAccessCmd(ENABLE);



      /* Your code here ... */


      /* RTC registers are made write accessible */
      RTC_WriteProtectionCmd(DISABLE);

      /* Clear the RTC Alarm-A Flag */
      RTC_ClearFlag(RTC_FLAG_ALRAF);


      /* Makes the RTC registers read only */
      RTC_WriteProtectionCmd(ENABLE);

      /* Locks the DBP bit of PWR_CR register again */
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);

      /* Clear the EXTI Line 17 Pending bit (Connected internally to RTC Alarm) */
      EXTI->PR |= 0x20000;
  }
}
    
respondido por el meetpatelvgec
1

¿Has verificado que tu máscara de alarma está configurada correctamente? Incluso con una máscara de alarma incorrecta, puede obtener la primera alarma porque la configuración predeterminada hará que la alarma se active (año = 0, mes = 0, día = 0, día_de_ semana_ = 0, horas = 0, minutos = 0, segundos = 0, mask = all_must_match) porque el RTC comienza con la fecha / hora exacta.

Debe habilitar el acceso de escritura a los registros RTC antes de poder modificarlos. Algunas de las funciones de RTC de la biblioteca de periféricos STM32 reactivan de manera conveniente la protección contra escritura detrás de escena; necesitas verificar el código fuente de cada función.

No muestras tu rutina de interrupción. Debe borrar los indicadores de interrupción RTC y EXTI allí.

    
respondido por el jvr

Lea otras preguntas en las etiquetas