Forum: Mikrocontroller und Digitale Elektronik Wie mache ich PVD ( programmable voltage detector ) interrupt funktioniert ?


von mehmet karakaya (Gast)


Lesenswert?

hallo forum,

Ich will bei stromabschaltung eine Datei zum flash von STM32F103 
speichern

dafür richte ich PVD ( programmable voltage detector ) interrupt 
folgende Weise ein.

aber ich kann PVD interrupt nicht feuern

Ich schalte eine LED durch ein Portpin ein im PVD interrupt, aber die 
LED leuchtet nicht auch für kurze zeit - bis die kapazitoren leeren

die flash speicher routinen habe ich im anderen Program getestet kein 
problem

wer kann weiter helfen ? danke im voraus

hier sind die Kodierung
==========================0============================
main(){
---------------------------------
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
-------------------------------------------------------------
  NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);}
-------------------------------------
EXTI16init();
-------------------------------------
  FLASH_Unlock();
  EE_Init();
    EEread_params();
----------------------------------
/* Configure the PVD Level to 2.9V */
        PWR_PVDLevelConfig(PWR_PVDLevel_2V9);
  /* Enable the PVD Output */
        PWR_PVDCmd(ENABLE);
---------------------------------------------
}
---------------------------------------------
void EXTI16init(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;

  /* Configure EXTI Line16(PVD Output) to generate an interrupt on 
rising and
     falling edges */
  EXTI_ClearITPendingBit(EXTI_Line16);
  EXTI_InitStructure.EXTI_Line = EXTI_Line16;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}
----------------------------------
void PVD_IRQHandler(void)
{
    EXTI_ClearITPendingBit(EXTI_Line16);
    EXTI_ClearFlag(EXTI_Line16);

    EEsave_param();

    while (1){Delay(100);IWDG_ReloadCounter();}

}

von Michael K. (damichl)


Lesenswert?

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

Zum Speichern im Flash ist es da aber in der Regel bereits zu spät...

von mehmet karakaya (Gast)


Lesenswert?

nein nicht "EXTI trigger rising" sondern "falling"

ich will bei strom"ab"schaltung speichern

die bypass kapazitoren haben genug energie um die uC beim 
speichervorgang mit strom zu versorgen

flash speichern dauert nur 10 - 20 mikrosekunden

mein problem ist dass die interrupt nicht feuert

speichern ist nicht die wichtigste problem

von Jürgen (Gast)


Lesenswert?

mehmet karakaya schrieb:
> die bypass kapazitoren haben genug energie um die uC beim
> speichervorgang mit strom zu versorgen

Hast Du das mal nachgemesen?

von hp-freund (Gast)


Lesenswert?

Moin,

welchen Wert hat NVIC_SetPriorityGrouping?
Ich frage weil vielleicht dadurch das 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
Probleme machen könnte.

Kannst NVIC_IRQChannelSubPriority zur Probe ja mal auf 0 setzen.

von Michael K. (damichl)


Lesenswert?

Das EXTI-Signal wird bei unterschreiten der Spannung hochgezogen und 
damit der Interrupt ausgelöst, deshalb die steigende Flanke. Wenn Du es 
besser weißt ... bitte :)

von mehmet karakaya (Gast)


Lesenswert?

Michael K. schrieb:
> Das EXTI-Signal wird bei unterschreiten der Spannung hochgezogen
> und
> damit der Interrupt ausgelöst, deshalb die steigende Flanke. Wenn Du es
> besser weißt ... bitte :)

du hast recht

mit "Rising" hat es funtioniert

danke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.