色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

串口通信入門筆記

jf_78858299 ? 來源: 敏矽MCU ? 作者:敏矽微 ? 2023-04-23 17:37 ? 次閱讀

1、UART串口簡介

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

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

接下來我們就來學習如何驅動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使能。

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 IRQ
NVIC_DisableIRQ(UART0_IRQn);

//使能 UART0 時鐘
SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=1; //enable UART0 PCLK
SYSCON->UART0CLKDIV_b.DIV = 0x1;      /* divided by 1 */

//復位 UART0
SYSCON->PRESETCTRL_b.UART0_RST_N=0;
SYSCON->PRESETCTRL_b.UART0_RST_N=1;
}
  else if (uart==UART1)
{
//初始化時關閉UART1 IRQ
NVIC_DisableIRQ(UART1_IRQn);

//使能 UART1 時鐘
SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=1; //enable UART1 PCLK
SYSCON->UART1CLKDIV_b.DIV = 0x1;      /* divided by 1 */

//復位 UART1
SYSCON->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);

//清空 FIFO
uart->FIFOCLR=0xFF;
  return;
}

3-2 UART關閉

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

void UART_Close(UART0_Type *uart)
{
if (uart==UART0)
{
//關閉UART0_IRQ
NVIC_DisableIRQ(UART0_IRQn);

//關閉UART0時鐘
SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=0;

}else if (uart==UART1)
{

//關閉UART1_IRQ
NVIC_DisableIRQ(UART1_IRQn);

//關閉UART1時鐘
SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=0;
}
  else return ;

//關閉相應UART的中斷,并清除中斷標志
UART_DisableInt(uart);
UART_ClearIntFlag(uart);
return;
}

3-3 UART讀取單個字節

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

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連續讀取多個字節

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

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發送單個字節

這段函數的作用是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==''))
{
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;
}

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 數據接收

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6035

    文章

    44554

    瀏覽量

    634653
  • GPRS
    +關注

    關注

    21

    文章

    984

    瀏覽量

    129426
  • uart
    +關注

    關注

    22

    文章

    1235

    瀏覽量

    101354
  • 串口通信
    +關注

    關注

    34

    文章

    1624

    瀏覽量

    55508
收藏 人收藏

    評論

    相關推薦

    串口通信學習筆記

    串口似乎是一個比較模糊的概念,UART、COM口、RS-232、RS-485等名稱有時都會被稱作串口,但是從應用電路上看,三者又顯然存在差異。個人理解,我們通常所說的串口是使用串行通信
    發表于 09-20 15:23 ?651次閱讀
    <b class='flag-5'>串口</b><b class='flag-5'>通信</b>學習<b class='flag-5'>筆記</b>

    UART串口通信示例:開啟通信寶藏之門的定位模組LuatOS入門

    今天我們要講解的是UART串口通信示例,關于Air201資產定位模組LuatOS入門,我會從搭建環境、代碼燒錄、示例效果等來細說:
    的頭像 發表于 11-03 19:55 ?907次閱讀
    UART<b class='flag-5'>串口</b><b class='flag-5'>通信</b>示例:開啟<b class='flag-5'>通信</b>寶藏之門的定位模組LuatOS<b class='flag-5'>入門</b>

    新人學labview串口通信,求串口入門程序

    新人學labview串口通信,求串口入門程序{:23:}
    發表于 03-22 16:32

    串口通信調試(PC與PC串口通信

    【LabVIEW從入門到精通】4.1.6 串口通信調試(PC與PC串口通信
    發表于 01-08 15:43 ?0次下載

    串口通信調試(PC與智能儀器串口通信

    【LabVIEW從入門到精通】4.1.6 串口通信調試(PC與智能儀器串口通信
    發表于 01-08 15:42 ?0次下載

    LabVIEW從入門到精通之PC與智能儀器串口通信

    【LabVIEW從入門到精通】5.3 PC與智能儀器串口通信(利用LabVIEW實現)
    發表于 01-08 11:06 ?0次下載

    51單片機學習篇-- --串口通信筆記

    人家是十天學會單片機,哈哈哈),所以先來總結一些串口通信筆記,然后接著學習吧。說半天廢話,主要的意思就是這篇內容是筆記,是我認為重要的內容,一定會有遺漏,詳細參考郭天祥《新概念51單
    發表于 11-14 12:51 ?11次下載
    51單片機學習篇-- --<b class='flag-5'>串口</b><b class='flag-5'>通信筆記</b>

    STM32F103學習筆記串口通信

    STM32F103學習筆記串口通信
    發表于 11-25 09:06 ?71次下載
    STM32F103學習<b class='flag-5'>筆記</b>三   <b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    合泰HT32F52352串口通信學習筆記

    合泰HT32F52352串口通信學習筆記
    發表于 11-29 15:06 ?23次下載
    合泰HT32F52352<b class='flag-5'>串口</b><b class='flag-5'>通信</b>學習<b class='flag-5'>筆記</b>

    stm32f103核心板串口通信入門

    stm32f103核心板串口通信入門一、 基于寄存器與基于固件庫編程方式的差異二、stm32串口通信1. 前期準備硬件軟件連接2.編寫程序并
    發表于 12-07 17:21 ?10次下載
    stm32f103核心板<b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>入門</b>

    【HAL庫】串口通信

    HAL庫入門串口通信學習經驗分享
    發表于 12-16 16:58 ?5次下載
    【HAL庫】<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    串口通信入門介紹

    一、串口通信串口是串行接口(serial port)的簡稱,也稱為 串行通信接口 或 COM接口。串口
    發表于 12-20 19:24 ?6次下載
    <b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>入門</b>介紹

    STM32筆記(九)---串口通信

    串口通信(USART)文章目錄串口通信(USART)一、 串口通信協議簡介1-1 概念1-2 常
    發表于 12-28 19:40 ?5次下載
    STM32<b class='flag-5'>筆記</b>(九)---<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    MSP430串口通信入門級)

    MSP430串口通信入門級)
    發表于 03-14 15:44 ?49次下載

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

    敏矽微電子Cortex-M0學習筆記07——串口通信詳解
    的頭像 發表于 09-26 17:11 ?1114次閱讀
    敏矽微電子Cortex-M0學習<b class='flag-5'>筆記</b>07——<b class='flag-5'>串口</b><b class='flag-5'>通信</b>詳解
    主站蜘蛛池模板: 日韩中文字幕亚洲无线码| 91热久久免费频精品动漫99| 任你躁国语自产二区在线播放| 巨爆乳中文字幕爆乳区| 精品一区二区三区AV天堂| 国产欧美国产综合第一区| 国产高清亚洲| 国产欧美精品一区二区三区-老狼| 国产成人h在线视频| 国产精品久久人妻拍拍水牛影视| 富婆夜店找黑人猛男BD在线| yw193.c国产在线观看| 成人免费毛片观看| 成人做视频免费| 国产伦精品一区二区三区| 国产三级在线精品男人的天堂| 國產麻豆AVMDXMDX| 美女打开双腿扒开屁股男生| 男人有噶坏| 色综合五月激情综合色一区| 小xav导航| 伊人青青青| av老司机色爱区综合| 成人天堂婷婷青青视频在线观看| 国产成人一区二区三中文| 国内精品免费视频精选在线观看| 黄小飞二人转| 男人插曲视频大全免费网站 | 亚洲国产精品无码中文字满| 伊人久久综合热青草| 成人a毛片久久免费播放| 国产精品视频大全| 伦理 电影在线观看百度影音| 日本在线免费播放| 亚洲欧美高清在线精品一区| 99在线播放| 精品无码三级在线观看视频| 日日摸夜夜添夜夜爽出水| 伊人久久精品99热超碰| 国产成人免费不卡在线观看| 你是淫荡的我的女王|