敏矽微電子Cortex-M0學習筆記07-串口通信詳解

2020-09-04 老馬識途單片機


越早學習越好


1、UART串口簡介

在單片機應用開發中,串口可以說是最常用的外設之一了。

串口最重要的功能就是能夠讓單片機和外部設備進行數據交互。例如在我們學習敏矽微電子的cortex m0時,可以將開發板與電腦相連,通過串口調試助手來調試程序、觀察程序運行結果。還有很多其他的串口模塊,比如藍牙、 NBIOT、GPRS、4G 等模組,都是使用的串口來進行驅動的,因此掌握串口是嵌入式工程師必備的技能。

接下來我們就來學習如何驅動ME32F030上的串口。

在正式學習之前,我們先對UART串口的通信格式做一個了解。UART的全稱是:通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter)。串行傳輸數據是按照字節為單位進行移位傳輸的,因此通信速度較低。但其擁有線路簡單、通信距離遠的優點,使用兩條線即可實現雙向通信,一條用於發送,一條用於接收。因此在工業應用中受到廣泛應用。其通信格式也十分簡單,如下圖所示:


圖1 UART數據格式


空閒位:數據線在空閒狀態的時候保持高電平,表示沒有數據傳輸。

起始位:當要傳輸數據的時候,數據線會被拉低,表示開始數據傳輸。

數據位:數據位就是實際要傳輸的數據,一般都是按照字節傳輸數據的,即一次傳輸8 位數據的。一般都是低位在前,高位在後。當然也有相反的傳輸協議,但平時很少會遇到。

奇偶校驗位:這是對數據中「1」的位數進行奇偶校驗用的,可以根據需求進行選擇。

停止位:數據傳輸完成標誌位,停止位的位數可以選擇 1 位、1.5 位或 2 位高電平,一般都選擇 1 位停止位。

波特率:波特率就是 UART 數據傳輸的速率,也就是每秒傳輸的數據位數,一般選擇 9600、19200、115200 等。

隨著電腦日新月異的升級換代,現在很多電腦都不帶傳統的COM口,USB接口開始廣泛應用。所以就有了USB轉串口晶片來解決這個難題,常用的U轉串晶片有CH340、PL2303 等。通過這些晶片就可以實現串口 TTL 轉 USB。

ME32F030開發板使用的是PL2303 晶片來完成串口和電腦之間的連接,只需要一條USB 線即可。在使用前需要注意兩件事:第一,先下載並安裝PL2303的驅動程序。第二,檢查開發板的USB跳線帽是否接到COM、USB這邊。正確的接法如下:


圖2 跳線連接


2、UART驅動寄存器

ME32F030 提供2個 UART 外設:UART0,UART1。串行接口都支持紅外傳輸(IrDA)協議功能。時鐘都受 SYSAHBCLKCTRL 寄存器控制。同時每個 UART 有獨立的時鐘分頻器來產生波特率,並使之不受系統時鐘和PCLK影響。UART對應的管腳映射圖如下:


圖3 UART管腳映射


看完管腳的映射關係,接下來就列出與UART相關的寄存器組,隨後會挨個進行講解。


圖4 UART寄存器


2-1 UART接收/發送緩衝寄存器

UART 接收/發送緩衝寄存器包含著 UART 接收到/將發送的字節,接收到的數據和待發送的串口數據都在該寄存器中。

2-2 UART狀態寄存器

該寄存器用於提供 UART 接收發送緩存器的狀態。大致可以歸類為以下幾種狀態:

發送狀態:發送FIFO空、發送FIFO半滿、發送FIFO滿。

接收狀態:接收FIFO空、接收FIFO半滿、接收FIFO滿。

奇偶校驗狀態:沒有奇偶校驗錯誤,或檢測到奇偶錯誤,寫1來清除錯誤標誌。

接收緩存器溢出狀態 :用來表明緩存器是否溢出。

2-3 UART控制寄存器

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

BIT6:奇偶校驗中斷使能,使能該中斷後,當接收到的數據發生奇偶校驗錯誤後,會產生中斷通知串口接收發生錯誤。

BIT7:接收溢出中斷使能,使能該中斷後,當接收到的數據超出FIFO容量就會產生中斷。通知及時取出數據或者清空FIFO。

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

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

BIT10:IRDA傳輸協議使能位,置1使能。

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

BIT23:TX發送使能,置1使能。


圖5 UART控制寄存器


2-4 UART中斷狀態寄存器

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


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

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


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


波特率分頻值計算公式:

BAUDDIV = SCLK / UART BAUDRATE

2-6 UART TX/RX FIFO 數據清除寄存器

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


圖7 UART TX/RX FIFO 數據清除寄存器


3、UART驅動函數

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

3-1 UART初始化

在每段原始碼的後面,筆者對其進行一下注釋,方便大家快速掌握和使用這個函數。這個函數的4個參數的意義如下:

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

baudrate:要設置的串口的波特率。

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

rxinttriggerlevel:接收中斷觸發條件。

void UART_Open(UART0_Type *uart, uint32_t baudrate, uint8_t parityoption, uint8_t rxinttriggerlevel){uint32_t volatile delays;  if (uart==UART0){//初始化時關閉UART0 IRQNVIC_DisableIRQ(UART0_IRQn);//使能 UART0 時鐘SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=1; //enable UART0 PCLKSYSCON->UART0CLKDIV_b.DIV = 0x1;      /* divided by 1 *///復位 UART0SYSCON->PRESETCTRL_b.UART0_RST_N=0;SYSCON->PRESETCTRL_b.UART0_RST_N=1;} else if (uart==UART1){//初始化時關閉UART1 IRQNVIC_DisableIRQ(UART1_IRQn);//使能 UART1 時鐘SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=1; //enable UART1 PCLKSYSCON->UART1CLKDIV_b.DIV = 0x1;      /* divided by 1 *///復位 UART1SYSCON->PRESETCTRL_b.UART1_RST_N=0;SYSCON->PRESETCTRL_b.UART1_RST_N=1;} else return ;  //設置波特率  uart->BAUDDIV_b.BAUDDIV = MainClock/baudrate;//設置奇偶校驗if (parityoption==UART_ODD_PARITY)uart->CTRL_b.PARISEL=1;if (parityoption!=UART_NO_PARITY)uart->CTRL_b.PARIEN=1;//設置中斷觸發條件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;//使能發送和接收功能  uart->CTRL_b.TXEN=1;uart->CTRL_b.RXEN=1;//插入延時SYS_DelaymS(1);//清空 FIFOuart->FIFOCLR=0xFF;  return;}  

3-2 UART關閉

這段函數用來關閉UART0或者UART1,只需要傳入需要關閉的串口即可。

void UART_Close(UART0_Type *uart){if (uart==UART0){//關閉UART0_IRQNVIC_DisableIRQ(UART0_IRQn);//關閉UART0時鐘SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=0;}else if (uart==UART1){//關閉UART1_IRQNVIC_DisableIRQ(UART1_IRQn);//關閉UART1時鐘SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=0;} else return ;//關閉相應UART的中斷,並清除中斷標誌UART_DisableInt(uart);UART_ClearIntFlag(uart);return;}


學習心得2


3-3 UART讀取單個字節

這段函數的作用是UART讀取單個字節的數據。

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

3-4 UART連續讀取多個字節

UART連續讀取串口數據,直到讀取到指定長度的數據。

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

3-5 UART發送單個字節

這段函數的作用是UART發送單個字節的數據。

 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連續發送多個字節

UART連續發送串口數據,直到發送完指定長度的數據。

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發送字符串

UART發送一段字符串數據,只需要將要發送的字符串數據首地址傳入即可。

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

3-8 UART使能中斷

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

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

3-9 UART關閉中斷

調用該函數後,所有的串口的中斷觸發條件都將關閉。

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


學習心得3


4、串口中斷例程

介紹完UART常用的驅動函數,接下來用個小例程來演示下UART的驅動。測試程序的功能是:通過串口助手發送一個字節的數據到單片機,單片機收到該數據後,將該數據通過單片機的串口發送到串口助手。

程序設計思路

首先是對UART0埠的初始化,將IO口復用為串口UART0的TX、RX功能。

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

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

最後使能UART0_IRQn中斷服務子程序

測試程序的代碼如下:

 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 中斷服務子程序void UART0_IRQHandler(void){uint8_t cdata; //判斷中斷狀態位if (UART0->INTSTATUS_b.RXNEINT ){cdata = UART0->DATA; //將接收到的數據返回UART0->DATA=cdata;}//清除中斷狀態UART0->INTSTATUS = 0x0F;}

程序調試

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

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


圖8 串口埠號選擇


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


圖9 串口配置


上位機環境配置好之後,接下裡就可以下載並仿真程序了。首先我們在UART0_IRQ中斷子程序中位置打上斷點。隨後全速運行程序。


圖10 仿真界面


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


圖11 數據發送


繼續單步運行並退出中斷服務程序,這時候我們再去看上位機,發現收到了單片機返回的數據。


圖12 數據接收

相關焦點

  • 敏矽微電子Cortex-M0學習筆記01-晶片簡介
    敏矽微電子Cortex-M0學習手記01-晶片簡介1.1. 概述ME32F030R8T6 的出現為嵌入式的開發帶來了極大地便利,ME32F030R8T6 是一款內嵌 ARM Cortex™ M0 核的 32 位微控制器。
  • 敏矽微電子Cortex-M0學習筆記04-GPIO詳解及應用實例
    前面我們已經對敏矽微電子的基於cortex m0內核的ME32F030R8T6的基本功能做了介紹,然後詳細講解了開發環境MDK的安裝,pack包的安裝,工程的建立及程序的仿真,緊接著講解了ME32F030R8T6的時鐘系統。
  • 敏矽微電子Cortex-M0學習筆記02-開發環境的建立及調試
    本篇先簡單介紹MDK的安裝流程,然後重點說明如何把敏矽微電的Cortex-M0的PACK包添加到mdk中,這樣才能順利的在MDK環境下開發敏矽微電子Cortex-M0新片。最後用了很大篇幅介紹如何建立工程,工程中各種文件的添加等等。
  • 敏矽微電子Cortex-M0學習筆記10-SPI通信詳解
    主要功能如下:•支持標準的SPI,兼容4線的SSI•同步串行通信•支持主/從機模式•深度為8幀的先進先出FIFO(First In First Out)緩存器•每幀數據長度4位到16位SPI由4個管腳負責通信,分別是:SCK:同步主機和從機的時鐘,由主機輸出時鐘。
  • 敏矽微電子Cortex-M0學習筆記14-看門狗復位實例
    學習筆記int main(void){ //初始化串口 PA_2_INIT(PA_2_TX0); UART_Open(UART0,9600,UART_NO_PARITY,0); UART_PutString(UART0,"System Reset..."
  • 敏矽微電子Cortex-M0學習筆記15-看門狗定時中斷實例
    學習筆記1、看門狗時鐘在上一章節的學習中,我們使用了看門狗的系統復位功能,通過觸摸按鍵觸發餵狗的方式,演示了看門狗的復位功能。int main(void){//初始化串口PA_2_INIT(PA_2_TX0);UART_Open(UART0,9600,UART_NO_PARITY,0);UART_PutString(UART0,"System Reset...");//Send
  • 敏矽微電子Cortex-M0學習筆記16-串行通信I2C實例
    學習筆記1、I2C概述I2C 是兩線串行通信接口,可以支持主、從機兩種模式的通信方式。主要功能如下:• 兼容標準的I2C主從機工作模式• 可編程到時鐘頻率支持不同的I2C數據傳輸速率• 支持從機工作模式下雙向數據傳輸• 串行時鐘同步使得傳輸速率不同的器件能夠通過一條串行總線進行通信• 支持達 400KHz速率• 可設定為多達4 個不同的從機地址• I2C 總線可用於測試和診斷
  • 敏矽微電子Cortex-M0學習筆記13-硬體CRC實例
    學習筆記學習記錄uint16_t crc_16_std, crc_16_modbus;uint16_t crc_ccitt_std, crc_ccitt_xmodem, crc_ccitt_0x1d0f;uint32_t crc_32;int main(void){uint8_t datastr[16]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
  • 敏矽微電子Cortex-M0學習筆記17-I2C從機通信實例
    學習筆記sreceive byte and put to sub_addr, and sub_addr increase//4. repeat step 3//5. master stop i2cextern uint32_t SystemCoreClock;uint8_t Slave_Data_Memory[128] ={ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a
  • 敏矽微電子Cortex-M0學習筆記08-基本定時器詳解
    學習筆記1、ME32F030
  • 敏矽微電子Cortex-M0學習筆記11-FLASH存儲器
    學習筆記1、FLASH
  • 敏矽微電子Cortex-M0學習筆記12-電容觸摸按鍵實例
    學習筆記1、電容觸摸簡介
  • 敏矽微電子Cortex-M0學習筆記05-埠外部中斷實例
    1、目的本篇學習筆記我們主要來了解ME32F030的中斷系統,首先通過對ME32F030終端系統和中斷控制存器進行學習,最後通過實際的GPIO埠中斷實例掌握中斷函數的編程實現來加深掌握ME32F030中斷系統的編程方法
  • 敏矽微電子Cortex-M0學習筆記06-段式LCD液晶實例
    1、LCD顯示驅動概述在上一章節GPIO中斷的學習中在以後的學習和開發中,LCD作為顯示單元,會愈發顯示出它的重要性。那麼接下來就開始介紹ME32F030的LCD驅動。學習前先對其做個簡單的概述。ME32F030的LCD 顯示驅動通過自動地創建交流段和公共電壓信號來直接驅動 LCD。它可以支持靜態,1/2,1/3,1/4,1/5 和 1/6 佔空比 的 LCD 面板。.
  • STM32F103學習筆記三 串口通信
    1、串口通信背景知識1.1、 設備之間的通信方式並行通信 串行通信傳輸原理 數據各個位同時傳輸 數據按位順序傳輸優點 速度快 佔用引腳資源少缺點 佔用引腳資源多 速度相對較慢1.2、 串行通信分類1.2.1、按照通信方式,分為:同步通信:帶時鐘同步信號傳輸
  • 上海申矽凌微電子科技有限公司宣布近期已完成新一輪融資
    上海申矽凌微電子科技有限公司宣布近期已完成新一輪融資,融資金額數千萬人民幣,由創維投資和湖杉資本共同投資。本輪融資一方面用來擴充產品線,在現有產品的基礎上,進一步豐富產品,滿足客戶的需求。其次進一步擴大團隊,具備同時服務多家一線客戶的能力。
  • 基於Cortex-M0的USB密碼鍵盤的設計與實現
    引言密碼鍵盤廣泛地應用在金融、電信、會員卡等很多領域,現在市場的密碼鍵盤主要有三大類接口:PS2、串口和USB。但是隨著個人計算機通用外圍設備越來越少地使用串口和PS2接口,這兩種接口正在逐漸從個人計算機特別是可攜式電腦上消失。而現在市場上的很多USB密碼鍵盤往往是採用在原來設計的基礎上加PS2轉USB晶片(HID類)或者UART轉USB晶片(CDC類)實現,這就造成硬體版本不兼容,生產必須有兩個硬體版本。本方案基於一套硬體結構,通過軟體的升級方便地實現HID類和CDC類產品之間的轉換。
  • STM32系統學習——USART(串口通信)
    串口通信是一種設備間非常常用的串行通行方式,其簡單便捷,大部分電子設備都支持。 一、物理層 常用RS-232標準,主要規定了信號的用途、通信接口以及信號的電平標準。 2.RS-232信號線 最初RS-232串口標準常用於計算機、路由與調製調節器(「貓」)之間通信,設備被分為數據終端設備DTE(計算機、路由)和數據通信設備DCE(調製調節器)。舊臺式計算機,一般都有RS-232標準的COM口,也稱DB9接口。
  • 51 單片機UART 串口通信 方式1 實現
    再編寫符合此串行口通信的程序代碼便能夠實現串行通信,其硬體結構決定了編程機制( 當然還要靠51晶片內CPU等機制 )。根據串行通信口硬體結構,實現UART通信可以分為兩步:(1)初始化串行通信口( UART )配置SCON:設定串口方式( SM0及SM1位配置4種方式);串口是否要接收數據(REN位)設定PCON寄存器的SMOD位(若非串口方式0 )若串口為方式1和方式3,則需要配置TMOD:選擇定時器1並配置其初值裝載方式(MI M0位),並設置TH1,TL0的初值以確定通信的波特率(由波特率的計算公式)
  • rs232串口接線,RS232串口通信基本接線方法
    打開APP rs232串口接線,RS232串口通信基本接線方法 發表於 2017-11-01 15:47:51   目前較為常用的串口有