娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年09月02日(星期一)

正在發生

2021年09月02日 | STM32—串口通訊詳解

發布者:星空行者 來源: eefocus關鍵字:STM32  串口通訊  物理層  協議層 手機看文章 掃描二維碼
隨時隨地手機看文章

串口通訊(Serial Communication)是一種設備間非常常用的串行通訊方式,因為它簡單便捷,因此大部分電子設備都支持該通訊方式,其通訊協議可分層為協議層和物理層。物理層規定通信協議中具有機械、電子功能的特性,從而確保原始數據在物理媒體的傳播;協議層主要規定通訊邏輯,統一雙方的數據打包、解包標準。通俗的講物理層規定我們用嘴巴還是肢體交流,協議層規定我們用中文還是英文交流。下面分析一下串口通訊協議的物理層和協議層。


物理層

1.通訊結構

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

在這里插入圖片描述

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


2.電平標準

根據使用的電平標準不同,串口通訊可分為 RS-232標準 及TTL標準,具體標準如下:

在這里插入圖片描述

在電子電路中常使用TTL的電平標準,但其抗干擾能力較弱,為了增加串口的通訊距離及抗干擾能力,使用RS-232電平標準在設備之間傳輸信息,經常使用MA3232芯片對TTL電平及RS-232電平進行相互轉換。


協議層

1.數據包

串口通訊的數據包由發送設備通過自身的TXD接口傳輸到接收設備得RXD接口,在協議層中規定了數據包的內容,具體包括起始位、主體數據(8位或9位)、校驗位以及停止位,通訊的雙方必須將數據包的格式約定一致才能正常收發數據。

在這里插入圖片描述

2.波特率

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

3.起始和停止信號

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

4.有效數據

有效數據規定了主題數據的長度,一般為8或9位,其在STM32中也是通過串口初始化結構體來實現的。

5.數據校驗

在有效數據之后,有一個可選的數據校驗位。由于數據通信相對更容易受到外部干擾導致傳輸數據出現偏差,可以在傳輸過程加上校驗位來解決這個問題。校驗方法有奇校驗(odd)、偶校驗(even)、 0 校驗(space)、 1 校驗(mark)以及無(noparity)。這些也都可以在串口初始化結構體中實現的。


USART簡介

USART(通用同步異步收發器)是一個串行通信設備,可以靈活地與外部設備進行全雙工數據交換。有別于 USART 還有一個UART,它是在 USART 基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸出,我們平時用的串口通信基本都是 UART。USART 在 STM32 應用最多莫過于“打印”程序信息,一般在硬件設計時都會預留一USART 通信接口連接電腦,用于在調試程序是可以把一些調試信息“打印”在電腦端的串口調試助手工具上,從而了解程序運行是否正確、如果出錯哪具體哪里出錯等等。

STM32中一共有5個USART,如示:

在這里插入圖片描述

USART的USB轉串口原理圖如下:

在這里插入圖片描述

USART1的發送和接收端口是事先連接好的,如果要使用其他USART只需要將相應的發送接收端口按圖連接好即可。


USART有多個中斷請求事件:

在這里插入圖片描述

開發板與上位機的連接

開發板與上位機之間通過USB線連接,所以在上位機上要配置一個USB轉串口 的驅動,以便把USB傳輸過來的電平轉換為TTL電平,TTL電平才能與串口調試助手建立聯系。一般使用CH341驅動作為win10下的USB轉串口,驅動安裝成功的情況下接入USB會在計算機的設備管理器的端口中發現串口:

在這里插入圖片描述

(win7系統一般選擇CH340作為USB轉串口驅動。)


代碼講解:

固件庫編程的一大好處就是我們可以根據固件庫函數來學習外設的相關知識,而且固件庫函數的編寫都是建立在對底層寄存器操作上的,所以通過講解代碼可以更好理解串口通訊相關知識。


一.初始化結構體

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初始化結構體中的相應變量都對應著數據包中的相對內容。


二.NVIC配置中斷優先級

我們在串口接收信息時采用了觸發中斷事件,所以要配置一下串口中斷的優先級:


NVIC_Configuration(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  

  /* 嵌套向量中斷控制器組選擇 */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  

  /* 配置USART為中斷源 */

  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;

  /* 搶斷優先級*/

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  /* 子優先級 */

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  /* 使能中斷 */

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  /* 初始化配置NVIC */

  NVIC_Init(&NVIC_InitStructure);

}


中斷相關的知識之前詳細講過,此處就不再累贅講述。

中斷知識鏈接


三.USART配置函數講解

USART配置函數的主要作用是打開串口與相應的GPIO引腳,配置好相應串口信息與GPIO引腳的工作模式,以便信息的傳輸與接收。


void DEBUG_USART_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

/* 第一步:初始化GPIO */

// 打開串口GPIO的時鐘

DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);

// 將USART Tx的GPIO配置為推挽復用模式

GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);


  // 將USART Rx的GPIO配置為浮空輸入模式

GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);

/* 第二步:配置串口的初始化結構體 */

// 打開串口外設的時鐘

DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

// 配置串口的工作參數

// 配置波特率

USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;

// 配置 針數據字長

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

// 配置停止位

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(DEBUG_USARTx, &USART_InitStructure);


/*--------------------------------------------------------*/

// 串口中斷優先級配置

NVIC_Configuration();

// 使能串口接收中斷

USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);

/*--------------------------------------------------------*/

/* 第三步:使能串口 */

// 使能串口

USART_Cmd(DEBUG_USARTx, ENABLE);

}


第一步:打開了GPIO的時鐘,設置發送和接收引腳的信息,將Tx(發送引腳)配置為推挽復用模式用來發送數據,Rx(接收引腳)配置為浮空輸入模式用來接收數據。


第二步:首先打開USART1 的時鐘,根據USART初始化結構體成員配置相關的信息,之后利用初始化函數將初始化結構體中的信息寫入相應寄存器中,然后的話就是引用NVIC_Configuration()函數配置串口中斷優先級,打開相應的串口接收中斷,中斷接收函數的參數如下:

在這里插入圖片描述

第三步 :最后相當于打開總電源——使能串口


USART配置函數完成后代表,USART1 的接收和發送準備工作已經準備就緒,接下來就是,串口與上位機之間的信息傳遞了,信息的發送和接收都有相對于的函數。


四.傳輸數據的函數:

開發板與上位機之間的數據傳輸可以有多種方法,下面一一介紹:


1.發送一個字節

以USART_SendData(pUSARTx,ch); 函數為基礎建立的函數可以向上位機發送一個字節的數據,利用FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG) 讀取發送數據寄存器的狀態來 等待發送寄存器將數據成功發送。


void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)

{

/* 發送一個字節數據到USART */

USART_SendData(pUSARTx,ch);

/* 等待發送數據寄存器為空 */

while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);

}


2.發送字符串

本質是利用上面的字節發送函數逐位發送字符串中的內容


void USART_SendString(USART_TypeDef * pUSARTx, char *str)

{

unsigned int   k=0;

while(*(str+k)!='

主站蜘蛛池模板: 溧水县| 于都县| 根河市| 呈贡县| 衡水市| 辽宁省| 边坝县| 桐柏县| 乌什县| 昌乐县| 莲花县| 遂川县| 河津市| 乌鲁木齐县| 崇阳县| 青海省| 南丰县| 册亨县| 沾化县| 遂川县| 商水县| 保康县| 肥西县| 鄂托克旗| 陵川县| 祁连县| 金华市| 吴旗县| 西峡县| 米林县| 昌黎县| 义马市| 龙川县| 勃利县| 彝良县| 马公市| 绿春县| 临潭县| 伊川县| 隆安县| 曲周县|