STM32L4 HAL USART problem

Miroslav Mraz mrazik na volny.cz
Středa Červenec 24 14:55:03 CEST 2019


Těžko říct, zapisuji přímo do registrů, protože mi to připadá, že to dá 
méně práce. Ale u řady L4 mám tuto poznámku

   // disable the receive overrun detection (dělá to jen problémy)
   port->CR3.B.OVRDIS = 1u;

a samozřejmě si už nepamatuji proč. Zřejmě tam tedy nějaký problém byl a 
z lenosti jsem jej pouze ignoroval. Zkuste to také, je horko na 
přemýšlení, jdu se koupat.

Mrazík

Dne 24. 07. 19 v 9:41 Jaroslav Buchta napsal(a):
> Zdravim,
> 
> vyskytuje se mi takovy problem, kdy procesor prestane prijimat data - 
> stane se to az po par dnech takze je to opravdu chutovka testovat.
> 
> V ISR je pak nastaven mj. bit ORE a RXNE,nevidim duvod, proc by nemelo 
> dojit k preruseni. . Dalsi zahadou je, ze kdyz umele vlozim prodlevu, 
> tak to nekdy vyhodi chybu ORE, ale vzpamatuje se to z toho. Chybovy kod 
> v callback funkci ale neni nastaven a kdyz se snazim pochopit obsluhu v 
> HAL, tak se zatim moc nechytam. A pokud vlozim prodlevu hned po prvnim 
> znaku, tak se z toho obsluha ani nevzpamatuje a stale to chodi do 
> ErrorCallback funkce, ovsem s kodem 0. (To ale muze byt zpusobeno 
> dlouhou obsluhou teto udalosti)
> 
> Nesetkal se s tim nekdo? Vzhledem k nizke priorite preruseni je asi 
> mozne, ze k nejakemu preteceni nekdy dojde, to by ale snad nemelo vadit.
> 
> Mam takovy dojem, za HAL knihovna zacina byt nejak moc prekomplikovana a 
> neni uplne dokonala,zbyde mi neco jineho, nez jit do LL? :(
> 
> Pro ilustraci obsluha:
> 
> 
> static UART_HandleTypeDef *phandle;
> 
> static uint8_t rxChar;
> static uint8_t txPcs;
> 
> static void * mbslave_context = NULL;
> 
> #define LOCK()   EnterCritical();
> #define UNLOCK() ExitCritical();
> 
> void mbslavedrv_Init(UART_HandleTypeDef *ph)
> {
>      phandle = ph;
>      txPcs = false;
>      mbslave_context = mbslave_Init(0x01);
>      if (mbslave_context == NULL)
>      {
>          Error_Handler();
>      }
>      HAL_UART_Receive_IT(phandle, &rxChar, 1);
> }
> 
> void mbslavedrv_MBService()
> {
>      if (txPcs) return;
>      uint8_t *pdata;
>      int n = mbslave_Service(mbslave_context, &pdata);
>      if (n != 0)
>      {
>          txPcs = 1;
>          if (HAL_UART_Transmit_DMA(phandle, pdata, n) != HAL_OK)
>          {
>              txPcs = 0;
>          }
>      }
> }
> 
> 
> 
> void mbslavedrv_TxCplt()
> {
>      txPcs = 0;
> }
> 
> uint32_t nU2Chars = 0;
> #ifdef TESTMODE
> uint8_t testdelay;
> #endif
> 
> void mbslavedrv_RxCplt()
> {
>      LOCK();
>      // State machine processing
>      mbslave_ParseChar(mbslave_context, rxChar);
>      nU2Chars++;
>      UNLOCK();
> #ifdef TESTMODE
>      if (testdelay)
>      {
>          testdelay = 0;
>          static volatile int i;
>          for (i=0; i<10000; i++);
>      }
> #endif
>      HAL_UART_Receive_IT(phandle, &rxChar, 1);
> 
> }
> 
> 
> void mbslavedrv_ErrCb()
> {
>      TERMLOG_E("MBS", "USART ISR: %08X Error: %08X", 
> phandle->Instance->ISR, phandle->ErrorCode);
> }
> 
> _______________________________________________
> 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