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