學(xué)得越快越好

1、UART串口簡介

在單片機應(yīng)用開發(fā)中,串口可以說是最常用的外設(shè)之一。

串口最重要的功能是允許單片機和外部設(shè)備之間的數(shù)據(jù)交互。例如,在學(xué)習(xí)Microsoft Microelectronics的cortex m0時,您可以將開發(fā)板連接到計算機上,通過串行調(diào)試助手調(diào)試程序,并觀察程序運行結(jié)果。還有許多其他串行端口模塊,如藍牙、NBIOT、GPRS、4G等。使用串行端口驅(qū)動,因此熟悉串行端口是嵌入式工程師必備的技術(shù)。

接下來,我們將了解如何在ME32F030上驅(qū)動串行端口。

在正式學(xué)習(xí)之前,我們先了解一下UART串口的通信格式。UART的全稱是通用異步收發(fā)器(UNIVERSAL ASYNCHONOUS RECEIVER/TRANSMITTER)。串行傳輸數(shù)據(jù)以字節(jié)為單位傳輸,因此通信速度較慢。但是有線路簡單、通信距離遠的優(yōu)點,因此可以使用兩條線進行雙向通信。一個用于傳輸,另一個用于接收。因此被廣泛應(yīng)用于工業(yè)應(yīng)用。通信形式也非常簡單,如下圖所示。

圖1 UART數(shù)據(jù)格式

空閑位:數(shù)據(jù)線空閑時保持高電平,表示沒有數(shù)據(jù)傳輸。

開始位:傳輸數(shù)據(jù)時,數(shù)據(jù)線向下拉,表示數(shù)據(jù)傳輸開始。

數(shù)據(jù)位:數(shù)據(jù)位是實際傳輸?shù)臄?shù)據(jù),通常以字節(jié)為單位傳輸數(shù)據(jù)。也就是說,一次傳輸8位數(shù)據(jù)。一般來說,低的在前面,高的在后面。當(dāng)然也有相反的傳輸協(xié)議,但平時很少見面。

奇偶位:數(shù)據(jù)的“1”位數(shù)的奇偶校驗,可以根據(jù)需要進行選擇。

停止位:數(shù)據(jù)傳輸完成標(biāo)志位。停止位位數(shù)可以選擇1位、1.5位或2位高級別,通常選擇1位停止位。

傳輸速率:傳輸速率選擇UART數(shù)據(jù)傳輸速率,即每秒傳輸?shù)臄?shù)據(jù)比特數(shù),通常為9600、19200、115200等。

隨著計算機的日益升級,現(xiàn)有的沒有COM端口的計算機很多,USB接口被廣泛使用。所以通過USB-串行芯片解決了這個問題。常用的U串行芯片有CH340、PL2303等。通過該芯片,可以實現(xiàn)串口TTL-USB。

ME32F030開發(fā)主板使用PL2303芯片完成串行端口與計算機之間的連接。只需要一根USB電纜。使用前要注意兩件事。首先,請先下載并安裝PL2303的驅(qū)動程序。第二,確保開發(fā)主板上的USB跳線帽連接到COM、USB端。正確的連接方法如下:

圖2跳線連接

2、UART驅(qū)動寄存器

ME32F030提供了兩種UART外圍設(shè)備:UART 0、UART 1。串行接口全部支持紅外傳輸(IrDA)協(xié)議功能。時鐘全部由SYSAHBCLKCTRL寄存器控制。同時,每個UART都有單獨的時鐘分割器,產(chǎn)生傳輸速率,不受系統(tǒng)時鐘和PCLK的影響。對應(yīng)于UART的針腳映射如下:

圖3 UART引腳映射

讀取引腳的映射后,列出與UART相關(guān)的寄存器組,然后逐一說明。

圖4 UART寄存器

2-1 UART接收/發(fā)送緩沖寄存器

發(fā)送UART接收/發(fā)送緩沖區(qū)

存器包含著 UART 接收到/將發(fā)送的字節(jié),接收到的數(shù)據(jù)和待發(fā)送的串口數(shù)據(jù)都在該寄存器中。

2-2 UART狀態(tài)寄存器

該寄存器用于提供 UART 接收發(fā)送緩存器的狀態(tài)。大致可以歸類為以下幾種狀態(tài):

發(fā)送狀態(tài):發(fā)送FIFO空、發(fā)送FIFO半滿、發(fā)送FIFO滿。

接收狀態(tài):接收FIFO空、接收FIFO半滿、接收FIFO滿。

奇偶校驗狀態(tài):沒有奇偶校驗錯誤,或檢測到奇偶錯誤,寫1來清除錯誤標(biāo)志。

接收緩存器溢出狀態(tài) :用來表明緩存器是否溢出。

2-3 UART控制寄存器

接下來就要著重講解下UART控制寄存器了。0-5位屬于基本的接收、發(fā)送中斷使位,這里不再累述。

BIT6:奇偶校驗中斷使能,使能該中斷后,當(dāng)接收到的數(shù)據(jù)發(fā)生奇偶校驗錯誤后,會產(chǎn)生中斷通知串口接收發(fā)生錯誤。

BIT7:接收溢出中斷使能,使能該中斷后,當(dāng)接收到的數(shù)據(jù)超出FIFO容量就會產(chǎn)生中斷。通知及時取出數(shù)據(jù)或者清空FIFO。

BIT8:奇偶校驗方式選擇位,0為偶校驗,1為奇校驗。這里注意,這只是選擇了奇偶校驗的方式,但是并不會生效,是否啟動校驗還需要下面介紹的寄存器。

BIT9:奇偶校驗使能位,只有當(dāng)該位置1才會使能奇偶校驗,具體的校驗方式由剛才介紹的奇偶校驗方式選擇位來決定。

BIT10:IRDA傳輸協(xié)議使能位,置1使能。

BIT22:RX接收使能,置1使能。

BIT23:TX發(fā)送使能,置1使能。


圖5 UART控制寄存器


2-4 UART中斷狀態(tài)寄存器

既然剛才在介紹UART控制寄存器的時候,介紹了不少中斷使能控制。肯定就會有相應(yīng)的中斷狀態(tài)的管理。UART中斷狀態(tài)寄存器從低位開始依次管理著:①、發(fā)送結(jié)束中斷狀態(tài),②、接收完成中斷狀態(tài),③、發(fā)送FIFO滿中斷,④、接收FIFO滿中斷,⑤、發(fā)送FIFO半滿中斷,⑥、接收FIFO半滿中斷,⑦、奇偶校驗錯誤中斷,⑧、接收溢出中斷。


2-5 UART 波特率分頻器寄存器

UART 波特率分頻器寄存器 (BAUDDIV) 用于時鐘分頻從而產(chǎn)生相應(yīng)的波特率。該寄存器可讀寫。該分頻器的時鐘源是由UARTnCLKDIV 控制 UART 的波特率源時鐘(SCLK)。


圖6 UART 波特率分頻器寄存器


波特率分頻值計算公式:

BAUDDIV = SCLK / UART BAUDRATE

2-6 UART TX/RX FIFO 數(shù)據(jù)清除寄存器

操作該寄存器可以快速對TX/RX FIFO進行數(shù)據(jù)清空。


圖7 UART TX/RX FIFO 數(shù)據(jù)清除寄存器


3、UART驅(qū)動函數(shù)

在例程LIB->common->Drivers->Source文件夾內(nèi)有uart.c文件,這個就是提供的UART驅(qū)動文件,里面包含了一些基本的驅(qū)動函數(shù),使用起來十分方便。下面會對每個函數(shù)進行講解。

3-1 UART初始化

在每段源代碼的后面,筆者對其進行一下注釋,方便大家快速掌握和使用這個函數(shù)。這個函數(shù)的4個參數(shù)的意義如下:

uart:要使能的UART模塊,可選UART0、UART1。

baudrate:要設(shè)置的串口的波特率。

parityoption:奇偶校驗位,可選UART_EVEN_PARITY(奇校驗)、 UART_ODD_PARITY(偶校驗)、 UART_RX_NO_INT(無校驗)。

rxinttriggerlevel:接收中斷觸發(fā)條件。

void UART_Open(UART0_Type *uart, uint32_t baudrate, uint8_t parityoption, uint8_t rxinttriggerlevel) { uint32_t volatile delays;?? if (uart==UART0) { //初始化時關(guān)閉UART0 IRQ NVIC_DisableIRQ(UART0_IRQn); //使能 UART0 時鐘 SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=1; //enable UART0 PCLK SYSCON->UART0CLKDIV_b.DIV = 0x1; ?????/* divided by 1 */ //復(fù)位 UART0 SYSCON->PRESETCTRL_b.UART0_RST_N=0; SYSCON->PRESETCTRL_b.UART0_RST_N=1; } else if (uart==UART1) { //初始化時關(guān)閉UART1 IRQ NVIC_DisableIRQ(UART1_IRQn); //使能 UART1 時鐘 SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=1; //enable UART1 PCLK SYSCON->UART1CLKDIV_b.DIV = 0x1; ?????/* divided by 1 */ //復(fù)位 UART1 SYSCON->PRESETCTRL_b.UART1_RST_N=0; SYSCON->PRESETCTRL_b.UART1_RST_N=1; } else return ; ??//設(shè)置波特率 ??uart->BAUDDIV_b.BAUDDIV = MainClock/baudrate; //設(shè)置奇偶校驗 if (parityoption==UART_ODD_PARITY) uart->CTRL_b.PARISEL=1; if (parityoption!=UART_NO_PARITY) uart->CTRL_b.PARIEN=1; //設(shè)置中斷觸發(fā)條件 if (rxinttriggerlevel==UART_RX_NOT_EMPTY) uart->CTRL_b.RXNEIE=1; if (rxinttriggerlevel==UART_RX_HALF_FULL) uart->CTRL_b.RXHLFIE=1; if (rxinttriggerlevel==UART_RX_FULL) uart->CTRL_b.RXFIE=1; //使能發(fā)送和接收功能 ??uart->CTRL_b.TXEN=1; uart->CTRL_b.RXEN=1; //插入延時 SYS_DelaymS(1); //清空 FIFO uart->FIFOCLR=0xFF; ??return; }??

3-2 UART關(guān)閉

這段函數(shù)用來關(guān)閉UART0或者UART1,只需要傳入需要關(guān)閉的串口即可。

void UART_Close(UART0_Type *uart) { if (uart==UART0) { //關(guān)閉UART0_IRQ NVIC_DisableIRQ(UART0_IRQn); //關(guān)閉UART0時鐘 SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=0; }else if (uart==UART1) { //關(guān)閉UART1_IRQ NVIC_DisableIRQ(UART1_IRQn); //關(guān)閉UART1時鐘 SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=0; } else return ; //關(guān)閉相應(yīng)UART的中斷,并清除中斷標(biāo)志 UART_DisableInt(uart); UART_ClearIntFlag(uart); return; }


學(xué)習(xí)心得2


3-3 UART讀取單個字節(jié)

這段函數(shù)的作用是UART讀取單個字節(jié)的數(shù)據(jù)。

uint8_t UART_ByteRead(UART0_Type *uart, uint8_t *data) { if (uart->STATE_b.RXNE) { *data=uart->DATA; return 0; } else return 1; }

3-4 UART連續(xù)讀取多個字節(jié)

UART連續(xù)讀取串口數(shù)據(jù),直到讀取到指定長度的數(shù)據(jù)。

void UART_Read(UART0_Type *uart, uint8_t * rxbuf, uint8_t *readbytes) { uint8_t temp=0; //get all data while ((uart->STATE_b.RXNE)&&((*readbytes)--)) { *rxbuf++=uart->DATA; temp++; } //return number of read *readbytes=temp; return; }

3-5 UART發(fā)送單個字節(jié)

這段函數(shù)的作用是UART發(fā)送單個字節(jié)的數(shù)據(jù)。

?uint8_t UART_ByteWrite(UART0_Type *uart, uint8_t data) { if (uart->STATE_b.TXF) return 1; uart->DATA=data; return 0; }

3-6 UART連續(xù)發(fā)送多個字節(jié)

UART連續(xù)發(fā)送串口數(shù)據(jù),直到發(fā)送完指定長度的數(shù)據(jù)。

void UART_Send(UART0_Type *uart, uint8_t * txbuf, uint32_t sendbytes) { while (sendbytes--) { while (uart->STATE_b.TXF); uart->DATA=*txbuf++; } return; }

3-7 UART發(fā)送字符串

UART發(fā)送一段字符串?dāng)?shù)據(jù),只需要將要發(fā)送的字符串?dāng)?shù)據(jù)首地址傳入即可。

void UART_PutString (UART0_Type *uart, uint8_t * str) { while (!(* str=='\0')) { while (uart->STATE_b.TXF); uart->DATA=*str++; } return; }

3-8 UART使能中斷

有兩個參數(shù)項,第一個是選擇需要使能的UART,第二個選擇觸發(fā)中斷的條件。

void UART_EnableInt(UART0_Type *uart, uint32_t intcon) { uart->CTRL |= intcon; return; }

3-9 UART關(guān)閉中斷

調(diào)用該函數(shù)后,所有的串口的中斷觸發(fā)條件都將關(guān)閉。

void UART_DisableInt(UART0_Type *uart) { uart->CTRL &= 0xFFFFFF00; return; }


學(xué)習(xí)心得3


4、串口中斷例程

介紹完UART常用的驅(qū)動函數(shù),接下來用個小例程來演示下UART的驅(qū)動。測試程序的功能是:通過串口助手發(fā)送一個字節(jié)的數(shù)據(jù)到單片機,單片機收到該數(shù)據(jù)后,將該數(shù)據(jù)通過單片機的串口發(fā)送到串口助手。

程序設(shè)計思路

首先是對UART0端口的初始化,將IO口復(fù)用為串口UART0的TX、RX功能。

隨后將UART0初始化為波特率115200,無奇偶校驗,接收非空觸發(fā)中斷。

下一步就是使能UART0的中斷,中斷觸發(fā)條件為接收FIFO非空。

最后使能UART0_IRQn中斷服務(wù)子程序。

測試程序的代碼如下:

?int main(void) { //UART0 端口初始化 PA_2_INIT(PA_2_TX0); PA_3_INIT(PA_3_RX0); //UART0 寄存器初始化 UART_Open(UART0,115200,UART_NO_PARITY,UART_RX_NOT_EMPTY); UART_EnableInt(UART0,UART_RX_NOT_EMPTY); NVIC_EnableIRQ(UART0_IRQn); while(1) { } } //UART0 中斷服務(wù)子程序 void UART0_IRQHandler(void) { uint8_t cdata;? //判斷中斷狀態(tài)位 if (UART0->INTSTATUS_b.RXNEINT ) { cdata = UART0->DATA; //將接收到的數(shù)據(jù)返回 UART0->DATA=cdata; } //清除中斷狀態(tài) UART0->INTSTATUS = 0x0F; }

程序調(diào)試

編寫完程序,首先要在編譯環(huán)境下進行編譯、連接。沒有錯誤后(最好連警告也沒有)。就可以實際連接到電路板進行程序調(diào)試運行了。

在實驗前需要先確定U轉(zhuǎn)串所使用的的串口號,通過windows的設(shè)備管理器中的端口(COM和LPT)查看我們的串口,比如本例中是COM7。


圖8 串口端口號選擇


接下來打開串口上位機工具,本例使用的是“大傻串口工具”。按照程序中設(shè)置的串口參數(shù)配置好串口。端口選擇COM7,波特率115200,數(shù)據(jù)位8位,無奇偶校驗,1位停止位。最后點擊打開串口即可。打開后如圖所示:


圖9 串口配置


上位機環(huán)境配置好之后,接下里就可以下載并仿真程序了。首先我們在UART0_IRQ中斷子程序中位置打上斷點。隨后全速運行程序。


圖10 仿真界面


然后我們在上位機發(fā)送一個數(shù)據(jù)進行測試,例如發(fā)送一個字節(jié)0x11。這時候單片機便會進入串口中斷服務(wù)程序,并且停止在斷點處。這時候我們聽過watch窗口看到接收的數(shù)據(jù),就是0x11。


圖11 數(shù)據(jù)發(fā)送


繼續(xù)單步運行并退出中斷服務(wù)程序,這時候我們再去看上位機,發(fā)現(xiàn)收到了單片機返回的數(shù)據(jù)。


圖12 數(shù)據(jù)接收

1.《【板子串口怎么連接電腦】民硅微電子-m0學(xué)習(xí)筆記07-串行通信詳情》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《【板子串口怎么連接電腦】民硅微電子-m0學(xué)習(xí)筆記07-串行通信詳情》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/why/3024168.html