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

歷史上的今天

今天是:2024年12月23日(星期一)

正在發生

2021年12月23日 | STM32串口通信-USART全面講解

發布者:sumig 來源: eefocus關鍵字:STM32  串口通信  USART 手機看文章 掃描二維碼
隨時隨地手機看文章

通用同步異步收發器(Universal Synchronous Asynchronous Receiver and Transmitter)是一個全雙工的串行通信設備;UART(Universal Asynchronous Receiver and Transmitter)是在USART基礎上裁掉了同步通信功能,只有異步通信。


USART滿足外部設備對工業標準NRZ異步串行數據格式的要求,并且使用了小數波特率發生器,可以提供多種波特率。USART支持同步單向通信和半雙工單線通信;還支持局域互連網絡、智能卡協議與LrDA SIR ENDEC規范;還支持DMA,可實現高速數據通信。


如下圖是USART功能框圖,我們將對此框圖進行分析。

1.功能引腳

TX:發送數據輸出引腳


RX:接收數據輸入引腳


SW_RX:數據接收引腳,內部引腳,只用于單線和智能卡模式


nRTS:發送請求輸出端,n表示低電平有效。如果是能RTS流控制,當USART接收器準備好接收新的數據時會將nRTS編程低電平;當接收寄存器已滿時,nRTS將會被設置為高電平,該引腳至適用于硬件流控制。


nCTS:請求發送輸入端,n表示低電平有效。如果使能CTS流控制,發送器在發送下一幀數據之前會檢測nCTS引腳,如果為低電平則發送數據,如果為高電平則在發送完當前數據之后停止發送,該引腳只適用于硬件流控制。


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


注意:UART只有異步傳輸功能,故沒有SCLK、nRTS和nCTS引腳。


2.數據寄存器

USART數據寄存器(USART_DR)包含TDR和RDR,兩者是介于系統總線和移位寄存器之間,只有低9位或低8有效,兩者選擇取決于USART控制寄存器1(USART_CR1)的M位,M=0為8位數據字長,M=1為9位數據字長。


3.控制器

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


發送器:


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


如下,字符發送時序圖所示,一個字符幀發送需要三個部分:起始位+數據幀+停止位。起始位是一個位周期的低電平;數據幀是我們發送的8位或9位數據;停止位是一定時間周期的高電平,可以設置為0.5、1、1.5、2個停止位,默認使用1個停止位,2個停止位適用于USART模式、單線模式和調制解調器模式,0.5和1.5適用于智能卡模式。

發送數據重要的標志位

image.png

接收器


如果USART_CR1的RE置位,使能USART接受,使得接收器在RX線開始搜索起始位。接收數據時,幾個比較重要的標志位如下

image.png

4.小波特率生成

波特率指數據信號對載波的調制速率,它用單位時間內載波調制狀態改變次數來表示,單位為波特。比特率指單位時間內傳播的比特數。對于USART波特率與比特率相等。


USART的發送器和接收器使用相同的波特率,計算公式如下

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


5.校驗控制

USART支持奇偶校驗。使用校驗位時,串口傳輸的數據長度將是在8位的數據幀基礎上加上1位,此時需要將USART_CR1的M為置1,然后將USART_CR1的PCE置1啟動奇偶校驗。


奇偶校驗在發送和接收都是由硬件自動完成,如果在接收出現奇偶校驗失敗,會將USART_SR的PE置1,并可以產生奇偶校驗中斷。


6.中斷控制

USART有多個中斷請求事件,如下

image.png

7.USART初始化結構體詳解

HAL庫函數對每個外設都建立了一個初始化結構體和初始化配置函數,如USART_InitTypeDef和USART_Init(),USART_InitTypeDef用于配置外設工作參數,USART_Init()則將參數配置到相應的寄存器。


typedef struct {

 uint32_t BaudRate; //波特率

 uint32_t WordLength; //字長

 uint32_t StopBits; //停止位

 uint32_t Parity; //校驗位

 uint32_t Mode; //UART 模式

 uint32_t HwFlowCtl; //硬件流控制

 uint32_t OverSampling; // 過采樣模式

 uint32_t CLKLastBit; // 最尾位時鐘脈沖

} USART_InitTypeDef;

BaudRate:波特率設置。一般設置為 2400、9600、19200、115200。HAL 庫函數會根據設定值計算得到 UARTDIV 值。

WordLength:數據幀字長,可選 8 位或 9 位。

StopBits:停止位設置,可選 0.5 個、1 個、1.5 個和 2 個停止位。

Parity : 奇 偶 校 驗 控 制 選 擇 , 可 選 USART_PARITY_NONE ( 無校驗 ) 、USART_PARITY_EVEN (偶校驗)以及 USART_PARITY_ODD (奇校驗)。

Mode:UART 模式選擇,有 USART_MODE_RX 和 USART_MODE_TX,允許使用邏輯或運算選擇兩個,它設定 USART_CR1 寄存器的 RE 位和 TE 位。

8.編程要點

1) 使能 RX 和 TX 引腳 GPIO 時鐘和 USART 時鐘;


2) 初始化 GPIO,并將 GPIO 復用到 USART 上;


3) 配置 USART 參數;


4) 配置中斷控制器并使能 USART 接收中斷;


5) 使能 USART;


6) 在 USART 接收中斷服務函數實現數據接收和發送


9.代碼分析

GPIO和USART宏定義


//串口波特率

#define DEBUG_USART_BAUDRATE                    115200

 

//引腳定義

/*******************************************************/

#define DEBUG_USART                             USART1

#define DEBUG_USART_CLK_ENABLE()                __HAL_RCC_USART1_CLK_ENABLE();

 

#define DEBUG_USART_RX_GPIO_PORT                GPIOA

#define DEBUG_USART_RX_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE()

#define DEBUG_USART_RX_PIN                      GPIO_PIN_10

 

#define DEBUG_USART_TX_GPIO_PORT                GPIOA

#define DEBUG_USART_TX_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOA_CLK_ENABLE()

#define DEBUG_USART_TX_PIN                      GPIO_PIN_9

 

#define DEBUG_USART_IRQHandler                  USART1_IRQHandler

#define DEBUG_USART_IRQ                      USART1_IRQn

/************************************************************/

 

void Usart_SendString(uint8_t *str);

void DEBUG_USART_Config(void);

int fputc(int ch, FILE *f);

int fgetc(FILE *f);

extern UART_HandleTypeDef UartHandle;

USART初始化配置。函數體中UartHandle 是定義為 UART_HandleTypeDef 結構體類型的全局變量,它管理著串口的所有配置,該函數與硬件無關。


具體的MCU底層硬件相關的配置如引腳、時鐘、DMA、中斷等等是在HAL_UART_MspInit(UART_HandleTypeDef *huart)中完成,該函數被HAL_UART_Init 函數所調用,所以我們只需要重新定義HAL_UART_MspInit函數即可完成底層硬件的配置。


/**

  * @brief  DEBUG_USART GPIO 配置,工作模式配置。115200 8-N-1

  * @param  無

  * @retval 無

  */  

void DEBUG_USART_Config(void)

  

  UartHandle.Instance          = DEBUG_USART;

  

  UartHandle.Init.BaudRate     = DEBUG_USART_BAUDRATE;

  UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;

  UartHandle.Init.StopBits     = UART_STOPBITS_1;

  UartHandle.Init.Parity       = UART_PARITY_NONE;

  UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;

  UartHandle.Init.Mode         = UART_MODE_TX_RX;

  

  HAL_UART_Init(&UartHandle);

   

 /*使能串口接收斷 */

  __HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);  

}

/**

  * @brief UART MSP 初始化 

  * @param huart: UART handle

  * @retval 無

  */

void HAL_UART_MspInit(UART_HandleTypeDef *huart)

{  

  GPIO_InitTypeDef  GPIO_InitStruct;

  

  DEBUG_USART_CLK_ENABLE();

DEBUG_USART_RX_GPIO_CLK_ENABLE();

  DEBUG_USART_TX_GPIO_CLK_ENABLE();

  

/**USART1 GPIO Configuration    

  PA9     ------> USART1_TX

  PA10    ------> USART1_RX 

  */

  /* 配置Tx引腳為復用功能  */

  GPIO_InitStruct.Pin = DEBUG_USART_TX_PIN;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_PULLUP;

  GPIO_InitStruct.Speed =  GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStruct);

  

  /* 配置Rx引腳為復用功能 */

  GPIO_InitStruct.Pin = DEBUG_USART_RX_PIN;

  GPIO_InitStruct.Mode=GPIO_MODE_AF_INPUT; //模式要設置為復用輸入模式!

  HAL_GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStruct); 

 

  HAL_NVIC_SetPriority(DEBUG_USART_IRQ ,0,1); //搶占優先級0,子優先級1

  HAL_NVIC_EnableIRQ(DEBUG_USART_IRQ );     //使能USART1中斷通道  

}

字符發送函數


/*****************  發送字符串 **********************/

void Usart_SendString(uint8_t *str)

{

unsigned int k=0;

  do 

  {

      HAL_UART_Transmit(&UartHandle,(uint8_t *)(str + k) ,1,1000);

      k++;

  } while(*(str + k)!='

主站蜘蛛池模板: 宜黄县| 大新县| 翁牛特旗| 聂荣县| 彭泽县| 宣汉县| 郓城县| 新巴尔虎右旗| 建湖县| 白水县| 三明市| 乳源| 西充县| 农安县| 大新县| 同心县| 吉水县| 呈贡县| 左权县| 邯郸县| 无棣县| 桃园市| 通河县| 西峡县| 福泉市| 保定市| 南皮县| 博野县| 右玉县| 秦皇岛市| 江源县| 勃利县| 和龙市| 宿州市| 民县| 东乡县| 东台市| 盱眙县| 鹤岗市| 榆社县| 子长县|