2015-06-10 30 views
5

Sto provando a comunicare con la periferica UART utilizzando DMA sia per RX che per TX. Sto usando la libreria HAL fornita da ST (Generato con STCubeMX).STM32F4 Gestione errore periferico durante il trasferimento DMA (RX)

Sto gestendo un canale UART con 1.5MBaud - quindi per non perdere dati, ho configurato il DMA in modalità diretta, con buffer circolare e gestito le interruzioni di mezzo trasferimento per occuparmi dei dati e mantieni il DMA online per altri dati a venire.

Il problema è che a volte riesco a vedere nel registro di stato della UART che il bit di errore del frame è attivo e talvolta anche il flag di errore di sovraccarico è attivo.

Posso gestire i byte persi (utilizzando crc sui pacchetti strutturati), ma il problema è che la periferica smette di ricevere dati, ma il DMA non genera errori o interrompe il trasferimento.

Quindi se provo a ricevere i dati e la bandiera è bloccata sul sistema.

Ho visto che l'HAL fornisce una funzione __ debole che dovrebbe gestire UART_Error, ma non viene mai chiamata - e lo stato nell'handle HAL rimane normale. solo uno sguardo al registro può dire che c'è un problema.

Come devo rilevare/gestire questo tipo di errori?

Grazie

risposta

2

Non faccio uso di l'HAL per motivi di prestazioni, in quanto è molto goffo e - imo anche non fornisce molto di astrazione per giustificare che. Gestire direttamente l'hardware non è molto più complicato; ancora di più come devi ancora capire molto bene cosa succede. E come hai già rilevato, l'HAL supporta solo un determinato approccio; una volta che segui le tue tracce, sei perso.

A quanto pare, si verificano problemi simili quando viene impostato il flag di overflow. Dopo tale errore, è necessario risincronizzare il ricevitore con il trasmettitore per volta dopo un errore in generale. Ciò richiederebbe la segnalazione fuori banda usando un simbolo o una condizione di linea che non si verifica all'interno di un pacchetto. Gli errori di framing sono un buon indicatore, ci sono problemi di sincronizzazione all'inizio di un simbolo (start-bit) correttamente.

Se la linea è pulita (non problemi EMC), non devono verificarsi errori di framing o danneggiamento dei dati (a meno che i parametri di temporizzazione non corrispondano).

Se si utilizza un semplice ping-pong, potrebbe essere sufficiente un timeout. Tuttavia, la soluzione corretta dipende dal protocollo. Una buona progettazione del protocollo tiene conto degli errori di trasmissione e degli overflow.

Nota che è necessario abilitare gli interrupt di ricezione in aggiunta ai trasferimenti DMA per essere informati. Tuttavia, se si utilizza un timeout (e un protocollo ping-pong), è possibile cancellare i flag, poiché i dati apparentemente non arrivano in tempo. Se effettivamente si utilizzano gli interrupt di errore, sii consapevole anche delle condizioni di gara.