Skocz do zawartości

STM32F746G-DISCO. Jak zapisać zmienną do pamięci FALSH podczas zaniku zasilania?


Andrzej_Debski

Pomocna odpowiedź

Potrzebowałem zapisać zmienną do pamięci FALSH gdy będzie zanikało zasilanie. W tym celu w konfiguratorze w zakładce System Core/NVIC ustawiłem przerwanie PVD kontrolera napięcia zasilania procesora. W wyniku czego w main.c pojawiło się przerwanie:

static void MX_NVIC_Init(void)
{
  /* PVD_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(PVD_IRQn, 8, 0);
  HAL_NVIC_EnableIRQ(PVD_IRQn);
}

Aby odczytać uprzednio zapisaną wartość zmiennej dodałem po inicjacji przerwania:

total_time = *(__uint32_t*) ADD_FLASH; // odczytanie z FLASH całkowitego czasu pracy

Napisałem trzy funkcje:

static void PVD_NVIC_Init(void) {
	PWR_PVDTypeDef sConfigPVD;
	sConfigPVD.PVDLevel = PWR_PVDLEVEL_7;
	sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING;

	HAL_PWR_ConfigPVD(&sConfigPVD);
	HAL_PWR_EnablePVD();
}

void HAL_PWR_PVDCallback(void) {
	if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ADD_FLASH, total_time)
			== HAL_OK)
		HAL_FLASH_Lock();
}

void FLASH_Erase(void) {
	EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
	EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
	EraseInitStruct.Sector = FLASH_SECTOR_7;
	EraseInitStruct.NbSectors = 1;

	HAL_FLASH_Unlock();
	if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) == HAL_OK)
		;
}

Konfiguracji PVD, wywołania od PVD gdy napięcie zasilające zanika oraz wymazanie sektora w pamięci FLASH.

Ponieważ korzystałem z FREERTOS umieściłem przed wejściem w pętlę:

void StartTask02(void *argument)
{
  /* USER CODE BEGIN StartTask02 */
	PVD_NVIC_Init();
	HAL_Delay(50);
	FLASH_Erase();
	/* Infinite loop */
	for (;;) {
      
		osDelay(1)
    }
   /* USER CODE END StartTask02 */
}

Powoduje to skasowanie i przygotowanie FLASH do zapisu w chwili wywołania przerwania przy zaniku napięcia.

Napięcie wygenerowania przerwania ustawiłem na 3.0 V w przywołanej już funkcji konfiguracji.

To działa!

Andrzej

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Na 100% skorzystam z rozwiązania jeśli zajdzie taka potrzeba.Jednakże mam pytanie- gdzie w pamięci  stm32fxxxxxx zostają zapisane zmienne.STMicroelectronics w arkuszu danych twierdzi,że  danej komórki pamięci można użyć jako eeprom co najwyżej kilkaset razy .Dlatego zaproponował rozwiązanie polegające na tym,że dane są zapisywane  na ostatnich stronach pamięci flash.STM przestrzega przed zapisywaniem w pamięci gdzieś tam gdzie jest program bo jak  ulegnie uszkodzeniu komórka pamięci to kontroler jest do wymiany.Opis emulatora eeprom jest w pliku AN4061.

obraz.thumb.png.04eb378629f778a68befd5d7031fac0e.png

Gdzieś w necie można znaleźć biblioteki STM ale są to przykłady i należy je w razie czego przerabiać.O wiele lepszym rozwiązaniem jest użycie bibliotek ee-master autorstwa Nima Askari, które można znaleźć na Git Hubie http://www.github.com/NimaLTD a sposób użycia na youtube:    https://www.youtube.com/channel/UCUhY7qY1klJm1d2kulr9ckw.Ponieważ używam STM32 cube ide to sposób wklejania bibliotek jest windowsowy czyli  przeciągnij i upuść.Biblioteki .h do Inc,biblioteki .c  do src a następnie w folderze głównym projektu refresh i po wszystkim a dalej tak jak zwykle # include ..... W bibliotece ee.c można przeczytać ,które mikrokontrolery są obsługiwane ale zawsze można pokusić się o dopisanie jakiegoś innego procka.Biblioteki zastosowałem w dwóch programach i działają doskonale.Nieprawdopodobna prostota obsługi!Polecam.

Link do komentarza
Share on other sites

Może uda się odzyskać płytę.Zainstaluj STM32cubeProgrammer ,podłącz płytę przez ST-Link a następnie kliknij  connect.Jeśli się połączysz to kliknij dwa razy w ikonę po lewej stronie u góry ze strzałką w dół.Otworzy się okno ,po prawej stronie u góry jest Full chip erase ,kliknij.Może uda się  jeszcze wymazać  pamięć i wszystko będzie działać.Gdybyś nie mógł się połączyć naciśnij przycisk reset  na  płycie i przytrzymaj, następnie myszą najedź na connect i kliknij po czym puść przycisk reset.To puszczenie przycisku to prawie natychmiast po naciśnięciu  przycisku connect.Zbyt długie przytrzymanie przycisku reset po kliknięciu connect spowoduje,że się nie połączysz.Trochę wprawy i będzie ok.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Płytę odczytał .Spróbuj najpierw wgrać nowszy firmware  przycisk firmware upgrade.Później podeślę plik o programie.Debugger to jak masz ustawiony w Keilu bo chyba w keilu pracujesz.

Link do komentarza
Share on other sites

Jeśli masz jakąś  na 100% sprawną płytę to spróbuj przetestować połączenie z STMcube programmer.To na pewno pomoże w działaniu na tej feralnej płycie.

Link do komentarza
Share on other sites

Rozdział 2.1.4 do przerobienia.Może uda się połączyć w  Connect Under Reset albo Hot Plug

Connect Under Reset  -> Połącz w ramach resetowania : Ten tryb umożliwia połączenie z celem za pomocą resetowania vector catch przed wykonaniem jakichkolwiek instrukcji. Jest to przydatne w wielu przypadkach na przykład, gdy cel zawiera kod, który wyłącza piny JTAG / SWD.

Hot Plug : umożliwia połączenie z celem bez zatrzymywania lub resetowania. Jest to przydatne do
aktualizacji adresów pamięci RAM lub rejestrów IP podczas działania aplikacji.

Jeśli się nie uda połączyć w ten sposób to jeszcze pozostaje połączenie przez UART.

Link do komentarza
Share on other sites

Podłączając  przejściówkę usb/uart  trzeba pamiętać by napięcie zasilające wybrać 3,3V a nie 5V bo będzie to ostateczny  koniec płyty.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.