1、引言
UART 是個(gè)常用的通訊接口,平時(shí)處于高電平狀態(tài)。UART_RX 在接收數(shù)據(jù)時(shí)起始位會(huì)拉低電平這個(gè)動(dòng)作。用戶想知道是否可以利用 I/O 口內(nèi)部的連接來(lái)使能 EXTI,通過(guò)外部中斷來(lái)發(fā)現(xiàn)這個(gè)動(dòng)作,這是本文要探討的內(nèi)容。
2、問(wèn)題
客戶在開(kāi)發(fā)其產(chǎn)品過(guò)程中,使用了 STM32F401RCT6。產(chǎn)品需要執(zhí)行以下操作:主機(jī)發(fā)來(lái)命令→采集數(shù)據(jù)→數(shù)據(jù)處理→回傳結(jié)果。但是由于數(shù)據(jù)處理過(guò)程中的算法復(fù)雜,執(zhí)行時(shí)間較長(zhǎng),導(dǎo)致無(wú)法在限定的時(shí)間內(nèi)回傳結(jié)果。經(jīng)過(guò)一系列優(yōu)化后仍然還差一點(diǎn)點(diǎn),所以客戶希望在主機(jī)通過(guò) UART 發(fā)來(lái)的命令的起始位時(shí),就開(kāi)啟數(shù)據(jù)采集,而不必等待接收完成。這就要求了系統(tǒng)必須要在 UART_RX 收到的數(shù)據(jù)起始位就能夠得到通知,也就是必須在起始位就有個(gè)中斷。但是 STM32F4 中的 UART 外設(shè)并沒(méi)有提供在接收數(shù)據(jù)的起始位產(chǎn)生中斷的功能,而是接收完一個(gè)數(shù)據(jù)幀才能產(chǎn)生相應(yīng)通信中斷。
客戶最初也考慮到了如果將 UART_RX 從外部連接到另一個(gè) I/O 口,然后配置這個(gè) I/O口為下降沿外部中斷的輸入口,當(dāng) UART_RX 接收到數(shù)據(jù)的時(shí)候,起始位就會(huì)在這個(gè) I/O口上產(chǎn)生外部中斷。但是,因?yàn)橹皼](méi)有這么考慮過(guò),硬件上沒(méi)有預(yù)留,所以不好處理。想了解是否有更好的辦法解決這個(gè)問(wèn)題。
3、問(wèn)題解決
通過(guò)測(cè)試發(fā)現(xiàn),確實(shí)是可以在 PA3 作為 UART_RX 的時(shí)候使能其 EXTI 中斷功能,當(dāng)UART_RX 收到數(shù)據(jù)的時(shí)候,在數(shù)據(jù)起始位的下降沿就能產(chǎn)生一次 EXTI 中斷,這樣,用戶從 EXTI 中斷便可得知 UART_RX 已經(jīng)開(kāi)始接收數(shù)據(jù),以并行執(zhí)行其他準(zhǔn)備任務(wù)。所以,我們的思路是正確且可行的。需要做的事情主要就是在 USART 的初始化之后,手動(dòng)對(duì) UART_RX 引腳所對(duì)應(yīng)的 I/O 口使能其 EXTI 功能并打開(kāi)中斷。
4、小結(jié)
這個(gè)例子中,使用了 I/O 口作為復(fù)用引腳時(shí),其 I/O 引腳仍然還是連接到內(nèi)部其他電路的,包括連接到輸入數(shù)據(jù)寄存器,連接到 EXTI 電路。所以,我們可以利用這種連接來(lái)幫助我們實(shí)現(xiàn)一些特殊的功能。
很多時(shí)候,有些問(wèn)題可以通過(guò) STM32 內(nèi)部的一些連接來(lái)實(shí)現(xiàn)一些特殊的使用情況。STM32 在內(nèi)部其實(shí)是提供很多內(nèi)聯(lián)的信號(hào),特別是 TIM 外設(shè)、ADC 外設(shè)、DMA 外設(shè)等等。所以,在實(shí)際使用中,多動(dòng)動(dòng)腦筋,說(shuō)不定就能找到一個(gè)簡(jiǎn)單的解決方案。