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