<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=46&amp;t=18619&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-06-15T20:44:39+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=18619&amp;mode</id>
<entry>
<author><name><![CDATA[naimad90]]></name></author>
<updated>2017-06-15T20:44:39+01:00</updated>
<published>2017-06-15T20:44:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190755#p190755</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190755#p190755"/>
<title type="html"><![CDATA[Re: STM32- odzyskiwanie wartości zmiennych po resecie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190755#p190755"><![CDATA[
Teoretycznie Twój program powinien działać jak zakładasz, ciężko mi znaleźć jakiś problem. Może trochę za bardzo już kombinuję, ale próbowałeś po inicjalizacji wachdoga wykonać funkcję __DSB(); ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1629">naimad90</a> — 15 cze 2017, o 20:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[_damian]]></name></author>
<updated>2017-06-15T16:48:49+01:00</updated>
<published>2017-06-15T16:48:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190731#p190731</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190731#p190731"/>
<title type="html"><![CDATA[Re: STM32- odzyskiwanie wartości zmiennych po resecie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190731#p190731"><![CDATA[
Zgadzam się z wszelkimi uwagami, nie ma tutaj wątpliwości ale to był tylko przykład a samo int8_t wynikało z sprawdzenia czy typ zmiennej ma tutaj znaczenie. Ale do sedna. Popełniłem błąd pisząc, że zmienna przyjmuje zawsze wartość 0. Wrzuciłem dane do Excela i sprawa wygląda trochę inaczej ale opisze to na przykładzie kodu:<br />[syntax=c]#include&quot;stm32f411xe.h&quot;<br /><br />float calka=0.5;<br />volatile int32_t sprawdz_reset,przypisz_calke;<br />uint8_t status,flaga_reset;<br /><br />int main()<br />{<br />RCC-&gt;AHB1ENR=RCC_AHB1ENR_GPIOCEN; //przycisk na porcie c<br />GPIOC-&gt;MODER&amp;=~(GPIO_MODER_MODER13_0|GPIO_MODER_MODER13_1);<br />GPIOC-&gt;OSPEEDR|=GPIO_OSPEEDER_OSPEEDR13_0;<br /><br />SCB-&gt;CPACR |= ((3UL &lt;&lt; 10*2)|(3UL &lt;&lt; 11*2)); //koprocesor<br /><br />RCC-&gt;APB1ENR|= RCC_APB1ENR_PWREN;<br />RCC-&gt;CSR |= RCC_CSR_LSION;<br />while( ! (RCC-&gt;CSR &amp; RCC_CSR_LSION) );<br />RCC-&gt;BDCR |= RCC_BDCR_RTCSEL_1 | RCC_BDCR_RTCEN;<br />PWR-&gt;CR|=PWR_CR_DBP;<br /><br /><br />if (RCC-&gt;CSR &amp; RCC_CSR_WDGRSTF) // sprzwdz czy wystapil reset<br />{<br />RCC-&gt;CSR|=RCC_CSR_RMVF;<br />sprawdz_reset=RTC-&gt;BKP0R;<br />flaga_reset=1;<br />}<br />//if(flaga_reset==0)<br />//{<br />IWDG-&gt;KR = 0x5555; //ustawienia watchdoga<br />IWDG-&gt;PR = 4;<br />IWDG-&gt;RLR = 3;<br />IWDG-&gt;KR = 0xaaaa;<br />IWDG-&gt;KR = 0xcccc;<br />//}<br />flaga_reset=0;<br />SysTick_Config(1600000);<br /><br /><br />while(1)<br />{<br />if(status==10)<br />{<br />calka++;<br />status=0;<br />}<br />if(calka&gt;10)<br />{<br />calka=0.5;<br />}<br />przypisz_calke=(int32_t)calka;<br />RTC-&gt;BKP0R=przypisz_calke;<br /><br />if((GPIOC-&gt;IDR &amp; GPIO_IDR_IDR_13)==0) //wymus reset przyciskiem<br />while((GPIOC-&gt;IDR &amp; GPIO_IDR_IDR_13)==0); //czekaj na &quot;puszczenie&quot; przycisku<br /><br />IWDG-&gt;KR = 0xaaaa;<br />}<br />}<br /><br /><br />void SysTick_Handler(void)<br />{<br />status++;<br />}[/syntax]<br /><br />Program działa następujaco: Systick inkrementuje co jakis czas zmienną status, z kolej ta gdy osiągnie wartośc 10 - inkrementujemy wartość całki (chodzi tylko o przykład, nie o sam sens operacji). Do pinu PC13 mam podłączony przycisk i w momencie kiedy go naciskam, pętla główna zatrzymuje się na while(...); i w efekcie zadziała nam watchdog - czyli po prostu wymuszam reset procka. I teraz po resecie wartość RTC-&gt;BKP0R faktycznie jest przypisywana do &quot;sprawdz_reset&quot;, ale za chwile jest kasowana po ustawieniach watchdoga. Jeśli teraz dodam sobie w programie jakąś flagę (&quot;flaga_reset&quot;) i jeśli w momencie wystąpienia resetu przypisze watorść RTC-&gt;BKP0R do &quot;sprawdz_reset&quot;, przypisze inną wartość do &quot;flaga_reset&quot; niż zero (zakomentowany //if(flaga_reset==0) czyli pominę ustawienia watchdoga to zmienna &quot;sprawdz_reset&quot; ładnie przechowuje wartość RTC-&gt;BKP0R ale jednocześnie watchdog wtedy przestaje działać, bo pominąłem jego ustawienia (inicjalizacje?).<br /><br />Czy to możliwe, że ustawienie watchdoga powoduje wyzerowanie wartości zmiennych? Jak to obejsc?<br /><br />Edit:<br />Procesor to STM32F411RE i w RM nie znalazłem żadnych informacji o &quot;backup SRAM&quot;, chyba że nie umiem szukac.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9619">_damian</a> — 15 cze 2017, o 16:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[naimad90]]></name></author>
<updated>2017-06-15T11:29:33+01:00</updated>
<published>2017-06-15T11:29:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190715#p190715</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190715#p190715"/>
<title type="html"><![CDATA[Re: STM32- odzyskiwanie wartości zmiennych po resecie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190715#p190715"><![CDATA[
<div class="quotetitle">_damian napisał(a):</div><div class="quotecontent"><br />Gdy podglądam wartość &quot;zmiennej&quot; to samo rzutowanie przebiega poprawnie<br /></div><br />Trochę dziwne. Na pierwszy rzut oka przyczepiłbym się tego że rzutujesz zmienną typu float mogącą mieć wartość dużo większą od tego na co pozwala zapis w zmiennej 8-bitowej typu całkowitego. (od -128 do 128). Widzę że stosujesz rejestry RTC_BKPxR, najprawdopodobniej są one 32bitowe więc śmiało możesz rzutować zmienną całka na int32_t.<br /><br />Do tego nie wiem jakiego rzędu wartości przechowujesz w zmiennej całka ale przed rzutowaniem dla zachowania miejsc po przecinku przykładowo dwóch, wymnożył bym ją przez 100. A później przy odczycie z rejestru dzielił przez 100. Oczywiście wszędzie trzeba pamiętać o rzutowaniu.<br /><br />Z drugiej strony jaki masz mikrokontroler, dokładny model? Nie ma on fragmentu pamięci SRAM z podtrzymaniem bateryjnym do ogólnego wykorzystania? tak jak autor opisuje na stronie 169 w wcześniej wspomnianym poradniku. Było by to najprostsze rozwiązanie, stworzyłbyś zmienną typu float do całkowania w sekcji z podtrzymaniem bateryjnym i po sprawie.  <br /><br /><br />A co do WatchDoga to nie powinien on być tak ustawiony aby resetował tylko w naprawdę krytycznych momentach? Czy próbujesz go jakoś niestandardowo użyć?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1629">naimad90</a> — 15 cze 2017, o 11:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[_damian]]></name></author>
<updated>2017-06-15T02:05:42+01:00</updated>
<published>2017-06-15T02:05:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190704#p190704</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190704#p190704"/>
<title type="html"><![CDATA[Re: STM32- odzyskiwanie wartości zmiennych po resecie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190704#p190704"><![CDATA[
Dzięki wielkie. Jest to jakieś rozwiązanie, ale pojawił się z tym związany problem. Otóż jeśli próbuje zapisać jeden z rejsetrów np. 0 w następujacy sposób:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">RTC-&gt;BKP0R=11;</div><br />działa to poprawnie.<br />Poprawnie tez działa jeśli zrobię tak:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">int8_t zmienna=11;<br />RTC-&gt;BKP0R=zmienna;</div><br />Natomiast jeśli mam zmienną typu float przechowującą wartość np. całki, nazwijmy ją &quot;calka&quot;, która jest zmieniana (obliczana) w każdym obiegu pętli (dla uproszczenia), to taki zapis:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">int8_t zmienna=(int8_t)calka;<br />RTC-&gt;BKP0R=zmienna;<br /></div><br />a następnie odczyt RTC-&gt;BKP0R po resecie daje zawsze 0. Gdy podglądam wartość &quot;zmiennej&quot; to samo rzutowanie przebiega poprawnie. <br />Już nie wiem co jest nie tak, więc może ktoś wie co to może być za problem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9619">_damian</a> — 15 cze 2017, o 02:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[naimad90]]></name></author>
<updated>2017-06-14T19:28:48+01:00</updated>
<published>2017-06-14T19:28:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190690#p190690</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190690#p190690"/>
<title type="html"><![CDATA[Re: STM32- odzyskiwanie wartości zmiennych po resecie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190690#p190690"><![CDATA[
Niektóre STMy posiadają rejestry typu backup, które możesz zasilać bateryjne. Nie są one zerowane przy resecie.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Autor poradnika spod tego linku: <a href="http://www.elektroda.pl/rtvforum/topic3111562.html"  class="postlink">http://www.elektroda.pl/rtvforum/topic3111562.html</a><br />wspomina o tej możliwości na stronie 160<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1629">naimad90</a> — 14 cze 2017, o 19:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[_damian]]></name></author>
<updated>2017-06-14T19:03:22+01:00</updated>
<published>2017-06-14T19:03:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190687#p190687</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190687#p190687"/>
<title type="html"><![CDATA[STM32- odzyskiwanie wartości zmiennych po resecie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18619&amp;p=190687#p190687"><![CDATA[
Witam. <br />Czy istnieje jakaś możliwość przypisania wartości zmiennych ze stanu przed resetem mikroprocesora. Chodzi o to, że mam w programie kilka całek, w momencie kiedy nastąpi restart mikroprocesora poprzez watchdoga (IWDG) program automatycznie inicjalizuje je wartościami zerowymi (zmienne globalne), więc gubię już wyliczone wartości. Czy można napisać coś w rodzaju procedury resetu, która odpalałaby się po resecie i w niej przypisać tą wartość przed resetem zamiast inicjalizować je zerem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9619">_damian</a> — 14 cze 2017, o 19:03</p><hr />
]]></content>
</entry>
</feed>