天天看點

單片機stm32你了解多少

stm32作為現在嵌入式物聯網單片機行業中經常要用多的技術,相信大家都有所接觸,今天這篇就給大家詳細的分析下有關于stm32的出口,還不是很清楚的朋友要注意看看了哦,在最後還會為大家分享有些關于stm32的視訊資料便于學習參考。

什麼是序列槽

UART : Universal Asynchronous Receiver/Transmitter 通用異步收發器

USART : Universal Synchronous Asynchronous Receiver/Transmitter

通用同步/異步收發器

一種是常用也是最簡單的串行資料傳輸協定。資料線隻需要兩根就可以實作全雙工。

Tx: 發送資料線

Rx: 接收資料線

A B

TX -----------> Rx

Rx <------------Tx

全雙工: 兩個裝置可以同時發送和接收

串行資料: 發送隻一根線,一次隻能發送一bit. 一bit接着一bit發送和接收。

子產品通信: 上位機 下位機

通信一般需要兩個裝置,我們把這兩個裝置,人為叫做上位機, 下位機。

上位機: 把處理性能強的機子,上位機。資料大部分處理都在上位機完成。

下位機: 把資料采集的終端,處理性能單一的機子,下位機。

序列槽隻有一根發送資料線,假如 A要發送一個字元資料  10101010 給B

A -------- ---------

-------- ------- …

高電平周期是多長?即使是不發送資料Tx線上也有一個電平狀态,接收方

它怎麼知道你是在發送呢?..

UART資料如何傳輸?

UART protocol 序列槽協定。

序列槽發送和接收資料是以幀為機關. Frame

1幀(Frame)= 1 start bit(起始位) + 5-9bits資料位 + 0/1bit 校驗位  + stop bits(0.5,

1,1,5,2)

起始位: 一個周期的低電平

資料位: 5-9bits資料位,具體是多少bits,需要雙方協商。并且傳送是先傳送LSB(最低位) … MSB

校驗位:

0 bit :沒有校驗位

1 bit :校驗位. “賴子” X

D0 D1 D2 … Dn X

奇校驗:要保證傳輸的1為奇數

D0 D1 D2 … Dn X 要保證這一串資料中1的個數為奇數

1 0 1 0 1 0 1 0 X(1)

1 0 1 0 1 0 1 1 X(0)

偶校驗:要儲存傳輸的1為偶數

停止位: 高電平

0.5 個停止位。 半個周期的高電平

1 個停止位

1.5 個停止位

2 個停止位

Baudrate(波特率): 傳輸速率。

決定 時間周期。

115200 bps: bits per second

實體層标準  the physical layer standards

TTL level UART : TTL電平序列槽

RS-232:

RS-422:

RS-485:

TTL level UART:

邏輯低電平(0) 0V

邏輯高電平(1) 5V/3.3V

RS-232: 适合較長距離傳輸

邏輯低電平(0) +3v~+15V

邏輯高電平(1) -3v~-15v

TTL UART RS-232 RS-422 RS-485

電平 1 3.3V/5V 1 -5V ~ -15V +/- 2v +/- 1.5v

0 0V 0 5V ~ +15V

信号 單端信号   單端信号  差分信号   差分信号

傳輸長度 < 2m <15m <1200m <1200m

不同标準的序列槽,引腳也不一樣。TX/Rx是一定存在的。

TTL

RX

TX

GND

VCC

STM32F4xx 序列槽控制器

TX

RX

硬體流控:

RTS: Request To Send 請求發送信号

終端告訴對方可以向我傳輸資料啦。

CTS: Clear To Send 清除發送信号

對方告知終端,我要向你發送資料啦

RTS -------> CTS(對方)

CTS <------- RTS(對方)

标志位:

TXE: Transmit data Register Empty

發送資料寄存器為空。

不代表上一次資料已經發送完成啦,因為資料有可能還在 shifter裡面

但是此時您可以向TDR寫資料啦。

TC : Transmit Complete

發送完成。

發送移位寄存器中的資料已經發送到Tx引腳上面去了。

RXNE: Read Data register Not Empty

接收資料寄存器不為空。意思是你可以讀資料啦。

STM32F4xx序列槽代碼流程

(1) GPIO口配置

序列槽的TX/RX 引腳是由GPIO口來複用的。

a. 使能GPIO分組的時鐘

RCC_AHB1PeriphClockCmd

b. 配置GPIO口的功能 GPIO_Init

c. 選擇具體的複用功能

GPIO_PinAFConfig

(2) usart配置

a. 使能usart時鐘

b. USART_Init

USART_Init(USART_TypeDef * USARTx, USART_InitTypeDef *

USART_InitStruct);

typedef struct

{

uint32_t USART_BaudRate; // 波特率

uint16_t USART_WordLength; //傳輸字長 ,如下兩個任選其一:

USART_WordLength_8b

USART_WordLength_9b

在STM32中:傳輸字長=資料位數+檢驗位數

uint16_t USART_StopBits; //停止位數,如下 :

USART_StopBits_1 1bit停止位

USART_StopBits_1_5 1.5bit停止位

USART_StopBits_2 2 bits停止位

USART_StopBits_0_5 0.5bit停止位

uint16_t USART_Parity; //校驗方式,如下:

USART_Parity_No 無校驗

USART_Parity_Odd 奇校驗

USART_Parity_Even 偶校驗

uint16_t USART_Mode; //序列槽模式, 如下:可以組合

USART_Mode_Tx 發送模式

USART_Mode_Rx 接收模式

USART_Mode_Tx | USART_Mode_Rx 發送和接收模式

uint16_t USART_HardwareFlowControl; //硬體流控

USART_HardwareFlowControl_None 無硬體流控

USART_HardwareFlowControl_RTS RTS 請求發送。你可以接收對方的資料。

USART_HardwareFlowControl_CTS CTS 清除發送,你可以發資料給對方。

USART_HardwareFlowControl_RTS_CTS RTS_CTS 發送和接收都用流控

} USART_InitTypeDef;

(3) 中斷的配置

USART_ITConfig <- 配置串品的中斷

在STM32中一個USART隻對應一個中斷通道,但是引起序列槽中斷的

事件有很多,比如:

TXE -> 發送寄存器為空,可以引起序列槽中斷

TC -> 發送完成,可以引起序列槽中斷

RXNE -> 接收寄存器不為空,可以引起序列槽中斷

……

隻不過,這些事件需要"中斷控制位使能"

USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);

USART_ITConfig就是用來把一個序列槽的XX事件,配置成是否引起序列槽中斷的

在序列槽中斷函數裡面,就需要判斷是哪個序列槽事件,引起了中斷!!!

NVIC_Init()

(4) 使能序列槽

USART_Cmd

接收(中斷函數)

USART1_IRQHanlder()

{

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

{

//有資料可讀啦

data = USART_ReceiveData(USART1); //讀取接收到的資料

}

//清除USART1的中斷标志

USART_GetITStatus

}

USART_GetITStatus用來擷取序列槽的xx事件标志位

發送資料

USART_SendData(USART1, 0x55);

while (USART_GetFlagStatus(USRAT1, USART_FLAG_TXE) == RESET); //等待發送結束