PC機(jī)串口定義如下圖:

一般的單片機(jī)串口應(yīng)用只需3根信號線:3腳TXD(發(fā)送數(shù)據(jù))、2腳RXD(接收數(shù)據(jù))、5腳SG(信號地)。其中單片機(jī)的TXD對應(yīng)連接PC機(jī)的RXD,單片機(jī)RXD連接PC的TXD。即兩者是交叉連接。需要注意的是如果單片機(jī)部分串口接收電路已經(jīng)將兩者交換,則連接使用直通線即可。否則需要使用交叉線連接(如萬利的板子)。通常兩頭都是“母”的串口線是RXD與TXD是交叉連接的。如使用直通線注意在MAX232等電平轉(zhuǎn)換電路中將TX與RX交叉連接。
使用上面的三線連接,注意在超級終端里將COMx口的“數(shù)據(jù)流控制”設(shè)為“無”。即使你不使用超級終端調(diào)試,也要注意,錯誤的設(shè)置將導(dǎo)致PC機(jī)出現(xiàn)只能接收而不能發(fā)送數(shù)據(jù)的現(xiàn)象。
串口使用-3V~-25V的負(fù)邏輯電平表示“1”, 3V~ 25V表示邏輯“0”。調(diào)試時通過示波器捕捉串口波形是個比較好的方法。(為了捕捉數(shù)字信號,對于大多數(shù)示波器設(shè)置觸發(fā)類型為脈沖)

USART數(shù)據(jù)傳輸由低位向高位傳。串口電平轉(zhuǎn)換電路串口電平轉(zhuǎn)換為標(biāo)準(zhǔn)TTL(或LVTTL)電平。如下圖:

當(dāng)發(fā)送器激活,并且沒有數(shù)據(jù)發(fā)送時,TX引腳處于高電平;當(dāng)發(fā)送器禁止時,TX恢復(fù)它的I/O端口配置。一個完整的幀包括:起始位、數(shù)據(jù)位(8或9位)、停止位(1或2位)。兩個特殊的幀:完全由“1”組成的數(shù)據(jù)幀幀稱為空閑字符幀;完全由“0”組成的幀稱為斷開字符幀。
在STM32處理器中,將發(fā)送數(shù)據(jù)寫入USART_DR寄存器,此動作清除TXE(發(fā)送允許位)。軟件讀RXNE位完成對RXNE(接收寄存器非空位)清零。RXNE必須在下一個字符接收結(jié)束前清零。
USART的所有中斷事件被連接到一個中斷向量中,也就是說需要在中斷例程中判別各種可能出現(xiàn)的情況。
數(shù)據(jù)寄存器實際上由兩個寄存器組成,一個給發(fā)送用(TDR只寫),一個給接收用(RDR只讀)。和AVR的類似,兩個寄存器合并成一個UDR寄存器
采用中斷方式進(jìn)行串口通信
通過對CodeVersion AVR上的串口通信程序的移植,在STM32上實現(xiàn)了串口數(shù)據(jù)收發(fā)的中斷通信。收發(fā)各自使用兩個循環(huán)隊列實現(xiàn)文件緩沖,從而提高了執(zhí)行效率。
隊列:一種先進(jìn)先出(FIFO:First In First Out)的策略。
在向USART寫數(shù)據(jù)時,先檢測接收數(shù)據(jù)寄存器是否“滿” ,如有數(shù)據(jù)則寫入隊列中。當(dāng)每發(fā)送完一幀數(shù)據(jù)后進(jìn)入中斷程序,檢測隊列中是否有數(shù)據(jù),如有數(shù)據(jù)則發(fā)送,否則退出。USART數(shù)據(jù)時的情況類似。需要注意的是在USART_putchar() 和USART_getchar() 函數(shù)對緩沖區(qū)隊列指針操作時需要禁止中斷。
Tips:在串口通訊中調(diào)用函數(shù)USART_GetITStatus(USART1, USART_IT_TC)檢測接收是否完成,函數(shù)USART_ClearFlag(USART1,USART_FLAG_TC)清除完成中斷標(biāo)志位,它們操作的都是同一寄存器位USART_CR->TC(狀態(tài)寄存器中的完成標(biāo)志位)。在其它中斷中的USRAT_FLAG_xx(標(biāo)志位)和USART_TI_xx(中斷標(biāo)志位)都表示同一個位。只是為了強(qiáng)調(diào)其在特定函數(shù)中的作用,而采用不同表述方式。但USART_ITConfig(USART1, USART_IT_TC, DISABLE)函數(shù)中的USART_IT_TC位則是相應(yīng)的中斷允許位,實際是對寄存器USART_CR1->TCIE位操作。
采用DMA方式進(jìn)行串口通信
STM32串口通信模塊支持使用DMA方式進(jìn)行數(shù)據(jù)傳輸,以下代碼實現(xiàn)了數(shù)據(jù)DMA發(fā)送方式。當(dāng)發(fā)送完畢產(chǎn)生中斷。
程序首先在SRAM中開辟大小為BufferSize的緩沖區(qū)SRC_Char_Buffer[],在main()函數(shù)中對其進(jìn)行初始化。DMA初始化后SRC_Char_Buffer為源地址,USART1_DR_Base(USART1數(shù)據(jù)寄存器)為目的地址。通過USART_DMACmd()函數(shù)設(shè)置USART_CR3中的DMAT(允許DMA發(fā)送位)。執(zhí)行DMA_Cmd()函數(shù)后使能DMA通道4傳輸,開始向串口數(shù)據(jù)寄存器發(fā)送數(shù)據(jù)。每發(fā)送一個字節(jié)源地址自動加1,總共發(fā)送BufferSize個字節(jié)。這一過程由DMA控制器完成,無須CPU參與。發(fā)送完成后進(jìn)入中斷,中斷服務(wù)程序CurrDataCounter的值并通過軟件設(shè)置清除通道全局標(biāo)志(同時發(fā)送完成標(biāo)志TC自動得到清除)。主程序通過判斷CurrDataCounter的值是否為零,決定DMA傳輸是否結(jié)束。為“0”則表示成功,打印相應(yīng)信息。在實際使用中,CPU可以在數(shù)據(jù)發(fā)送同時執(zhí)行其它操作。
|