STM32L4 HAL USART problem

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Středa Červenec 24 09:41:04 CEST 2019


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);
}



Další informace o konferenci Hw-list