STM32學習筆記-ustar串列埠通訊

通用同步非同步收發器(USART)提供了一種靈活的方法與使用工業標準NRZ非同步序列資料格式的 外部裝置之間進行全雙工資料交換。USART利用分數波特率發生器提供寬範圍的波特率選擇。 它支援同步單向通訊和半雙工單線通訊,也支援LIN(區域性網際網路),智慧卡協議和IrDA(紅外資料 組織)SIR ENDEC規範,以及調變解調器(CTS/RTS)操作。它還允許多處理器通訊。 使用多緩衝器配置的DMA方式,可以實現高速資料通訊。

物理層

1。通訊結構

串列埠通訊的物理層的主要標準是

RS-232標準

,其規定了訊號的用途、通訊介面及訊號的電平標準,其通訊結構如下:

STM32學習筆記-ustar串列埠通訊

在裝置內部訊號是以TTL電平標準傳輸的,裝置之間是透過RS-232電平標準傳輸的,而且TTL電平需要經過電平轉換晶片才能轉化為RS-232電平,RS-232電平轉TTL電平也是如此。

2。電平標準

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

STM32學習筆記-ustar串列埠通訊

在電子電路中常使用TTL的電平標準,但其抗干擾能力較弱,為了增加串列埠的通訊距離及抗干擾能力,使用RS-232電平標準在裝置之間傳輸資訊,經常使用

MA3232晶片

對TTL電平及RS-232電平進行相互轉換。

協議層——RS232協議

開始位 +資料位 +奇偶檢驗位 +停止位數: 1        5~8         0~1          1~2 電平: 0        0/1          0/1             1

開始位:產生 1 個下降沿,通知接收裝置,準備接收資料。

資料位:7/8 位 —— 儲存位元組為單位/ascii 碼 —— 8 位為主

奇偶校驗位:奇偶校驗 —— 判斷資料在傳送過程中是否出現錯誤 —— 一般不使用(現在使用 CRC 校驗) ,判斷資料位中 1 的個數+奇偶位中 1 的個數。

奇校驗:位數必須為奇數

偶校驗:位數必須為偶

停止位:1~2 位,高電

波特率的計算公式:

STM32學習筆記-ustar串列埠通訊

PCLK2 —— APB2 時鐘 —— 72MHz

公式中已知量:fck 和波特率

求得USARTDIV = fck/(波特率*16)

例如:假設波特率為 9600

USARTDIV = 468。75

波特率暫存器:

STM32學習筆記-ustar串列埠通訊

電腦連線串列埠需要用到usb轉串列埠模組,帶鬧鬧需要安裝CH340的驅動

STM32學習筆記-ustar串列埠通訊

實現串列埠通訊的基本步驟:

1,配置 GPIO 口模式

2,配置 USART1

2。1 開啟 USART1 的時鐘

2。2 USART1:全雙工、RS232 協議+波特率

2。3 使能串列埠

3,編寫資料收發函式

oid Usart_Config(void){ //配置埠 PA9 PA10 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //2。配置埠 GPIO_InitTypeDef GPIO_PortA;//定義結構體變數 GPIO_PortA。GPIO_Speed = GPIO_Speed_50MHz;//速度 GPIO_PortA。GPIO_Mode = GPIO_Mode_IN_FLOATING;//模式 GPIO_PortA。GPIO_Pin = GPIO_Pin_10; //引腳 GPIO_Init(GPIOA,&GPIO_PortA); GPIO_PortA。GPIO_Mode = GPIO_Mode_AF_PP;//模式 GPIO_PortA。GPIO_Pin = GPIO_Pin_9;//引腳 GPIO_Init(GPIOA,&GPIO_PortA); //USART配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); USART_InitTypeDef USART_InitStructure;//定義結構體 USART_InitStructure。USART_BaudRate = 115200; //定義波特率 USART_InitStructure。USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure。USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_InitStructure。USART_Parity = USART_Parity_No; USART_InitStructure。USART_StopBits = USART_StopBits_1; USART_InitStructure。USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &USART_InitStructure);//初始化 USART_Cmd(USART1, ENABLE);//使能}//傳送函式void Usart1_Tx(uint16_t data){ //傳送資料時,確保前面的資料傳送完成 while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==0) {}; USART_SendData(USART1,data);}//接受資料uint16_t Ustart1_Rx(void){ uint16_t data; //接受資料時,確保前面的資料接受完成 while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==0) {}; data = USART_ReceiveData(USART1); return data;}int fputc(int c, FILE * str){ Usart1_Tx(c); return c;}

重寫fputc函式可以實現像串列埠輸出資料的功能,同時需要在設定中進行以下配置,然後我們就可以在程式中使用printf函式像串列埠除錯軟體輸出資料。

STM32學習筆記-ustar串列埠通訊