STM32F051 FLASH_ErasePage problem.

nesvacil@posys.cz nesvacil na posys.eu
Sobota Říjen 5 08:11:42 CEST 2013


Otázka zní, co se stane, pokud Vám přijde přerušení těsně před instrukcí __WFI();  Dle mého soudu si to vklidu uspíte. Ta instrukce se mi tam vůbec nelíbí.
Jirka

...
   while (1) {
//Zde prijde preruseni ?
  __WFI();
if (!gblUsart.flag) continue;
...





Dne 4. 10. 2013 19:43, Miroslav Mraz napsal(a):
> Vidím, že se nad tím dokonce někdo i zamyslel (a našel si tu druhou část
> kódu). Děkuji a chválím.
> Nicméně i zde problém není, ta proměnná gblUsart.flag se nastavuje v
> rutině usartRxProcess(znak), pokud znak je ten správný. Ono je to
> vysekané z projektu, který se už trochu rozrostl, takže je poměrně
> nepřehledný. Jestli se v tom chce někdo hlouběji vrtat, můžu vystavit
> někde celé.
>
> Mrazík
>
> nesvacil na posys.cz píše v Pá 04. 10. 2013 v 19:07 +0200:
>> Kde mate v preruseni nastaveni toho gblUsart.flag ? Dle toho popisu soudim, ze to cpu jen uspite neustale dokola.
>>
>> ...
>>    while (1) {
>> __WFI();
>> if (!gblUsart.flag) continue;
>> ...
>>
>>
>>
>> Jirka
>>    Dne 4. 10. 2013 16:30, Miroslav Mraz napsal(a):
>>> Ku podivu to nekončí hwfault. Končí to v přerušení od usartu - jakoby se nesmazal nějaký flag. Ale je mi divné, že samostatně ten usart chodí v pohodě, stejně tak i to mazání stránky. Jen když se to potká obojí najednou. Spíš je nějak blbě ta
>>> obsluha přerušení usartu. Možná jsem si to moc zjednodušil.
>>>
>>> void USART1_IRQHandler (void) {
>>>    register uint32_t status;
>>>    uint8_t rdata, tdata;
>>>
>>>    status = USART1->ISR;
>>>    if (status & USART_FLAG_TXE) {
>>>      if (usartReadBuf (&gblUsart.tx, &tdata)) {
>>>        USART1->TDR = (uint32_t) tdata & 0xFF;
>>>      }
>>>      else {
>>>        USART1->CR1 &= ~USART_FLAG_TXE;
>>>      }
>>>    }
>>>    if (status & USART_FLAG_RXNE) {
>>>      rdata = (USART1->RDR) & 0xFF;
>>>      usartRxProcess (rdata);
>>>    }
>>> }
>>>
>>> FLASH_Status FLASH_WaitForLastOperation() je voláno uvnitř toho ErasePage(), hned na začátku. Tam bych problém neviděl, jak jsem psal, samostatně to proběhne korektně. Ono to korektně proběhne i když je ErasePage() voláno uvnitř přerušení od
>>> přijímače usartu.
>>>
>>> Mrazík
>>>
>>> On 10/04/2013 03:59 PM, nesvacil na posys.cz wrote:
>>>> Zkusil jste zachytit hwfault ?
>>>> Dival jste se na FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) tj. treba pockat nez je FLASH pripravena ?
>>>> Jirka
>>>>
>>> _______________________________________________
>>> HW-list mailing list  -  sponsored by www.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list