日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32学习笔记】(9)——串口通讯(USART)详解

發布時間:2023/12/8 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32学习笔记】(9)——串口通讯(USART)详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????本文主要參考了野火的零死角玩轉STM32和正點原子的STM32F1 開發指南 V1.1(精英板-庫函數版本),文章中大部分知識都是從兩本書中提取出來,串口通信協議的知識主要參考野火的書籍,而串口實驗部分是根據正點原子的開發板和例程進行講解。

串口通訊協議簡介

????????串口通訊 (Serial Communication) 是一種設備間極為常用的串行通訊方式,目前多存在于工控機及部分通信設備中。

? ? ? ? 對于通訊協議,以分層的方式來理解,可以把它分為物理層協議層

????????物理層規定通訊系統中具有機械、電子功能部分的特性,確保原始數據在物理媒體的傳輸。

????????協議層主要規定通訊邏輯,統一收發雙方的數據打包、解包標準。簡單來說物理層規定我們用嘴巴還是用肢體來交流,協議層則規定我們用中文還是英文來交流。

串口通訊的物理層

????????串口通訊的物理層有很多標準及變種,串口通訊的物理層的主要標準是RS-232標準,其規定了信號的用途通訊接口信號的電平標準,其通訊結構如下:

????????在上面的通訊方式中,兩個通訊設備的“DB9接口”之間通過串口信號線建立起連接,串口信號線中使用“RS-232標準”傳輸數據信號。由于RS-232電平標準的信號不能直接被控制器直接識別,所以這些信號會經過一個“電平轉換芯片”轉換成控制器能識別的“TTL 標準”的電平信號,才能實現通訊。

1、信號的電平標準

????????在設備內部信號是以TTL電平標準傳輸的,設備之間是通過RS-232電平標準傳輸的,而且TTL電平需要經過電平轉換芯片才能轉化為RS-232電平,RS-232電平轉TTL電平也是如此。如圖是TTL電平標準與RS-232電平標準。

?

?

????????電子電路中常使用 TTL 的電平標準,理想狀態下,使用 5V 表示二進制邏輯 1, 使用 0V 表示邏輯 0

????????為了增加串口通訊的遠距離傳輸及抗干擾能力,所以RS-232信號線,理想狀態下,使用-15V 表示邏輯 1+15V 表示邏輯 0。

2、RS-232 信號線

????????在最初的應用中,RS-232 串口標準常用于計算機、路由與調制調解器 (MODEN,俗稱“貓”) 之間的通訊,在這種通訊系統中,設備被分為數據終端設備 DTE(計算機、路由)數據通訊設備DCE(調制調解器)。在舊式的臺式計算機中一般會有 RS-232 標準的 COM 口 (也稱 DB9 接口),下圖就是電腦主板上的 COM 口及串口線 。

?

?

????????其中接線口以針式引出信號線的稱為公頭,以孔式引出信號線的稱為母頭。在計算機中一般引出公頭接口,而在調制調解器設備中引出的一般為母頭,使用上圖中的串口線即可把它與計算機連接起來。通訊時,串口線中傳輸的信號就是使用前面講解的 RS-232 標準調制的。

????????DB9 接口中的公頭及母頭的各個引腳的標準信號線接法如下圖。?

???????

?

????????上表中的是計算機端的 DB9 公頭標準接法,由于兩個通訊設備之間的收發信號 (RXD 與 TXD) 應交叉相連,所以調制調解器端的 DB9 母頭的收發信號接法一般與公頭的相反。?

?

????????串口線中的 RTS、CTS、DSR、DTR 及 DCD 信號,使用邏輯 1 表示信號有效,邏輯 0 表示信號無效。

????????例如,當計算機端控制 DTR 信號線表示為邏輯 1 時,它是為了告知遠端的調制調解器,本機已準備好接收數據,0 則表示還沒準備就緒。

????????在目前的其它工業控制使用的串口通訊中,一般只使用 RXD、TXD 以及 GND 三條信號線,直接傳輸數據信號,而 RTS、CTS、DSR、DTR 及 DCD 信號都被裁剪掉了。

串口通訊的協議層

1、數據包

????????串口通訊的數據包由發送設備通過自身的 TXD 接口傳輸到接收設備的 RXD 接口。

????????在串口通訊的協議層中,規定了數據包的內容,它由啟始位、主體數據、校驗位以及停止位組成,通訊雙方的數據包格式要約定一致才能正常收發數據。

?

2、波特率

????????由于異步通信中沒有時鐘信號,所以接收雙方要約定好波特率,即每秒傳輸的碼元個數,以便對信號進行解碼,常見的波特率有4800、9600、115200等。STM32中波特率的設置通過串口初始化結構體來實現。

3、起始和停止信號

????????數據包的首尾分別是起始位停止位,數據包的起始信號由一個邏輯0的數據位表示停止位信號可由0.5、1、1.5、2個邏輯1的數據位表示,雙方需約定一致。STM32中起始和停止信號的設置也是通過串口初始化結構體來實現。

4、有效數據

????????在數據包的起始位之后緊接著的就是要傳輸的主體數據內容,也稱為有效數據,有效數據的長度常被約定為 5、6、7 或 8 位長。

5、數據校驗

????????在有效數據之后,有一個可選的數據校驗位。由于數據通信相對更容易受到外部干擾導致傳輸數據出現偏差,可以在傳輸過程加上校驗位來解決這個問題。

????????校驗方法有奇校驗 (odd)、偶校驗 (even)、0 校驗 (space)、1 校驗 (mark) 以及無校驗 (noparity)

????????奇校驗要求有效數據和校驗位中“1”之和的個數為奇數,比如一個 8 位長的有效數據為:01101001, 此時總共有 4 個“1”,為達到奇校驗效果,校驗位為“1”,最后傳輸的數據將是 8 位的有效數據加上 1 位的校驗位總共 9 位。

????????偶校驗與奇校驗要求剛好相反,要求幀數據和校驗位中“1”之和的個數為偶數,比如數據幀:11001010, 此時數據幀“1”的個數為 4 個,所以偶校驗位為“0”。

????????0 校驗是不管有效數據中的內容是什么,校驗位總為“0”。

????????1 校驗是不管有效數據中的內容是什么,校驗位總為“1”。

STM32 的 USART 簡介

????????通用同步異步收發器 (Universal Synchronous Asynchronous Receiver and Transmitter) 是一個串行通信設備,可以靈活地與外部設備進行全雙工數據交換。

????????UART(Universal Asynchronous Receiver and Transmitter)跟 USART不一樣的是:它是在 USART 基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸出,我們平時用的串口通信基本都是UART。

????????串行通信一般是以幀格式傳輸數據,即是一幀一幀的傳輸,每幀包含有起始信號、數據信息、停止信號,可能還有校驗信息。USART 就是對這些傳輸參數有具體規定,當然也不是只有唯一一 個參數值,很多參數值都可以自定義設置,只是增強它的兼容性。

????????USART 滿足外部設備對工業標準 NRZ 異步串行數據格式的要求,并且使用了小數波特率發生器,可以提供多種波特率,使得它的應用更加廣泛。

????????USART不僅支持同步單向通信半雙工單線通信,也支持LIN(局部互連網)智能卡協議IrDA(紅外數據組織)SIR ENDEC規范,以及調制解調器(CTS/RTS)操作。它還允許多處理器通信。 USART 支持使用 DMA,可實現高速數據通信。

????????STM32在硬件設計時一般都會預留一個 USART 通信接口連接電腦,用于在調試程序是可以把一些調試信息“打印”在電腦端的串口調試助手工具上,從而來用串口調試助手來驗證自己的程序是否出了問題。

USART功能概述

????????接口通過三個引腳與其他設備連接在一起USART框圖。任何USART雙向通信至少需要兩個腳:接收數據輸入(RX)和發送數據輸出(TX)。

? ? ? ? ?RX:接收數據串行輸入。通過過采樣技術來區別數據和噪音,從而恢復數據。

????????TX:發送數據輸出。當發送器被禁止時,輸出引腳恢復到它的I/O端口配置。當發送器被激活,并且不發送數據時,TX引腳處于高電平。在單線和智能卡模式里,此I/O口被同時用于數據的發送和接收。

????????● 總線在發送或接收前應處于空閑狀態

????????● 一個起始位

????????● 一個數據字(8或9位),最低有效位在前

????????● 0.5,1.5,2個的停止位,由此表明數據幀的結束

????????● 使用分數波特率發生器 —— 12位整數和4位小數的表示方法。

????????● 一個狀態寄存器(USART_SR)

????????● 數據寄存器(USART_DR)

????????● 一個波特率寄存器(USART_BRR),12位的整數和4位小數

????????● 一個智能卡模式下的保護時間寄存器(USART_GTPR)

USART框圖

?

功能引腳

????????TX:發送數據輸出引腳。

????????RX:接收數據輸入引腳。

????????SW_RX:數據接收引腳,只用于單線和智能卡模式,屬于內部引腳,沒有具體外部引腳。

????????nRTS:請求以發送 (Request To Send),n 表示低電平有效。如果使能 RTS 流控制,當 USART 接收器準備好接收新數據時就會將 nRTS 變成低電平;當接收寄存器已滿時,nRTS 將被設置為高電平。該引腳只適用于硬件流控制。

????????nCTS:清除以發送 (Clear To Send),n 表示低電平有效。如果使能 CTS 流控制,發送器在發送下一幀數據之前會檢測 nCTS 引腳,如果為低電平,表示可以發送數據如果為高電平則在發送完當前數據幀之后停止發送。該引腳只適用于硬件流控制。

????????SCLK:發送器時鐘輸出引腳。這個引腳僅適用于同步模式。

????????STM32F103ZET6 系統控制器有三個 USART兩個 UART,其中 USART1 和時鐘來源于 APB2 總線時鐘,其最大頻率為 72MHz,其他四個的時鐘來源于 APB1 總線時鐘,其最大頻率為 36MHz。 UART 只是異步傳輸功能,所以沒有 SCLK、nCTS 和 nRTS 功能引腳。?

?與USART有關的寄存器

USART寄存器地址映像

?

USART寄存器描述?

????????1、USART狀態控制器(USART_SR)

?

????????2、數據寄存器(USART_DR)

?

? ??????3、波特比率寄存器(USART_BRR)

????????4、控制寄存器 1(USART_CR1)

?

????????5、控制寄存器 2(USART_CR2)

?

????????6、控制寄存器 3(USART_CR3)

?

使用寄存器來配置USART?

數據寄存器

????????USART 數據寄存器 (USART_DR) 只有低 9 位有效,并且第 9 位數據是否有效要取決于 USART 控制寄存器 1(USART_CR1) 的 M 位設置當 M 位為 0 時表示 8 位數據字長,當 M 位為 1 表示 9 位數據字長,我們一般使用 8 位數據字長。 USART_DR 包含了已發送的數據或者接收到的數據。USART_DR 實際是包含了兩個寄存器,一 個是專門用于發送的可寫 TDR,另一個是專門用于接收的可讀 RDR。當進行發送操作時,往USART_DR 寫入數據會自動存儲在 TDR 內;當進行讀取操作時,向 USART_DR 讀取數據會自動提取 RDR 數據

????????TDR 和 RDR 都是介于系統總線和移位寄存器之間。串行通信是一個位緊接著一個位傳輸的。

????????發送時把 TDR 內容轉移到發送移位寄存器,然后把移位寄存器數據每一位發送出去;接收時把接收到的 每一位順序保存在接收移位寄存器內然后才轉移到 RDR。

????????USART 支持 DMA 傳輸,可以實現高速數據傳輸。

控制器

????????USART 有專門控制發送的發送器、控制接收的接收器,還有喚醒單元、中斷控制等等。使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能 USART,UE 位用來開啟供給給串口 的時鐘。

????????發送或者接收數據字長可選 8 位或 9 位,由 USART_CR1 的 M 位控制。

發送器

????????當 USART_CR1 寄存器的發送使能位 TE 置 1 時,啟動數據發送,發送移位寄存器的數據會在 TX 引腳輸出低位在前,高位在后。如果是同步模式 SCLK 也輸出時鐘信號。

????????一個字符幀發送需要三個部分:起始位 + 數據幀 + 停止位。起始位是一個位周期的低電平,位周期就是每一位占用的時間;數據幀就是我們要發送的 8 位或 9 位數據,數據是從最低位開始傳輸的;停止位是一定時間周期的高電平

????????停止位時間長短是可以通過 USART 控制寄存器 2(USART_CR2) 的 STOP[1:0] 位控制,可選 0.5 個、1 個、1.5 個和 2 個停止位。默認使用 1 個停止位。2 個停止位適用于正常 USART 模式、單線模式和調制解調器模式。0.5 個和 1.5 個停止位用于智能卡模式。 當選擇 8 位字長,使用 1 個停止位時,具體發送字符時序圖見圖字符發送時序圖 。

????????例如:當選擇 8 位字長,使用 1 個停止位時,具體發送字符時序圖見圖字符發送時序圖 。

????????當發送使能位 TE 置 1 之后,發送器開始會先發送一個空閑幀 (一個數據幀長度的高電平),接下來就可以往 USART_DR 寄存器寫入要發送的數據。在寫入最后一個數據后,需要等待 USART 狀態寄存器 (USART_SR) 的 TC 位為 1,表示數據傳輸完成,如果 USART_CR1 寄存器的 TCIE 位置 1,將產生中斷

????????在發送數據時,編程的時候有幾個比較重要的標志位我們來總結下。

?

接收器

????????如果將 USART_CR1 寄存器的 RE 位置 1使能 USART 接收,使得接收器在 RX 線開始搜索起始位。在確定到起始位后就根據 RX 線電平狀態把數據存放在接收移位寄存器內。接收完成后就把接收移位寄存器數據移到 RDR 內,并把 USART_SR 寄存器的 RXNE 位置 1,同時如果 USART_CR2 寄存器的 RXNEIE 置 1 的話可以產生中斷。

????????在接收數據時,編程的時候有幾個比較重要的標志位我們來總結下。

?

?

USARTDIV的計算

????????波特率指數據信號對載波的調制速率,它用單位時間內載波調制狀態改變次數來表示單位為比特比特率指單位時間內傳輸的比特數,單位 bit/s(bps)。對于 USART 波特率與比特率相等,所以可以將波特率和比特率作為同一個概念。波特率越大,傳輸速率越快。 USART 的發送器和接收器需要使用相同的波特率。

????????計算公式如下:

????????其中,fPLCK為 USART 時鐘USARTDIV 是一個存放在波特率寄存器 (USART_BRR) 的一個無符號定點數。其中 DIV_Mantissa[11:0] 定義 USARTDIV 的整數部分DIV_Fraction[3:0] 位定義USARTDIV 的小數部分

????????例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此時 USART_BRR 值為 0x18A;那么 USARTDIV 的小數位 10/16=0.625;整數位 24,最終 USARTDIV 的值為 24.625。

????????如果知道 USARTDIV 值為 27.68,那么 DIV_Fraction=16*0.68=10.88,最接近的正整數為 11,所以 DIV_Fraction[3:0] 為 0xB;DIV_Mantissa= 整數 (27.68)=27,即為 0x1B。

????????波特率的常用值有 2400、9600、19200、115200。下面以實例講解如何設定寄存器值得到波特率的值。

????????我們知道 USART1 使用 APB2 總線時鐘,最高可達 72MHz,其他 USART 的最高頻率為 36MHz。

????????我們選取 USART1 作為實例講解,即fPLCK=72MHz。為得到 115200bps 的波特率,此時:

? ? ? ????????????????????????????????????????????????????115200?=? ?

?

? 解得USARTDIV=39.0625,可算得 DIV_Fraction=0.0625*16=1=0x01,DIV_Mantissa=39=0x27,即應該設置 USART_BRR 的值為 0x271。

USART校驗控制

????????STM32F103 系列控制器 USART 支持奇偶校驗。當使用校驗位時,串口傳輸的長度將是 8 位的數據幀加上 1 位的校驗位總共 9 位,此時 USART_CR1 寄存器的 M 位需要設置為 1,即 9 數據位。

????????將 USART_CR1 寄存器的 PCE 位置 1 就可以啟動奇偶校驗控制奇偶校驗由硬件自動完成。啟動了奇偶校驗控制之后,在發送數據幀時會自動添加校驗位接收數據時自動驗證校驗位。接收數據時如果出現奇偶校驗位驗證失敗,會見 USART_SR 寄存器的 PE 位置 1,并可以產生奇偶校驗中斷。

????????使能了奇偶校驗控制后,每個字符幀的格式將變成:起始位 + 數據幀 + 校驗位 + 停止位。

?

中斷控制

與USART配置有關的固件庫函數

USART 初始化結構體

????????標準庫函數對每個外設都建立了一個初始化結構體,比如 USART_InitTypeDef,結構體成員用于 設置外設工作參數,并由外設初始化配置函數,比如 USART_Init() 調用,這些設定參數將會設置 外設相應的寄存器,達到配置外設工作環境的目的。

????????初始化結構體定義在 stm32f10x_usart.h 文件中,初始化庫函數定義在 stm32f10x_usart.c 文件中。

typedef struct {uint32_t USART_BaudRate; // 波特率uint16_t USART_WordLength; // 字長uint16_t USART_StopBits; // 停止位uint16_t USART_Parity; // 校驗位uint16_t USART_Mode; // USART 模式uint16_t USART_HardwareFlowControl; // 硬件流控制 } USART_InitTypeDef;

????????●USART_BaudRate:波特率設置。

????????一般設置為 2400、9600、19200、115200。標準庫函數會根據設定值計算得到 USARTDIV 值,從而設置 USART_BRR 寄存器值。

????????●USART_WordLength:數據幀字長,可選 8 位或 9 位。

????????它設定 USART_CR1 寄存器的 M 位的值。如果沒有使能奇偶校驗控制,一般使用 8 數據位;如果使能了奇偶校驗則一般設置為 9 數據位。

#define USART_WordLength_8b ((uint16_t)0x0000) #define USART_WordLength_9b ((uint16_t)0x1000)#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \((LENGTH) == USART_WordLength_9b))

????????● USART_StopBits:停止位設置。

????????停止位可選 0.5 個、1 個、1.5 個和 2 個停止位,它設定 USART_CR2寄存器的 STOP[1:0] 位的值,一般我們選擇 1 個停止位。

#define USART_StopBits_1 ((uint16_t)0x0000) #define USART_StopBits_0_5 ((uint16_t)0x1000) #define USART_StopBits_2 ((uint16_t)0x2000) #define USART_StopBits_1_5 ((uint16_t)0x3000) #define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \((STOPBITS) == USART_StopBits_0_5) || \((STOPBITS) == USART_StopBits_2) || \((STOPBITS) == USART_StopBits_1_5))

????????● USART_Parity:奇偶校驗控制選擇。

????奇偶校驗位可選 USART_Parity_No(無校驗)、USART_Parity_Even(偶校驗) 以及 USART_Parity_Odd(奇校驗),它設定 USART_CR1 寄存器的 PCE 位和 PS 位的值。

#define USART_Parity_No ((uint16_t)0x0000) #define USART_Parity_Even ((uint16_t)0x0400) #define USART_Parity_Odd ((uint16_t)0x0600) #define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \((PARITY) == USART_Parity_Even) || \((PARITY) == USART_Parity_Odd))

????????● USART_Mode:USART 模式選擇。

????????USART的模式有 USART_Mode_Rx 和 USART_Mode_Tx,允許使用邏輯或運算選擇兩個,它設定 USART_CR1 寄存器的 RE 位和 TE 位。

#define USART_Mode_Rx ((uint16_t)0x0004) #define USART_Mode_Tx ((uint16_t)0x0008) #define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00))

????????●USART_HardwareFlowControl:硬件流控制選擇。

#define USART_HardwareFlowControl_None ((uint16_t)0x0000) #define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) #define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) #define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) #define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\(((CONTROL) == USART_HardwareFlowControl_None) || \((CONTROL) == USART_HardwareFlowControl_RTS) || \((CONTROL) == USART_HardwareFlowControl_CTS) || \((CONTROL) == USART_HardwareFlowControl_RTS_CTS))

?

USART 時鐘初始化結構體

?

typedef struct {uint16_t USART_Clock; // 時鐘使能控制uint16_t USART_CPOL; // 時鐘極性uint16_t USART_CPHA; // 時鐘相位uint16_t USART_LastBit; // 最尾位時鐘脈沖 } USART_ClockInitTypeDef;

????????● USART_Clock:同步模式下 SCLK 引腳上時鐘輸出使能控制。

????????可選禁止時鐘輸出 (USART_Clock_Disable) 或開啟時鐘輸出 (USART_Clock_Enable);如果使用同步模式發送,一般都需要開啟時鐘。它設定 USART_CR2 寄存器的 CLKEN 位的值。

#define USART_Clock_Disable ((uint16_t)0x0000) #define USART_Clock_Enable ((uint16_t)0x0800) #define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \((CLOCK) == USART_Clock_Enable))

????????● USART_CPOL:同步模式下 SCLK 引腳上輸出時鐘極性設置。

? ? ? 可設置在空閑時 SCLK 引腳為低電平 (USART_CPOL_Low) 或高電平 (USART_CPOL_High)。它設定 USART_CR2 寄存器的 CPOL位的值。

#define USART_CPOL_Low ((uint16_t)0x0000) #define USART_CPOL_High ((uint16_t)0x0400) #define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High))

????????● USART_CPHA:同步模式下 SCLK 引腳上輸出時鐘相位設置。

????????可設置在時鐘第一個變化沿捕獲數據 (USART_CPHA_1Edge) 或在時鐘第二個變化沿捕獲數據。它設定 USART_CR2 寄存器的CPHA 位的值。USART_CPHA 與 USART_CPOL 配合使用可以獲得多種模式時鐘關系。

#define USART_CPHA_1Edge ((uint16_t)0x0000) #define USART_CPHA_2Edge ((uint16_t)0x0200) #define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge))

????????● USART_LastBit:選擇在發送最后一個數據位的時候時鐘脈沖是否在 SCLK 引腳輸出。

????????可以是不輸出脈沖 (USART_LastBit_Disable)、輸出脈沖 (USART_LastBit_Enable)。它設定 USART_CR2 寄存器的 LBCL 位的值。

#define USART_LastBit_Disable ((uint16_t)0x0000) #define USART_LastBit_Enable ((uint16_t)0x0100) #define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \((LASTBIT) == USART_LastBit_Enable))

?

USART文件夾介紹

?

? ? ? ? ? ? usart 文件夾內包含了 usart.c 和 usart.h 兩個文件。這兩個文件用于串口的初始化和中斷接收。這里只是針對串口 1,比如你要用串口 2 或者其他的串口,只要對代碼稍作修改就可以了。

????????usart.c里面包含了2個函數一個是void USART1_IRQHandler(void);另外一個是void uart_init(u32 bound);里面還有一段對串口 printf 的支持代碼,如果去掉,則會導致 printf 無法使用,雖然軟件編譯不會報錯,但是硬件上 STM32 是無法啟動的,這段代碼不要去修改。

printf 函數

????????這段引入 printf 函數支持的代碼在 usart.h 頭文件的最上方,這段代碼加入之后便可以通過 printf 函數向串口發送我們需要的內容,方便開發過程中查看代碼執行情況以及一些變量值。這 段代碼不需要修改,引入到 usart.h 即可。

????????這段代碼為:

// //加入以下代碼,支持printf函數,而不需要選擇use MicroLIB #if 1 #pragma import(__use_no_semihosting) //標準庫需要的支持函數 struct __FILE { int handle; }; FILE __stdout; //定義_sys_exit()以避免使用半主機模式 _sys_exit(int x) { x = x; } //重定義fputc函數 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循環發送,直到發送完畢 USART1->DR = (u8) ch; return ch; } #endif

?

uart_init函數

????????串口設置的一般步驟可以總結為如下幾個步驟:

????????1) 串口時鐘使能,GPIO 時鐘使能

????????2) 串口復位

????????3) GPIO 端口模式設置

????????4) 串口參數初始化

????????5) 開啟中斷并且初始化 NVIC(如果需要開啟中斷才需要這個步驟)

????????6) 使能串口

????????7) 編寫中斷處理函數

????????下面,我們就簡單介紹下這幾個與串口基本配置直接相關的幾個固件庫函數。

????????這些函數和定義主要分布在 stm32f10x_usart.h 和 stm32f10x_usart.c 文件中。

1.串口時鐘使能。

????????串口是掛載在 APB2 下面的外設,所以使能函數為:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);

?

2.串口復位。

????????當外設出現異常的時候可以通過復位設置,實現該外設的復位,然后重新配置這個外設達到讓其重新工作的目的。一般在系統剛開始配置外設的時候,都會先執行復位該外設的操作。

????????復位的是在函數 USART_DeInit()中完成:

void USART_DeInit(USART_TypeDef* USARTx);//串口復位

????????比如我們要復位串口 1,方法為:

USART_DeInit(USART1); //復位串口 1

?

3.串口參數初始化。

????????串口初始化是通過 USART_Init()函數實現的:

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

????????這個函數的第一個入口參數是指定初始化的串口標號,這里選擇 USART1。

????????第二個入口參數是一個 USART_InitTypeDef 類型的結構體指針,這個結構體指針的成員變量用來設置串口的一些參數。一般的實現格式為:

USART_InitStructure.USART_BaudRate = bound; //波特率設置; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為 8 位數據格式 USART_InitStructure.USART_StopBits = USART_StopBits_1; //一個停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬件數據流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模式 USART_Init(USART1, &USART_InitStructure); //初始化串口

????????從上面的初始化格式可以看出初始化需要設置的參數為:波特率,字長,停止位,奇偶校驗位,硬件數據流控制,模式(收,發)。我們可以根據需要設置這些參數。

4.數據發送與接收。

????????STM32 的發送與接收是通過數據寄存器 USART_DR 來實現的,這是一個雙寄存器,包含了 TDR 和 RDR。當向該寄存器寫數據的時候,串口就會自動發送,當收到數據的時候,也是存在該寄存器內。

????????STM32 庫函數操作 USART_DR 寄存器發送數據的函數是:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

????????通過該函數向串口寄存器 USART_DR 寫入一個數據。

????????STM32 庫函數操作 USART_DR 寄存器讀取串口接收到的數據的函數是:

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

????????通過該函數可以讀取串口接受到的數據。

5.串口狀態。

????????串口的狀態可以通過狀態寄存器 USART_SR 讀取。USART_SR 的各位描述如下圖所示。

????????RXNE(讀數據寄存器非空),當該位被置 1 的時候,就是提示已經有數據被接收到了,并且可以讀出來了。這時候我們要做的就是盡快去讀取 USART_DR,通過讀 USART_DR 可以將該位清零,也可以向該位寫 0,直接清除。

????????TC(發送完成),當該位被置位的時候,表示 USART_DR 內的數據已經被發送完成了。如果設置了這個位的中斷,則會產生中斷。該位也有兩種清零方式:

????????1)讀 USART_SR,寫USART_DR。

????????2)直接向該位寫 0。

????????在我們固件庫函數里面,讀取串口狀態的函數是:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

????????這個函數的第二個入口參數非常關鍵,它是標示我們要查看串口的哪種狀態,比如上面講解的RXNE(讀數據寄存器非空)以及 TC(發送完成)。例如:

????????我們要判斷讀寄存器是否非空(RXNE),操作庫函數的方法是:

USART_GetFlagStatus(USART1, USART_FLAG_RXNE);

????????我們要判斷發送是否完成(TC),操作庫函數的方法是:

USART_GetFlagStatus(USART1, USART_FLAG_TC);

????????這些標識號在 MDK 里面是通過宏定義定義的:

#define USART_IT_PE ((uint16_t)0x0028) #define USART_IT_TXE ((uint16_t)0x0727) #define USART_IT_TC ((uint16_t)0x0626) #define USART_IT_RXNE ((uint16_t)0x0525) #define USART_IT_IDLE ((uint16_t)0x0424) #define USART_IT_LBD ((uint16_t)0x0846) #define USART_IT_CTS ((uint16_t)0x096A) #define USART_IT_ERR ((uint16_t)0x0060) #define USART_IT_ORE ((uint16_t)0x0360) #define USART_IT_NE ((uint16_t)0x0260) #define USART_IT_FE ((uint16_t)0x0160)

?

6.串口使能。

????????串口使能是通過函數 USART_Cmd()來實現的,這個很容易理解,使用方法是:

USART_Cmd(USART1, ENABLE); //使能串口

?

7.開啟串口響應中斷。

????????有些時候當我們還需要開啟串口中斷,那么我們還需要使能串口中斷,使能串口中斷的函數是:

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)

????????這個函數的第二個入口參數是標示使能串口的類型,也就是使能哪種中斷,因為串口的中斷類型有很多種。比如在接收到數據的時候(RXNE 讀數據寄存器非空),我們要產生中斷,那么我們開啟中斷的方法是:

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟中斷,接收到數據中斷

????????我們在發送數據結束的時候(TC,發送完成)要產生中斷,那么方法是:

USART_ITConfig(USART1,USART_IT_TC,ENABLE);

?

8.獲取相應中斷狀態。

????????當我們使能了某個中斷的時候,當該中斷發生了,就會設置狀態寄存器中的某個標志位。經常我們在中斷處理函數中,要判斷該中斷是哪種中斷,使用的函數是:

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)

????????比如我們使能了串口發送完成中斷,那么當中斷發生了, 我們便可以在中斷處理函數中調用這個函數來判斷到底是否是串口發送完成中斷,方法是:

USART_GetITStatus(USART1, USART_IT_TC)

????????返回值是 SET,說明是串口發送完成中斷發生。

串口實驗設計

硬件設計

????????本實驗需要用到的硬件資源有:

????????1) 串口 1

????????串口 1 之前還沒有介紹過,本實驗用到的串口 1 與 USB 串口并沒有在 PCB 上連接在一起,需要通過跳線帽來連接一下。這里我們把 P6 的 RXD 和 TXD 用跳線帽與 PA9 和 PA10 連接起來。

????????連接上這里之后,我們在硬件上就設置完成了,可以開始軟件設計了。?

軟件設計

????????代碼如下:

//初始化 IO 串口 1 //bound:波特率 void uart_init(u32 bound) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//①串口時鐘使能,GPIO 時鐘使能,復用時鐘使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能 USART1,GPIOA 時鐘//②串口復位USART_DeInit(USART1); //復位串口 1//③GPIO 端口模式設置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //ISART1_TX PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1_RX PA.10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.10//④串口參數初始化USART_InitStructure.USART_BaudRate = bound; //波特率設置USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長為 8 位USART_InitStructure.USART_StopBits = USART_StopBits_1; //一個停止位USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬件數據流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收發模式USART_Init(USART1, &USART_InitStructure); //初始化串口#if EN_USART1_RX //如果使能了接收//⑤初始化 NVICNVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //搶占優先級 3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級 3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能NVIC_Init(&NVIC_InitStructure); //中斷優先級初始化//⑤開啟中斷USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //開啟中斷#endif//⑥使能串口USART_Cmd(USART1, ENABLE); //使能串口 }

????????此代碼的編寫順序即USART的配置順序:

????????我們用標號①~⑥標 示了順序:

????????① 串口時鐘使能,GPIO 時鐘使能

????????② 串口復位

????????③ GPIO 端口模式設置

????????④ 串口參數初始化

????????⑤ 初始化 NVIC 并且開啟中斷

????????⑥ 使能串口

????????配置全雙工的串口 1,那么 TX(PA9) 管腳需要配置為推挽復用輸出,RX(PA10)管腳配置為浮空輸入或者帶上拉輸入。

????????模式配置參考下面表格:

????????使用了串口的中斷接收,必須在 usart.h 里面設置 EN_USART1_RX 為 1(默認設置就是 1 的) 。該函數才會配置中斷使能,以及開啟串口 1 的 NVIC 中斷。這里我們把串口 1 中斷放在組 2,優先級設置為組 2 里面的最低。

????????接下來,根據之前講解的步驟 7,還要編寫中斷服務函數。串口 1 的中斷服務函數 USART1_IRQHandler。

?USART1_IRQHandler 函數

????????void USART1_IRQHandler(void)函數是串口 1 的中斷響應函數,當串口 1 發生了相應的中斷后,就會跳到該函數執行。中斷相應函數的名字是不能隨便定義的,一般我們都遵循 MDK定義的函數名。這些函數名字在啟動文件 startup_stm32f10x_hd.s 文件中可以找到。

????????函數體里面通過函數:

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

????????判斷是否接受中斷,如果是串口接受中斷,則讀取串口接受到的數據:

Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數據

????????讀到數據后接下來就對數據進行分析。

????????這里我們設計了一個小小的接收協議:通過這個函數,配合一個數組 USART_RX_BUF[],一個接收狀態寄存器 USART_RX_STA(此寄存器其實就是一個全局變量,由作者自行添加。由于它起到類似寄存器的功能,這里暫且稱之為寄存器)實現對串口數據的接收管理。

????????USART_RX_BUF 的大小由 USART_REC_LEN 定義,也就是一次接收的數據最大不能超過USART_REC_LEN 個字節。USART_RX_STA 是一個接收狀態寄存器其各的定義如表 5.3.1.1 所示:

?

設計思路如下:

????????當接收到從電腦發過來的數據,把接收到的數據保存在 USART_RX_BUF 中,同時在接收狀態寄存器(USART_RX_STA)中計數接收到的有效數據個數,當收到回車(回車的表示由 2個字節組成:0X0D 和 0X0A)的第一個字節 0X0D 時,計數器將不再增加,等待 0X0A 的到來,而如果 0X0A 沒有來到,則認為這次接收失敗,重新開始下一次接收。

????????如果順利接收到 0X0A,則標記 USART_RX_STA 的第 15 位,這樣完成一次接收,并等待該位被其他程序清除,從而開始下一次的接收,而如果遲遲沒有收到 0X0D,那么在接收數據超過 USART_REC_LEN 的時候,則會丟棄前面的數據,重新接收。

????????中斷相應函數代碼如下:

void USART1_IRQHandler(void) //串口1中斷服務程序{u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾){Res =USART_ReceiveData(USART1); //讀取接收到的數據if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始else USART_RX_STA|=0x8000; //接收完成了 }else //還沒收到0X0D{ if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收 } }} } }

?

?main.c中的代碼

int main(void){ u16 t; u16 len; u16 times=0;delay_init(); //延時函數初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級uart_init(115200); //串口初始化為115200LED_Init(); //LED端口初始化KEY_Init(); //初始化與按鍵連接的硬件接口while(1){if(USART_RX_STA&0x8000){ len=USART_RX_STA&0x3fff;//得到此次接收到的數據長度printf("\r\n您發送的消息為:\r\n\r\n");for(t=0;t<len;t++){USART_SendData(USART1, USART_RX_BUF[t]);//向串口1發送數據while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束}printf("\r\n\r\n");//插入換行USART_RX_STA=0;}else{times++;if(times%5000==0){printf("\r\n精英STM32開發板 串口實驗\r\n");printf("正點原子@ALIENTEK\r\n\r\n");}if(times%200==0)printf("請輸入數據,以回車鍵結束\n"); if(times%30==0)LED0=!LED0;//閃爍LED,提示系統正在運行.delay_ms(10); }} }

????????NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)函數, 該函數是設置中斷分組號為 2,也就是 2 位搶占優先級和 2 位子優先級。

USART_SendData(USART1, USART_RX_BUF[t]); //向串口 1 發送數據while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

????????第一句,其實就是發送一個字節到串口。

????????第二句,就是我們在我們發送一個數據到串口之后,要檢測這個數據是否已經被發送完成了。USART_FLAG_TC 是宏定義的數據發送完成標識符。

下載驗證

?????? 首先打開串口調試助手。任何一個串口調試助手都是可以的。正點原子中使用的是舊版本的XCOM2.0。

?????????我們在程序上 面設置了必須輸入回車,串口才認可接收到的數據,所以必須在發送數據后再發送一個回車符, 這里 XCOM 提供的發送方法是通過勾選發送新行實現。

?????????只要勾選了這個選項,每次發送數據后,XCOM 都會自動多發一個回車(0X0D+0X0A)。設置好了發送新行,我們再在發送區輸入你想要發送的文字,然后單擊發送,就能實現發送數據。

?????????發送的數據被打印出來了,說明實驗成功。

總結

以上是生活随笔為你收集整理的【STM32学习笔记】(9)——串口通讯(USART)详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

精品国产精品久久一区免费式 | 亚洲女人天堂成人av在线 | 免费看网站在线 | 久久精品站| 中文在线√天堂 | 国产成人高清av | 欧美视频xxx | 中日韩欧美精彩视频 | www日韩欧美 | 亚州精品成人 | 麻豆传媒视频在线 | 97精品国产97久久久久久免费 | 婷婷久久一区二区三区 | 免费又黄又爽的视频 | 天天插天天狠天天透 | 日韩精品一区二区三区免费观看视频 | 在线免费av网站 | 久久亚洲私人国产精品va | 国产日韩欧美自拍 | 天天操天天舔天天干 | va视频在线观看 | 久久精品亚洲综合专区 | 黄色成年网站 | 亚州av免费| 五月婷婷综合久久 | 亚洲激情在线观看 | 亚洲精品乱码久久久久 | 91麻豆精品国产91久久久久久久久 | 国产精品不卡av | 色婷婷久久久综合中文字幕 | 久操伊人| 粉嫩av一区二区三区四区在线观看 | 五月天久久 | 91最新在线| 国产精品毛片久久久久久久 | 国产91成人 | 久久免费99 | 日韩电影在线观看中文字幕 | 色www免费视频 | 久久一区二区三区国产精品 | 免费在线观看视频一区 | 久久久久久久久久久国产精品 | 婷婷去俺也去六月色 | 成人在线电影观看 | 六月婷色 | 国产91精品看黄网站 | 亚洲精品一区二区久 | 久久一区精品 | 亚洲aⅴ免费在线观看 | 国产精品久久久久久久免费观看 | 五月天综合网站 | 欧美日韩伦理在线 | 日韩三级av | 国产一区视频免费在线观看 | 波多野结衣电影一区二区 | 欧美亚洲三级 | 五月天中文在线 | 丁香视频全集免费观看 | 欧美日韩在线免费视频 | 国产欧美在线一区 | 国产精品免费看久久久8精臀av | 97在线免费视频 | 国产最新视频在线 | 亚洲欧洲一区二区在线观看 | 免费a一级 | 中文字幕色网站 | 中文字幕资源在线观看 | 亚洲高清av | 欧美va天堂va视频va在线 | 欧洲精品一区二区 | 一区二区视频电影在线观看 | 国产一级在线观看 | www.黄色网.com | 美女网站在线免费观看 | 亚洲,国产成人av | 福利久久 | 国产精品久久99综合免费观看尤物 | 亚洲乱亚洲乱妇 | 亚洲最新视频在线 | 91在线一区| 久久婷婷国产色一区二区三区 | 99久久久免费视频 | 麻豆一区在线观看 | 精品一区二区在线播放 | 奇米四色影狠狠爱7777 | 国产一区二区精品久久 | 欧美不卡在线 | 亚洲欧美日韩国产一区二区 | 国产麻豆精品一区 | 看黄色.com | 麻豆国产精品视频 | 丁香激情婷婷 | 中文字幕国产在线 | 色狠狠一区二区 | av成人在线网站 | 精品久久一区二区三区 | 在线观看免费av网站 | 激情小说网站亚洲综合网 | 国产成本人视频在线观看 | 国产精品美女久久久久久久 | 99精品视频精品精品视频 | 国产精品黄 | 日韩av片无码一区二区不卡电影 | 久久官网 | 在线亚洲天堂网 | 日韩av在线看 | 亚洲女在线 | 日韩美一区二区三区 | 国产精品久久久久久久久久久久久 | 日本亚洲国产 | 亚洲色视频 | 香蕉手机在线 | 免费看黄在线观看 | 亚洲综合丁香 | 天天天色综合a | 亚洲精品xxxx| 91av视频在线播放 | 国产精品久久久久久久久久久久午夜 | 亚洲精品午夜久久久 | 九九热在线播放 | 草久久av| 久久综合色影院 | 久久人人爽 | 十八岁以下禁止观看的1000个网站 | 国产一区二区手机在线观看 | 人人干免费 | 中文网丁香综合网 | 亚洲精品乱码久久久久久蜜桃不爽 | 久久艹艹 | 97国产大学生情侣酒店的特点 | 亚洲欧美综合精品久久成人 | 波多野结衣精品 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 精品国产三级 | 中文字幕色在线视频 | 成年人视频免费在线 | 亚洲高清在线 | 欧美巨大荫蒂茸毛毛人妖 | 国产黄色精品在线观看 | 在线观看黄污 | 99一级片| 国产中文在线字幕 | 97精品在线观看 | 免费在线一区二区三区 | 97在线观看视频国产 | 成人在线观看免费视频 | 99热国产在线 | 欧美性色黄大片在线观看 | 亚洲理论片 | 午夜国产福利视频 | 久久久影片 | 18性欧美xxxⅹ性满足 | 久草com| 日日干夜夜草 | 婷婷丁香视频 | 人人看人人做人人澡 | 日韩精品久久久久久中文字幕8 | 午夜av免费观看 | av成人免费在线 | 久久1电影院 | 超碰国产在线观看 | 国产91粉嫩白浆在线观看 | 国产成人精品a | 一级片免费观看 | 国产精品99在线观看 | 97av色| 91伊人久久大香线蕉蜜芽人口 | 色综合天| 人人澡人人爽欧一区 | 97免费中文视频在线观看 | 国产亚洲欧美在线视频 | 黄色国产高清 | 国产一区二区久久久 | 中文字幕亚洲不卡 | 日韩av不卡播放 | 粉嫩高清一区二区三区 | 国产亚洲欧洲 | 国产精品一区二区三区久久 | 极品久久久久久久 | 欧美日韩国产在线 | 高清不卡一区二区在线 | 久久亚洲精品电影 | www99久久 | 久久综合给合久久狠狠色 | av大片网站 | 久草精品电影 | 99成人在线视频 | 天天操婷婷 | 日本精品视频在线观看 | 五月婷婷六月综合 | 玖玖精品视频 | 成人91免费视频 | 久久综合婷婷综合 | 国产免费亚洲高清 | 精品在线观看免费 | 911精品视频| 男女啪啪免费网站 | 久久久久视 | 中文国产在线观看 | 99色在线观看视频 | a视频在线看 | 69人人 | 日韩欧美国产免费播放 | 免费人成网ww44kk44 | 最近中文字幕免费观看 | 狠狠伊人 | 99国产一区 | 精品女同一区二区三区在线观看 | 97色婷婷成人综合在线观看 | 在线免费观看黄色 | 久草剧场 | 午夜视频在线观看一区二区三区 | 久久精品久久精品 | 日韩美一区二区三区 | 精品国产精品久久 | 精品一区二区三区久久久 | 美女精品在线观看 | 超碰成人网 | 久久久久久蜜桃一区二区 | 欧美一区二区在线免费观看 | 日韩av影视在线 | 五月天亚洲婷婷 | 国产成人一区二区三区免费看 | 国产专区在线 | 色妞久久福利网 | 亚洲成人av免费 | 不卡的av在线 | 91视频免费视频 | 免费视频黄色 | 国产精品久久在线观看 | 91在线中文 | 久久九九国产精品 | 亚洲成人黄色网址 | 在线视频 你懂得 | 黄色网址av| 中文字幕av网站 | 99综合电影在线视频 | 天天操天天干天天 | 波多野结衣久久资源 | 国产成人亚洲在线观看 | 久久这里有 | 国产一区精品在线观看 | 久久国产精品精品国产色婷婷 | 欧美日韩一区二区三区不卡 | 国产精品 日韩精品 | 波多野结衣久久精品 | 人人干免费 | 久久综合久色欧美综合狠狠 | 探花视频免费观看高清视频 | 国产美女精彩久久 | 亚洲精品在线视频网站 | 亚洲黄色免费网站 | 国产免费久久精品 | 国产美女视频免费 | 视频在线观看亚洲 | 四虎国产精品永久在线国在线 | 欧美日韩亚洲国产一区 | 亚州视频在线 | 欧美精品久久久久久久久久丰满 | 国产v在线播放 | 国产做aⅴ在线视频播放 | 欧美日韩不卡一区二区三区 | 免费福利片2019潦草影视午夜 | 婷婷色六月天 | www.91国产 | 亚洲精品在线播放视频 | 日韩av不卡在线观看 | 亚洲欧美乱综合图片区小说区 | 天天射天天射 | 日韩欧美一区二区三区视频 | 91最新网址在线观看 | 国产视频1区2区3区 久久夜视频 | 蜜臀av夜夜澡人人爽人人桃色 | 国产成人三级一区二区在线观看一 | 久久国产色| 2000xxx影视| 99情趣网视频 | 激情av资源 | 午夜久久影视 | 天天操天天干天天玩 | 国产无区一区二区三麻豆 | 在线看的av网站 | 日本69hd | 久久99亚洲热视 | 国产成人av电影在线观看 | 精品99免费视频 | 日本黄色免费看 | 久久综合色一综合色88 | 欧美久草视频 | 丁香六月在线观看 | 久久免费av电影 | 91精品视频一区二区三区 | 久久久精品二区 | 激情片av | 亚州精品在线视频 | 欧美一区二区三区在线视频观看 | 五月天com| 国产精品免费一区二区 | 成人av免费| 国产精品不卡 | 成人中文字幕在线观看 | 中文字幕在线观看免费观看 | av电影免费在线看 | 狠狠狠狠狠狠干 | 亚洲小视频在线观看 | 日精品 | 亚洲夜夜网 | 在线观看日本高清mv视频 | 欧美视频99 | 午夜视频在线观看一区二区 | 亚洲精品视频久久 | 欧美成人精品欧美一级乱 | 日韩在线一二三区 | 欧美日韩后 | 黄色片视频在线观看 | 久久综合久久八八 | 精品国产电影 | 成人国产精品一区 | 91视频免费观看 | 亚洲成年人免费网站 | 日韩中文字幕视频在线观看 | 亚洲精选视频在线 | 色婷婷影视| 成人久久综合 | 日批视频在线 | 天天操天天是 | 免费网站v| 日韩激情中文字幕 | 狠狠操夜夜操 | 成人a免费视频 | www.五月天色 | 久久久久久久看片 | 亚洲成人精品av | 中文字幕 国产视频 | 中文字幕在线观看不卡 | 最新午夜 | 色在线国产| 激情久久伊人 | 国产成人在线网站 | 国产粉嫩在线观看 | 久久久久成人免费 | 亚洲精品国产精品乱码不99热 | 久久免费国产电影 | 婷婷亚洲五月 | 国产中文在线播放 | 一区二区丝袜 | 亚洲欧美va | 97视频免费观看2区 亚洲视屏 | 久久人人爽人人爽人人片av免费 | 日韩免费一区二区 | 中文字幕文字幕一区二区 | 久久激情小说 | 又黄又爽又无遮挡免费的网站 | 国产视频二 | 精选久久 | 国产在线高清 | 久草在线免费播放 | 日日精品 | 国产探花在线看 | 欧美小视频在线观看 | 婷婷夜夜 | 激情欧美丁香 | 日韩精品免费在线观看视频 | 一区二区久久 | japanesefreesexvideo高潮| 视频在线在亚洲 | 国产剧情一区在线 | 免费欧美精品 | av天天在线观看 | 人人爽人人爽人人片av免 | 在线免费观看黄色 | 成人小电影在线看 | 国产高清在线看 | 成人av视屏| 国产手机在线观看视频 | 99久久精品国产欧美主题曲 | 激情综合一区 | 精品欧美一区二区精品久久 | 97人人精品 | 99草视频| 欧美日韩三级在线观看 | 国产一区二区三精品久久久无广告 | 人成免费网站 | 国产成人99av超碰超爽 | 亚洲精品在线二区 | 欧美日韩高清在线一区 | 五月丁香 | 日韩av电影免费在线观看 | 最近能播放的中文字幕 | 开心色激情网 | 在线免费国产视频 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 久久精品中文字幕免费mv | 中文字幕在线视频国产 | 91成人免费在线 | 99视屏| 人人干人人超 | 国产成人精品在线播放 | a精品视频| 日本中文字幕在线播放 | 国产午夜精品久久久久久久久久 | 免费男女羞羞的视频网站中文字幕 | 日韩午夜电影院 | 嫩草av在线 | 久久久久久久久久久免费 | 亚洲男男gaygay无套同网址 | 久产久精国产品 | 亚洲理论在线观看电影 | av视屏在线播放 | www.色午夜.com | 久久国产成人午夜av影院宅 | 在线观看一二三区 | 日韩一区二区三区视频在线 | 手机av在线网站 | www.激情五月.com | 国产日韩欧美视频在线观看 | 麻豆视频在线播放 | 二区精品视频 | 波多野结衣视频一区二区 | av久久久 | 中文字幕在线观看免费高清电影 | 91成年人网站 | 精品一区二区三区电影 | 亚洲91中文字幕无线码三区 | 亚洲涩涩网 | 免费在线观看av的网站 | 91av视频导航 | 97视频资源 | 亚洲伊人成综合网 | 亚洲国产精品电影在线观看 | 91人人揉日日捏人人看 | 日韩电影中文字幕在线观看 | 精品久久久久久久久久久久久久久久 | 精品美女视频 | 亚洲三区在线 | 婷婷丁香七月 | 久久99精品波多结衣一区 | 91成人国产 | 亚洲欧洲av在线 | 久久99国产精品免费 | 天天射天天搞 | 国产青春久久久国产毛片 | 国内精品久久久精品电影院 | 蜜臀av在线一区二区三区 | 日韩二区在线播放 | 99精品国自产在线 | 亚洲精品一区二区网址 | 在线 日韩 av | 久久久久国产一区二区三区 | 日韩av影视在线观看 | 久久久免费观看完整版 | 中文永久免费观看 | 久草在线视频中文 | 一本一本久久a久久精品综合妖精 | 人人射av| 国产经典 欧美精品 | 在线免费av观看 | 久久久久久高清 | 国产 日韩 中文字幕 | 成 人 黄 色 视频 免费观看 | 久久精品一区二区三区中文字幕 | 成片视频在线观看 | 国产成人精品午夜在线播放 | 国产精品第10页 | 亚洲精品一区二区三区四区高清 | 国产精品成人国产乱一区 | 正在播放 久久 | 久久久久欧美精品999 | 日日天天干 | 国产精品成人品 | 国产精品99久久免费黑人 | www成人精品 | 日韩精品1区2区 | 九九影视理伦片 | 一区二区三区不卡在线 | 91麻豆看国产在线紧急地址 | 久久成年人网站 | 国产区精品视频 | 日日碰狠狠添天天爽超碰97久久 | 最新av在线播放 | 国产在线1区 | 国产精品久久久久久久免费大片 | 中文网丁香综合网 | 91亚洲精品久久久中文字幕 | 婷婷亚洲五月 | 色婷婷导航 | 日日夜精品 | 99视频精品在线 | 国产精品原创视频 | 99久久国产免费,99久久国产免费大片 | 天天插狠狠插 | 8x成人在线 | 欧美有色| www国产亚洲精品久久麻豆 | 蜜桃视频成人在线观看 | 在线观看中文 | 免费三级在线 | 婷婷婷国产在线视频 | 97碰在线| 免费观看一级视频 | 91福利视频免费 | 国产一级片免费播放 | 中文字幕 在线 一 二 | 欧美一区在线看 | 99电影 | 在线播放日韩 | 国产又粗又猛又爽又黄的视频免费 | 97影视 | 久久观看最新视频 | 黄色一级网 | 91高清完整版在线观看 | 欧美黄污视频 | 国产男女无遮挡猛进猛出在线观看 | 色欧美综合 | 久久免费国产 | 欧美久久综合 | 色狠狠婷婷| 成人在线小视频 | 99精品视频免费观看视频 | 免费中文字幕在线观看 | 天堂网一区 | 九九免费在线观看视频 | 96国产精品| 亚洲一级片 | 国产亚洲精品久久久久久 | 亚洲精品国产精品国自产观看 | www久| 亚洲综合成人av | 综合国产在线 | 欧美亚洲精品在线观看 | 天天爽夜夜爽人人爽一区二区 | 久久艹影院 | 日本免费一二三区 | 一区二区三区免费在线 | 99热精品国产一区二区在线观看 | 最近中文字幕免费视频 | 激情综合交 | 欧美一区二区三区四区夜夜大片 | 日韩av电影免费观看 | 免费看一级特黄a大片 | 中文字幕免费观看视频 | av福利在线 | 午夜精品电影 | 麻豆精品国产传媒 | 国产精品原创在线 | 国产午夜精品久久久久久久久久 | 国产成年人av | 国产日韩在线播放 | 久久久精品网站 | 久草网站在线观看 | 亚洲国产精品资源 | 在线观看免费国产小视频 | 国产小视频在线观看免费 | 国产婷婷一区二区 | 欧美欧美 | 亚洲国产精品影院 | 精品视频亚洲 | 成年人免费在线观看网站 | av免费试看 | 国产又粗又长又硬免费视频 | av片在线观看 | 国产午夜激情视频 | 欧美综合久久久 | 免费在线日韩 | 96精品在线| 91精品一区二区三区久久久久久 | 超碰99人人 | 亚洲国产网站 | 久久久99精品免费观看乱色 | 久久精品久久久久电影 | 99久久精品国产欧美主题曲 | av一区二区三区在线播放 | 国产精品久久久久久爽爽爽 | 欧美日韩一区二区三区视频 | 在线观看黄色免费视频 | 九九久久免费视频 | 激情五月婷婷丁香 | 精品一区二区三区电影 | 久久手机在线视频 | 视频一区二区免费 | 国产伦精品一区二区三区… | 亚洲三区在线 | 麻花天美星空视频 | 欧美一二三专区 | 欧美一级片播放 | 久久免费在线观看视频 | 日韩二区三区在线 | 一区二区三区中文字幕在线 | www.夜色.com| 日韩av进入 | av黄色一级片 | 国产成人精品亚洲日本在线观看 | 九九九在线观看视频 | 成人午夜剧场在线观看 | 91传媒免费观看 | 欧美一区二区伦理片 | 免费看成人a | 日韩中文字幕在线观看 | 91九色porn在线资源 | 亚欧洲精品视频在线观看 | 久久久免费精品视频 | 国产精品欧美久久久久天天影视 | 久久综合亚洲鲁鲁五月久久 | 精品国产乱码一区二 | 人人干狠狠操 | av短片在线 | 毛片播放网站 | 97成人在线 | 天天操夜夜拍 | 亚洲免费色 | 日本精品免费看 | 日韩在线观看一区二区三区 | 欧美性直播 | 在线日韩av | 亚洲一区黄色 | 色综合久久久久综合体桃花网 | 国产精品亚洲综合久久 | 丁香久久五月 | 欧美国产日韩一区二区 | 国产精品激情在线观看 | 国产婷婷在线观看 | 久久久在线观看 | 久久久久久久久久久高潮一区二区 | 91久久精品一区二区二区 | 欧美日韩另类在线观看 | 亚洲国产福利视频 | 国产h片在线观看 | 久久精品电影 | 国产成a人亚洲精v品在线观看 | 天堂网在线视频 | 99精品在这里 | 免费男女羞羞的视频网站中文字幕 | 国产高清在线一区 | 在线视频app | 丁香影院在线 | 一区二区中文字幕在线播放 | 日韩激情视频 | 一区二区三区四区免费视频 | 91视频久久久久 | 在线天堂亚洲 | 国产视频2021 | 日韩电影在线观看中文字幕 | 人人玩人人爽 | 99久久婷婷国产综合精品 | 狠狠色丁香久久婷婷综 | 亚洲国产人午在线一二区 | 在线观看理论 | www久久精品 | 字幕网av | 美女网站在线播放 | 99热最新在线 | 欧美坐爱视频 | 国内精品久久久久久久久久 | 99免在线观看免费视频高清 | 日韩免费一二三区 | 国产精品久久久久久久久蜜臀 | 色香蕉在线视频 | 久久久久久久久久久国产精品 | 99久久99视频只有精品 | 日本在线观看视频一区 | 在线国产视频 | 色噜噜日韩精品一区二区三区视频 | 成人在线观看免费 | 四虎成人精品在永久免费 | 综合久久久 | 精品国产视频在线 | 日韩欧美在线高清 | 国产精品第十页 | adn—256中文在线观看 | 91尤物在线播放 | 日韩久久精品一区二区三区下载 | 一二区av | 天天干天天操天天操 | 99久久精品国产系列 | 久久免费久久 | 久久草网站 | 黄色三级在线观看 | 中文字幕在线一二 | 99精品国产免费久久 | 一 级 黄 色 片免费看的 | 国产精品成人免费精品自在线观看 | 免费黄色网止 | 日韩午夜精品福利 | 天天干夜夜干 | 免费视频网 | 亚洲综合欧美日韩狠狠色 | 人人爽人人av| 日韩精品在线免费播放 | 色在线亚洲 | 亚洲最新毛片 | 亚洲国产美女精品久久久久∴ | 日韩高清在线一区 | 最新动作电影 | 超碰在线成人 | 在线观看黄色 | 国产色视频一区二区三区qq号 | 久久爱影视i | 欧美日韩三区二区 | 在线观看中文字幕dvd播放 | 毛片网站在线观看 | 欧美精品一区二区蜜臀亚洲 | 日韩欧美视频免费观看 | 久久精品影视 | 国产在线自 | www亚洲视频| 日韩中文字幕在线观看 | 97国产大学生情侣酒店的特点 | 一区二区丝袜 | 日韩在线不卡av | 日韩高清毛片 | 国内久久久久久 | 久久这里只有精品视频99 | 丰满少妇在线观看网站 | 人人爱人人射 | 五月天综合婷婷 | 久久亚洲国产精品 | 婷婷色在线视频 | 99视频| 久久久久电影 | 亚洲精品国产第一综合99久久 | 天天舔天天射天天操 | 99热日本 | 黄色资源在线观看 | 久久五月天色综合 | www.五月激情.com | 亚洲精品午夜久久久久久久久久久 | 91成人网在线播放 | av福利免费 | 黄色成年 | 久久超碰在线 | 成人高清在线观看 | 国产97色 | 久久精品中文视频 | 欧美日韩p片 | 天天干干| 亚洲影视九九影院在线观看 | 久草久视频 | 91麻豆精品久久久久久 | 99久久久久 | 永久黄网站色视频免费观看w | 91香蕉久久 | 国产午夜亚洲精品 | 久草在线欧美 | 亚洲精品乱码久久久一二三 | 最新三级在线 | 狠狠色狠狠色综合日日小说 | 国产亚洲精品成人av久久影院 | 欧美性做爰猛烈叫床潮 | 国产毛片久久 | 精品美女久久 | 少妇高潮流白浆在线观看 | 国产手机在线视频 | 午夜体验区 | 一区三区在线欧 | 亚洲美女视频网 | 国产专区在线视频 | 美女搞黄国产视频网站 | 精品a在线 | 日韩精品中文字幕在线 | 中文字幕乱码在线播放 | 色香蕉在线 | 久久情侣偷拍 | 中文资源在线官网 | a视频在线观看免费 | 亚洲精品毛片一级91精品 | av中文字幕日韩 | av不卡免费在线观看 | 日韩精品中文字幕一区二区 | av网站在线观看免费 | 超碰97在线看 | 五月激情综合婷婷 | 98超碰在线观看 | 97超视频 | 亚洲成人精品国产 | 成人亚洲精品国产www | 色综合久久久久综合体 | 国产精品日韩久久久久 | 最近中文字幕高清字幕免费mv | 婷婷精品国产欧美精品亚洲人人爽 | 手机在线免费av | 99久久超碰中文字幕伊人 | 日韩欧美在线观看 | 久久久www| 97超碰国产精品女人人人爽 | 狠狠狠色丁香婷婷综合久久88 | 久久精彩视频 | 国产一区高清在线 | 在线观看视频91 | 97精品国产97久久久久久久久久久久 | 久久成人在线视频 | 国产精品18久久久久久首页狼 | 国产中年夫妇高潮精品视频 | japanesexxxxfreehd乱熟 | 五月综合色婷婷 | 久久99精品国产 | 成人久久视频 | 国产xxxx做受性欧美88 | 亚洲一级电影在线观看 | 97热在线观看 | 又黄又爽又湿又无遮挡的在线视频 | 久久久国产影视 | 9999精品视频 | 日韩精品一区二区在线观看 | 久草视频99 | 91精品婷婷国产综合久久蝌蚪 | 国产精品无av码在线观看 | 一本—道久久a久久精品蜜桃 | 69国产盗摄一区二区三区五区 | 九九九九精品 | 亚洲第一久久久 | 91在线视频免费播放 | 成人国产精品一区二区 | 天天艹天天干天天 | 欧美日韩性视频在线 | 亚洲精品1区2区3区 超碰成人网 | 色婷婷亚洲 | 超级碰碰碰碰 | 丝袜少妇在线 | 国产在线一线 | 在线色亚洲 | 日韩电影在线观看一区二区 | 在线观看日韩免费视频 | 欧美日韩不卡在线观看 | 天天操夜夜做 | 国产永久免费观看 | 免费看日韩片 | 久热只有精品 | 久久在草 | 狠狠狠色丁香婷婷综合久久88 | 五月天激情开心 | 美州a亚洲一视本频v色道 | 日韩丝袜视频 | 国产成人免费网站 | 探花视频免费观看 | 国产一区在线视频观看 | 日韩av一卡二卡三卡 | 九九九视频精品 | 日本夜夜草视频网站 | 中文字幕网站 | 一区二区三区免费网站 | 色六月婷婷| 欧美精品九九 | av成人在线电影 | 色视频在线 | 91网页版在线观看 | 国产99精品 | 激情图片区 | 久久国产精品一二三区 | 少妇性bbb搡bbb爽爽爽欧美 | 久久久网页 | 欧美在线观看视频一区二区 | 日韩丝袜视频 | 国产欧美综合在线观看 | 日本精品在线视频 | 日韩午夜电影 | 亚洲精品久久激情国产片 | 久草免费福利在线观看 | 欧美aaa视频 | 国产做aⅴ在线视频播放 | 国产小视频免费在线网址 | 在线看片一区 | 日韩激情久久 | 又黄又爽又色无遮挡免费 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 超碰日韩 | 在线观看亚洲国产 | 丁香婷婷久久久综合精品国产 | 五月婷婷丁香 | 久久精品国产亚洲精品2020 | 日韩高清精品免费观看 | 日韩在线高清免费视频 | 日韩欧美在线影院 | 毛片黄色一级 | 深夜国产在线 | 国产精彩视频 | 国产精品视频不卡 | 久草久草久草久草 | 国产黄在线 | 国产xxxx| 99久久精品免费看国产免费软件 | 国产亚洲精品日韩在线tv黄 | 国产精品欧美日韩在线观看 | 欧美成人日韩 | 国产成人av网 | 黄色成人影院 | 韩国av一区二区三区在线观看 | 日韩免费电影在线观看 | 视频二区在线视频 | 精品国产精品久久 | 麻豆视频免费在线观看 | 狠狠色丁香久久综合网 | 国产青草视频在线观看 | 91成人精品一区在线播放69 | 丁香婷婷综合激情五月色 | 婷婷久久综合九色综合 | 天天操人| 国产精品久久久久久久久久久久久久 | 4438全国亚洲精品在线观看视频 | 久久久久久99精品 | 国产精品高清免费在线观看 | 97色综合| 伊人午夜视频 | 日本aaaa级毛片在线看 | 成人在线视频免费 | 日韩欧美一区二区在线播放 | 超碰在线国产 | 伊人激情综合 | 少妇性xxx | av青草| 日本最新一区二区三区 | 日日干干夜夜 | 天天干天天摸天天操 | 欧美成人h版 | www.夜色321.com | 综合在线观看色 | 成人高清在线观看 | 不卡电影免费在线播放一区 | 免费情缘 | 日韩在线观看a | 麻豆91精品91久久久 | 五月激情丁香图片 | 欧美日韩精品在线观看视频 | 午夜视频在线网站 | 日韩av成人在线 | 这里只有精品视频在线观看 | 成人av一区二区在线观看 | 五月婷久久 | 久久综合色影院 | 激情视频免费在线观看 | 日本精品va在线观看 | 四虎4hu永久免费 | 伊人婷婷久久 | 亚洲h在线播放在线观看h | 久草在线免费资源站 | 天堂网一区二区三区 | 久操视频在线免费看 | 国产在线国偷精品产拍免费yy | 在线精品一区二区 | 成人在线中文字幕 | 三上悠亚一区二区在线观看 | 久久久精华网 | 91av资源在线 | 日韩av黄| 美女国产在线 | 久久爱综合 | 国产精品视频app | 国产美女久久久 | 国模一区二区三区四区 | 园产精品久久久久久久7电影 | 国产精品18videosex性欧美 | 国产中文视频 | 亚洲精品玖玖玖av在线看 | 精品一区二区在线免费观看 | 中文字幕中文字幕 | 91高清不卡 | 丁香六月中文字幕 | 美女av在线免费 | 久操视频在线 | 久久久噜噜噜久久久 | 国产精品二区在线观看 | 久久国产亚洲精品 | 日韩久久精品一区二区三区下载 | 欧美作爱视频 | 日本爱爱片 | 天天舔天天射天天操 | 国产精品成人免费一区久久羞羞 | 亚洲精品av中文字幕在线在线 | 天天·日日日干 | 一区二区丝袜 | av片在线观看 | 麻豆一精品传二传媒短视频 | 日韩免费网址 | 国产96精品| 国产中文| 91精品视频在线免费观看 | 日韩在线资源 | 日韩欧美区 | 中文字幕刺激在线 | 五月视频 | 最新av在线播放 | 亚洲欧美在线综合 | 最新不卡av| 成人av在线直播 | 久久久久久久网 | 美女一二三区 | 午夜久久美女 | 亚洲91av| 精品久久一二三区 | 免费看黄电影 | 欧美另类z0zx | 99视频国产精品 | 99这里只有精品视频 | 国产精品 国产精品 | 中文不卡视频 | 中文字幕在线日本 | 精品国产成人在线 | 在线看片视频 | 中文字幕在线观看视频免费 |