1、串口通信簡(jiǎn)介
通信接口的兩種方式:
并行通信
-傳輸原理:數(shù)據(jù)各個(gè)位同時(shí)傳輸棒动。
-優(yōu)點(diǎn):速度快
-缺點(diǎn):占用引腳資源多
串行通信
-傳輸原理:數(shù)據(jù)按位順序傳輸宾添。
-優(yōu)點(diǎn):占用引腳資源少
-缺點(diǎn):速度相對(duì)較慢
目前使用最多的還是串行通信柜裸,即便速度相對(duì)較慢粱锐,所以下面都是講解串行通信。
①串口通信分類:
串口通信按照數(shù)據(jù)傳送方向铐然,分為:
(1)單工:數(shù)據(jù)傳輸只支持?jǐn)?shù)據(jù)在一個(gè)方向上傳輸
(2)半雙工:允許數(shù)據(jù)在兩個(gè)方向上傳輸搀暑,但是跨琳,在某一時(shí)刻,只允許數(shù)據(jù)在一個(gè)方向上傳輸脉让,它實(shí)際上是一種切換方向的單工通信
(3)全雙工:允許數(shù)據(jù)同時(shí)在兩個(gè)方向上傳輸溅潜,因此,全雙工通信是兩個(gè)單工通信方式的結(jié)合滚澜,它要求發(fā)送設(shè)備和接收設(shè)備都有獨(dú)立的接收和發(fā)送能力
②STM32的串行通信的方式
同步通信:帶時(shí)鐘同步信號(hào)傳輸博秫。
異步通信:不帶時(shí)鐘同步信號(hào)眶掌。
注意:一般所說的串口是USART(通用同步異步收發(fā)器),同步異步都支持的即寒。STM32F10x系列芯片召噩,包含3個(gè)USART和2個(gè)UART
2、STM32的串口通信原理
串口通信是單片機(jī)最基本的功能凹嘲,很多傳感器模塊與單片機(jī)的連接都會(huì)用到串口功能构韵。串口通信趋艘,顧名思義就是將一整條的內(nèi)容凶朗,切成一“串”個(gè)體來發(fā)送或接收。發(fā)送的核心思想是:將字符串中的一個(gè)字符寫到一個(gè)寄存器中(此寄存器只能存一個(gè)字符),寫入后會(huì)自動(dòng)通過串口發(fā)送搓萧,發(fā)送結(jié)束再寫入下一個(gè)字符宛畦。接收時(shí)會(huì)直接裝入單片機(jī)緩沖區(qū)的一個(gè)字符型數(shù)組中,由程序依次讀這個(gè)數(shù)組货矮。
上圖是串口數(shù)據(jù)發(fā)送接收的過程做一個(gè)簡(jiǎn)單的圖示斯够。收發(fā)控制器根據(jù)寄存器配置,對(duì)數(shù)據(jù)存儲(chǔ)轉(zhuǎn)移部分的移位寄存器進(jìn)行控制抓督。當(dāng)需要發(fā)送數(shù)據(jù)時(shí)束亏,內(nèi)核或DMA外設(shè)把數(shù)據(jù)從內(nèi)存(變量)寫入到發(fā)送數(shù)據(jù)寄存器TDR后,發(fā)送控制器將自動(dòng)把數(shù)據(jù)從TDR加載到發(fā)送移位寄存器定铜,然后通過串口線TX,把數(shù)據(jù)一位一位地發(fā)送出去怕敬,在數(shù)據(jù)從TDR轉(zhuǎn)移到移位寄存器時(shí),會(huì)產(chǎn)生發(fā)送寄存器TDR已空事件TXE,當(dāng)數(shù)據(jù)從移位寄存器全部發(fā)送出去時(shí)畸陡,會(huì)產(chǎn)生數(shù)據(jù)發(fā)送完成事件TC,這些事件可以在狀態(tài)寄存器中查詢到虽填。而接收數(shù)據(jù)則是一個(gè)逆過程,數(shù)據(jù)從串口線RX一位一位地輸入到接收移位寄存器牲览,然后自動(dòng)地轉(zhuǎn)移到接收數(shù)據(jù)寄存器RDR,最后用內(nèi)核指令或DMA讀取到內(nèi)存(變量)中恶守。發(fā)送完畢或者接收完畢都會(huì)有相應(yīng)的狀態(tài)或者事件跛蛋,我們寫代碼時(shí)就可以通過這些事件來判斷是否接收或者發(fā)送完畢痊硕,然后做出下一步岔绸。
3、常用的串口相關(guān)寄存器
①USART_SR狀態(tài)寄存器
這個(gè)寄存器用到了10個(gè)位盒揉,也就代表有10中狀態(tài)標(biāo)志,每個(gè)標(biāo)志都可以作為中斷的標(biāo)志位羡洛,庫函數(shù)的定義如下:
#define USART_IT_PE ((uint16_t)0x0028)
#define USART_IT_TXE ((uint16_t)0x0727)
#define USART_IT_TC ((uint16_t)0x0626)
#define USART_IT_RXNE ((uint16_t)0x0525)
#define USART_IT_IDLE ((uint16_t)0x0424)
#define USART_IT_LBD ((uint16_t)0x0846)
#define USART_IT_CTS ((uint16_t)0x096A)
#define USART_IT_ORE ((uint16_t)0x0360)
#define USART_IT_NE ((uint16_t)0x0260)
#define USART_IT_FE ((uint16_t)0x0160)
②USART_DR數(shù)據(jù)寄存器
發(fā)送數(shù)據(jù)寄存器是TDR欲侮,接收數(shù)據(jù)寄存器是RDR肋联,都只用了前8位橄仍,發(fā)送和接收用到以下兩個(gè)函數(shù):
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
4、串口配置的一般步驟
串口時(shí)鐘使能虑粥,GPIO時(shí)鐘使能:RCC_APB2PeriphClockCmd();
GPIO端口模式設(shè)置:GPIO_Init(); 模式設(shè)置為GPIO_Mode_AF_PP
串口參數(shù)初始化:USART_Init();
開啟中斷并且初始化NVIC(如果需要開啟中斷才需要這個(gè)步驟)
NVIC_Init();
USART_ITConfig();使能串口:USART_Cmd();
編寫中斷處理函數(shù):USARTx_IRQHandler();
串口數(shù)據(jù)收發(fā):
void USART_SendData();//發(fā)送數(shù)據(jù)到串口宪哩,DR
uint16_t USART_ReceiveData();//接受數(shù)據(jù),從DR讀取接受到的數(shù)據(jù)串口傳輸狀態(tài)獲扔住:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
歡迎關(guān)注我的公眾號(hào):物聯(lián)網(wǎng)技術(shù)猿
我可以幫你免費(fèi)下載csdn積分資料B掎腹躁!