Kokemukseni mukaan UART RX: n tai TX: n toteuttamisen välillä ei ole juurikaan eroa.
UART on vaikeimmin toteutettava protokolla bittihakemisen kautta, koska se on erittäin aikaherkkä.
SPI ja I2C sallivat kellon venyttämisen, mutta UART: ssa jokainen bitti on lähetettävä tai luettava tarkkaan aikaan korruption välttämiseksi.
Keskeytykset, putkilinjojen pysähtyminen ja välimuistihäiriöt saattavat vääristää ajoitustasi ja aiheuttaa korruptiota.
Luotettavin tapa toteuttaa UART bittihakemisen avulla on poistaa keskeytykset käytöstä ja istua tiukassa silmukassa.
TX: lle silmukka kysyy joitain tarkkoja ajastimia, kuten DWT_CYCCNT, ja vaihtaa sitten GPIOa vaadittavina aikoina.
RX: lle silmukka tekee saman, paitsi että se lukee GPIO: n vaadittavina aikoina.
TX: llä on tässä tapauksessa yksi etu: se voi ottaa keskeytykset uudelleen käyttöön tavujen välillä, mutta RX: n on pysyttävä lukusilmukassa ikuisesti.
Mutta keskeytettyjen pitäminen vammaisina niin kauan on erittäin huono idea.
Järjestelmäsi ei voi tehdä muuta kuin lukea / kirjoittaa UART: ia.
Voit yrittää suorittaa RX / TX-silmukan keskeytysten ollessa käytössä, ja silloin tällöin tapahtuu keskeytys, mikä johtaa vioittuneeseen tavuun.
Lähetettäessä saatat havaita niin huonoja tapauksia (mittaamalla aikaa, joka kului koko tavun lähettämiseen).
Jos kyseinen aika ylittää odotetun ajan, tiedät, että keskeytit ja voit sitten lähettää koko paketin uudelleen.
Suunnittele protokolla vioittumisen havaitsemiseksi.
Verkossa näen esimerkkejä, jotka toteuttavat UART: n keskeytysten kautta. TX: ssä he käyttävät ajastimen keskeytystä ja kirjoittavat bittiä ISR: stä.
RX: lle ne mahdollistavat reunan tunnistuksen keskeytyksen ja tallentavat ajan ISR: ään.
Mutta tämä lähestymistapa voi epäonnistua niin monella tavalla: muut keskeytykset tapahtuvat, koodin suorittaminen keskeytettyjen ollessa poissa käytöstä jne.
Mutta kaikkea yllä olevaa ei tarvita, koska käytät STM32: tä.
STM32: ssä voit käyttää ajastimia yhdessä DMA: n kanssa UART: n simuloimiseksi.
Esimerkiksi:
"Emuloidun UART: n käyttöönotto STM32F4-mikrokontrollereissa"
https://www.st.com/content/ccc/resource/technical/document/application_note/1d/61/52/64/ea/ee/42/4e/DM00110292.pdf/files/DM00110292.pdf/jcr:content/translations/en.DM00110292.pdf
Täällä he käyttävät ajastinta ajamaan DMA: ta lähettämään / vastaanottamaan bittiä tarkkoina ajankohtina.
On toinenkin tapa: määritä ajastintallennus / vertaa kanavia ja liitä DMA.
RX: ajastin tallentaa tarkat ajanhetket, kun tulosignaali vaihdettiin, ja DMA tallentaa nämä aika-arvot puskuriin.
TX: DMA lukee aika-arvot puskurista ja ajastin vaihtaa lähtöä näinä hetkinä.
Henkilökohtaisesti en kokeillut tätä viimeisintä lähestymistapaa, mutta tein jotain vastaavaa, joten myös tämän pitäisi toimia.