PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PVD-Interrupt



kmrish
18.07.2011, 15:51
Hallo Experten,

Ich hätte gerne eine Frage bezüglich der PVD und Daten Speichern im EEPROM.

Ich möchte gerne alle Daten, die sich im Register befinden speichern, bevor einen Stromausfall eintritt.
Als erstes soll ich den Stromausfall rechtzeitig entdecken, dafür möchte ich das sog. PVD einsetzten.

Laut der RM0008 ist der PVD mit EXTI16 verbunden.
Das Heisst, durch die Configuration von EXTI_Line16 kann mann über die Hystherese den Stromausfall entdecken.

Gut! mein Problem ist, dass der µc (STM32f100RB) besitzt keinen Port, der pin 16 hat. was soll ich dagegen Unternehmen?
Soll der EXTI16 unbedingt an einem Pin 16 konfiguriert werden?

kann mir jemand sagen wo finde ich Beispiele für EEPPROM_Einsatz, wie die Daten von und nach EEPROM fließen?

RP6conrad
19.07.2011, 08:58
Der STM32f100RB hat keine EEPROM. Da gibts wel eine power down mode, wo das der µ ueber eine Batterie gespeist werden kan. Bestimmte Register bleiben dan activ. Eine ander Moglichkeit ist das Flash zu verwenden als EEPROM. Da ist eine AN2594 von ST wo das beschrieben ist (auch ein SW Beispiel).
Der Voltage Ueberwachung lauft ueber "line 16 EXTI". Einen Pin brauchen sie nicht, da das alles intern verlauft. Da muss nur einen ISR programmiert werden die reagiert auf diese "line 16 EXTI".
Sie soll auch den RM0041 von ST downloaden (7 Mb), diesen ist speciell für diesen µ.

kmrish
19.07.2011, 09:37
Vielen Dank für deine Erklärung

Was meinen Sie mit : "Bestimmte Register bleiben dan active"
Heißt das sie verleiren ihren Inhalt nicht, oder sie kann jene Werten empfangen, die während Down_Mode genariert werden.?

Ich beabsichtige, die Positionen des Drehgebers, auch zu empfangen bzw. bearbeiten, wenn einen Stromausfall vorkommt. Dafür habe ich Hardwaremäßig eine zusätzliche Energiequelle (Batterie) zur Verfügung gestellt. Somit wird die gesamte Schaltung (inklusive der µC) durch die Batterie versorgt, wenn das Netz aus.

Trotz diese Maßnahme habe ich den Fall berücksichtigt, dass auch die alternative Energie irgendwann aus. In dem Fall möchte ich alle Registern des TIM (Wodurch ich die Eingangssignale gecaptured habe) im EEPROM speichern. Und bei erneut Einschalten möchte ich den im EEpprom gespeicherte Werte auslesen.

Zweite Thema: Im RM0008 steht:

"PVD Output interrupt can be generated, when VDD/VDDA drops below the PVD threshold and or when VDD/VDDA rises above the PVD threshold depending on EXTI line16 rising/falling edg configuration"

Ich möchte einen Interrupt auslösen lassen, nur wenn der Volte die niedrigste Hystherese unterschreitet. und nicht wenn der Volt die Übere Hystheres ünerschreitet. dafür soll ich es configurieren. die Frae wo und wie cann ich PVD aktivieren und configurieren??

Im RM0008 steht, dass man PVDE_Bit setzen soll, und die Hystherese-Werte über PLS[2:0] eingestelt werden kann.Beide sind im PWR_CR zu finden.
Aber ich weiss nicht wie kann ich sowas implementieren (Ich meinte was soll ich genau in meinem Code diesbezüglich niederschreiben?). Weiters durch dieses Regsiter kann man nicht einstellen, ob Interrupt bei Unterschreitung von niedrigste Hysthere_wert ausgelöst werden soll.

Zu guter letzt ich werde die AN2594 sorgfältig durchlesen, weil sie mir sehr wichtiger ist.

Best Grüße.

RP6conrad
19.07.2011, 12:32
Wen sie den µ auch einspeisen an Vbat, kan beim Ausfall von Vdd die µ in "Power Down modus" schalten. Diese Zustand konnen sie ueberwachen ueber die PVD. Abhangig von Einstellungen kan dan mit eine sehr kleine Strom von Vbat (µA), doch einige Functionen weiter laufen (RTC, Backup register). Aber iher Encoder weiter einlesen konnen sie vergessen. Diese Backupregister sind nicht zo gross : ich glaube 10 16-bit Register. Steht beschrieven in RM0041.
Die Init von PVD wird gemacht mit (stm32f10x_pwr.c lib):

/**
* @brief Enables or disables the Power Voltage Detector(PVD).
* @param NewState: new state of the PVD.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void PWR_PVDCmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
*(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState;
}
/**
* @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD).
* @param PWR_PVDLevel: specifies the PVD detection level
* This parameter can be one of the following values:
* @arg PWR_PVDLevel_2V2: PVD detection level set to 2.2V
* @arg PWR_PVDLevel_2V3: PVD detection level set to 2.3V
* @arg PWR_PVDLevel_2V4: PVD detection level set to 2.4V
* @arg PWR_PVDLevel_2V5: PVD detection level set to 2.5V
* @arg PWR_PVDLevel_2V6: PVD detection level set to 2.6V
* @arg PWR_PVDLevel_2V7: PVD detection level set to 2.7V
* @arg PWR_PVDLevel_2V8: PVD detection level set to 2.8V
* @arg PWR_PVDLevel_2V9: PVD detection level set to 2.9V
* @retval None
*/
void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel));
tmpreg = PWR->CR;
/* Clear PLS[7:5] bits */
tmpreg &= CR_PLS_Mask;
/* Set PLS[7:5] bits according to PWR_PVDLevel value */
tmpreg |= PWR_PVDLevel;
/* Store the new value */
PWR->CR = tmpreg;
}


Jetzt muss auch noch einen interrupt "line 16" eingestellt werden :
EXTI_GenerateSWInterrupt(EXTI_Line16 );
Siehe auch die lib files stm32f10x_exti.c / h
Dann auch noch einen ISR (Beispiel fur line 5 - 9:

/**
* @brief This function handles External lines 9 to 5 interrupt request.
* @param None
* @retval None
*/
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(KEY_BUTTON_EXTI_LINE) != RESET)
{
/* Toggle LED1 */
STM_EVAL_LEDToggle(LED1);
/* Clear the Key Button EXTI line pending bit */
EXTI_ClearITPendingBit(KEY_BUTTON_EXTI_LINE);
}
}