STM32F103學習筆記三 串口通信

2021-01-08 電子工程世界

1、串口通信背景知識

1.1、 設備之間的通信方式

並行通信 串行通信

傳輸原理 數據各個位同時傳輸 數據按位順序傳輸

優點 速度快 佔用引腳資源少

缺點 佔用引腳資源多 速度相對較慢

1.2、 串行通信分類

1.2.1、按照通信方式,分為:

同步通信:帶時鐘同步信號傳輸。比如:SPI,I²C通信接口

異步通信:不帶時鐘同步信號。比如:UART(通用異步收發器),單總線


1.2.2、按照數據傳送方向,分為:

單工:數據傳輸只支持數據在一個方向上傳輸;

半雙工:允許數據在兩個方向上傳輸。但是,在某一時刻,只允許數據在一個方向上傳輸,它實際上是一種切換方向的單工通信;它不需要獨立的接收端和發送端,兩者可以合併一起使用一個埠。

全雙工:允許數據同時在兩個方向上傳輸。因此,全雙工通信是兩個單工通信方式的結合,需要獨立的接收端和發送端。


1.3、常見的串行通信接口


2、STM32的串口通信基礎

2.1、STM32的串口通信接口有兩種,分別是:

UART(通用異步收發器)、

USART(通用同步異步收發器)、

對於大容量STM32F10x系列晶片,分別有3個USART和2個UART。


2.2、UART引腳連接方法

① 單片機連接單片機


RXD:數據輸入引腳,數據接受

TXD"數據發送引腳,數據發送


對於兩個晶片之間的連接,兩個晶片GND共地,同時TXD和RXD交叉連接。這裡的交叉連接的意思就是,晶片1的RxD連接晶片2的TXD,晶片2的RXD連接晶片1的TXD。這樣,兩個晶片之間就可以進行TTL電平通信了

② 單片機連接PC


若是晶片與PC機(或上位機)相連,除了共地之外,就不能這樣直接交叉連接了。儘管PC機和晶片都有TXD和RXD引腳,但是通常PC機(或上位機)通常使用的都是RS232接口,因此不能直接交叉連接。RS232接口是9針(或引腳),通常是TxD和RxD經過電平轉換得到的。而單片機採用的是 TTL電平,所以需要 連接一個RS232轉換器 將TTL電平轉換成 PC可以識別的RS232電平,再交叉連接。

經過電平轉換後,晶片串口和rs232的電平標準是不一樣的:


單片機的電平標準(TTL電平):+5V表示1,0V表示0;

Rs232的電平標準:+15/+13 V表示1,-15/-13表示0。


RS-232通訊協議標準串口的設備間通訊結構圖如下:

所以單片機串口與PC串口通信就應該遵循下面的連接方式:

在單片機串口與上位機給出的rs232口之間,通過電平轉換電路(如下面圖中的Max232晶片) 實現TTL電平與RS232電平之間的轉換。


2.3、UART異步通信特點

全雙工異步通信;

分數波特率發生器系統,提供精確的波特率。發送和接受共用的可編程波特率,最高可達4.5Mbits/s;

可編程的數據字長度(8位或者9位);

可配置的停止位(支持1或者2位停止位);

可配置的使用DMA多緩衝器通信;

單獨的發送器和接收器使能位;

檢測標誌:① 接受緩衝器 ②發送緩衝器空 ③傳輸結束標誌;

多個帶標誌的中斷源,觸發中斷;

其他:校驗控制,四個錯誤檢測標誌。

2.4、STM32串口異步通信需要定義的參數

STM32異步通信參數:

①起始位

②數據位(8位或者9位)

③奇偶校驗位(第9位)

④停止位(1,15,2位)

⑤波特率設置

(奇偶校驗位分為奇校驗和偶校驗兩種,是一種簡單的數據誤碼校驗方法。奇校驗是指每幀數據中,包括數據位和奇偶校驗位的全部9個位中1的個數必須為奇數;偶校驗是指每幀數據中,包括數據位和奇偶校驗位的全部9個位中1的個數必須為偶數。

校驗方法除了奇校驗(odd)、偶校驗(even)之外,還可以有:0 校驗(space)、1 校驗(mark)以及無校驗(noparity)。 0/1校驗:不管有效數據中的內容是什麼,校驗位總為0或者1)

UART串口通信的數據包以幀為單位,常用的幀結構為:1位起始位+8位數據位+1位奇偶校驗位(可選)+1位停止位。如下圖所示


2.5、 UART(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)


2.6、 串口通信過程

① 數據接收過程

外部設備將數據發送到 串行輸入移位寄存器,串行輸入移位寄存器在將數據傳送到輸入數據緩衝器,MCU在從輸入數據緩衝器中讀出數據

② 數據發送過程

MCU將要發送的數據寫入輸出數據緩衝器,輸出數據緩衝器在將數據寫入串行輸出移位寄存器,串行移位寄存器在將數據輸出到外部設備


3、 串行通信的編程

3.1、串口通信的相關寄存器

3.1.1、 USART_SR狀態寄存器

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);


3.1.2、 USART_DR數據寄存器

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


3.1.3、 USART_BRR波特率寄存器

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


波特率計算方法:



3.2、 串口操作相關庫函數(省略入口函數):

**void USART_Init();** //串口初始化:波特率,數據字長,奇偶校驗,硬體流控以及收發使能

**void USART_Cmd();**//使能串口

**void USART_ITConfig();**//使能相關中斷


**void USART_SendData();**//發送數據到串口,DR

**uint16_t USART_ReceiveData();**//接受數據,從DR讀取接受到的數據


**FlagStatus USART_GetFlagStatus();**//獲取狀態標誌位

**void USART_ClearFlag();**//清除狀態標誌位

**ITStatus USART_GetITStatus();**//獲取中斷狀態標誌位

**void USART_ClearITPendingBit();**//清除中斷狀態標誌位


3.3、 串口配置一般步驟:

串口時鐘使能,GPIO時鐘使能:RCC_APB2PeriphClockCmd();

串口復位:USART_DeInit(); 這一步不是必須的

GPIO埠模式設置:GPIO_Init(); 模式設置為GPIO_Mode_AF_PP

串口參數初始化:USART_Init();

開啟中斷並且初始化NVIC(如果需要開啟中斷才需要這個步驟) NVIC_Init();

USART_ITConfig();

使能串口:USART_Cmd();

編寫中斷處理函數:USARTx_IRQHandler();

串口數據收發:

void USART_SendData();//發送數據到串口,DR

uint16_t USART_ReceiveData();//接受數據,從DR讀取接受到的數據

串口傳輸狀態獲取:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

4、 串口編程

(參照3.2、3.3的章節,其中有關於代碼配置的步驟)

usart.c


//串口1中斷服務程序

u8 USART_RX_BUF[USART_REC_LEN];     //接收緩衝,最大USART_REC_LEN個字節.

//接收狀態

//bit15, 接收完成標誌

//bit14, 接收到0x0d

//bit13~0, 接收到的有效字節數目

u16 USART_RX_STA=0;       //接收狀態標記   

  

void uart_init(u32 bound)

{

  //GPIO埠設置

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時鐘

 

//USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推輓輸出

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

   

  //USART1_RX   GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  


  //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶佔優先級3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器

  

   //USART 初始化設置


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); //初始化串口1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟串口接受中斷

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


}


void USART1_IRQHandler(void)                //串口1中斷服務程序

{

u8 Res;

    #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.

OSIntEnter();

[

1

] [

2

]

關鍵字:STM32F103  串口通信 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/ic464309.html

相關焦點

  • STM32F103C8T6驅動ov2640拍照串口傳輸到上位機
    驅動ov2640  串口傳輸  上位機 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/2019/ic-news031843561.html 推薦閱讀 STM32f103C8T6
  • stm32f103zet6與stm32f103rct6的區別
    打開APP stm32f103zet6與stm32f103rct6的區別 發表於 2017-11-10 14:32:43
  • STM32F103和STM32F107差別淺談
    每組GPIO埠的寄存器包括:兩個32 發表於 2020-12-23 STM32f103 —— 內部flash讀寫 #ifndef _MCU_FLASH_H_#define _MCU_FLASH_H_ #include <
  • STM32F103C8T6引腳功能分布
    推薦閱讀 STM32f103C8T6 bootloader設計 使用的是STM32f103C8T6:64Kflash,在應用程式中通過CAN把接受到的bin寫到外置 flash的指定地址處。
  • stm32f103 timer1產生400HzPWM
    關鍵字:stm32f103  timer1  400Hz  PWM 編輯:什麼魚 引用地址:http://news.eeworld.com.cn
  • 如何配置STM32F103的重映射USART
    /mcu/ic478321.html 推薦閱讀 I.MX6Q(TQIMX6Q/TQE9)學習筆記——LTIB安裝配置 /Projects/L3.0.35_4.1.0安裝需要幾分鐘時間,請耐心等待。。。
  • STM32F103編程學習——串口篇
    題記之前學習了如何操作STM32的GPIO口,實現對GPIO口的輸出和輸入操作,實現通過按鍵點亮LED燈,本次來學習最常用的外設串口STM32的串口支持同步或異步通信,也支持全雙工、半雙工或單工通信。由於ST提供了CUBE MX圖形界面配置軟體,讓開發者不用太深入了解各寄存器就可以輕鬆編程,這點還是很方便的,若是要深入了解各外設的具體工作過程,還是需要閱讀廠家提供的寄存器參考手冊以及M3內核編程說明文檔。
  • STM32F103編程學習——USB虛擬串口篇
    題記:之前學習了STM32F103的許多基本外設操作,今天來學習USB通信的基本操作,並記錄下學習的過程。虛擬出來的串口設備字節整數倍的問題結果虛擬串口監控的數據從結果中可以看出串口可以實現數據的收發。
  • STM32F103單片機RTC結合time.h使用
    在使用stm32f103系列單片機的時候總是會碰到RTC計時的問題,103系列單片機的RTC使用的是秒計時在經過一段時間的研究,終於發現了一種比較簡單而且易於理解的使用方法,就是結合系統文件time.h的使用 首先要添加頭文件 #include  RTC的初始化和普通方式無區別u8 RTC_Init
  • 徹底解決stm32F042串口下載配置flymcu
    本文的初衷是解決一個問題,描述如下:1.實驗晶片:stm32f042f4p62.封裝:TSSOP203. 關鍵字:stm32F042  串口下載  配置 編輯:什麼魚
  • stm32f103c8t6封裝及最小系統原理圖
    打開APP stm32f103c8t6封裝及最小系統原理圖 發表於 2017-11-23 15:50:30   STM32F103C8T6
  • STM32 嵌入式學習入門(3)——STM32F103 按鍵輸入控制LED燈
    方案:STM32 + LIN + 串口(使用NXP的串口屏,TJA系列的LIN晶片)STM32的LIN接口作為主節點,馬達作為從節點。STM32硬體接口:按鍵盒8路輸入,網口與工控機軟體通信,CAN1直接控制ACR,CAN2給PUMA信號控制ACR,串口與上位機軟體通信(控制方向盤震動)。 主要有兩塊功能:靜態模式和遊戲模式。
  • STM32的串口(UART)及串口通信原理
    數據從A到B只能通過1根線,數據就像是羊肉塊一樣被串在線上        UART:通用異步收發器        USART:通用同步異步收發器--三、串口電平標準及引腳連接方法:STM32硬體接口:按鍵盒8路輸入,網口與工控機軟體通信,CAN1直接控制ACR,CAN2給PUMA信號控制ACR,串口與上位機軟體通信(控制方向盤震動)。 主要有兩塊功能:靜態模式和遊戲模式。
  • STM32開發筆記1: STM32F407時鐘配置
    方案:STM32 + LIN + 串口(使用NXP的串口屏,TJA系列的LIN晶片)STM32的LIN接口作為主節點,馬達作為從節點。STM32硬體接口:按鍵盒8路輸入,網口與工控機軟體通信,CAN1直接控制ACR,CAN2給PUMA信號控制ACR,串口與上位機軟體通信(控制方向盤震動)。 主要有兩塊功能:靜態模式和遊戲模式。
  • STM32F103編程學習——串口接收不定長數據
    串口通信在實際應用場合中大多數採用中斷收發或DMA收發數據,提高MCU的處理效率。而實際應用的通信幀數據大多數都是不定長的,即每一幀數據的長度不定,若是採用接收中斷的方式來處理數據,若數據幀較長的話,需要多次進入接收中斷,會降低MCU的處理效率;若採用DMA的方式來接收數據,其每次都需要接收完DMA設置的接收長度數據才會觸發中斷,這樣的話短幀數據一幀以接收完但不會觸發中斷,需要在應用程式中提取數據,處理起來稍微麻煩。
  • STM32開發筆記4: STM32F407 UART的使用方法
    方案:STM32 + LIN + 串口(使用NXP的串口屏,TJA系列的LIN晶片)STM32的LIN接口作為主節點,馬達作為從節點。STM32硬體接口:按鍵盒8路輸入,網口與工控機軟體通信,CAN1直接控制ACR,CAN2給PUMA信號控制ACR,串口與上位機軟體通信(控制方向盤震動)。 主要有兩塊功能:靜態模式和遊戲模式。
  • STM32F429-DISCO上手,stm32cubeMX與IAR學習,中斷及Printf
    stm32f429及stm32f439已經帶有LTDC控制器,意味著可以輸出RGB888及RGB565的圖像信號,這與以往的單片機CPU8080接口LCD有很大不同,也是入手STM32F429-DISCO的原因,價格不貴,mouser上不含稅150,淘寶180,非常適合學習。
  • STM32的三種串口通信協議介紹
    三個完全獨立的中斷,TX發送完成、TX發送數據寄存器空、RX接收完成;   10.支持多機通信模式;   11.支持倍速異步通信模式。   2、SPI   串口外圍設備接口SPI是一種低成本,易使用的接口,主要用於微控制器與外圍設備晶片之間的連接。
  • STM32F1與STM32F0在GPIO_TypeDef 寄存器方面的不同
    配置串口包括三部分內容:1.I/O口配置:TXD配置為復用推輓輸出(GPIO_Mode_AF_PP),RXD配置為浮空輸入(GPIO_Mode_IN_FLOATING);2.串口配置:波特率等;3.中斷向量配置:一般用中斷方式接收數據。
  • stm32 F407串口通信出現亂碼
    方案:STM32 + LIN + 串口(使用NXP的串口屏,TJA系列的LIN晶片)STM32的LIN接口作為主節點,馬達作為從節點。STM32硬體接口:按鍵盒8路輸入,網口與工控機軟體通信,CAN1直接控制ACR,CAN2給PUMA信號控制ACR,串口與上位機軟體通信(控制方向盤震動)。 主要有兩塊功能:靜態模式和遊戲模式。