初學stm32,初次接觸USART串口通信。
對USART通信硬件原理的個人總結(jié)。從MCU(Micro Controller Unit,也就是ST芯片)出來的TTL電平經(jīng)過電平轉(zhuǎn)換芯片轉(zhuǎn)化為USB電平,從而實現(xiàn)與PC的通信。
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/異步串行接收/發(fā)送器。
這邊只作異步通信說,異步通信與同步通信的主要區(qū)別區(qū)別是時鐘,所以這邊的SLCK是關閉的。USART總共有TX、RX、nRTS、nCTS、SCLK這5個外接引腳(框圖中的SW_RX在內(nèi)部,n表示低電平有效)。在學習與PC上位機通信時,是關閉硬件流控制模式的,所以異步通信只涉及到TX(Transmit)和RX(Receive)這兩個引腳。
大致思路:數(shù)據(jù)由軟件傳給發(fā)送數(shù)據(jù)寄存器USART_DR(TRD),判斷TC(Transmit complete,發(fā)送完成)是否置1。若置1,表示發(fā)送移位寄存器發(fā)送完成,發(fā)送數(shù)據(jù)寄存器中的數(shù)據(jù)發(fā)送到發(fā)送移位寄存器開始發(fā)送,判斷TXE(Transmit data register empty,發(fā)送數(shù)據(jù)寄存器為空),讀取下一個數(shù)據(jù)到TDR;若TC為0,則等待。TC置0由軟件序列(讀取USART_SR寄存器,然后寫入USART_DR寄存器),也可以向該位寫“”0“”實現(xiàn)。硬件復位時,TC由硬件置1。
接收數(shù)據(jù)時,數(shù)據(jù)傳入接收移位寄存器,再傳入讀取數(shù)據(jù)寄存器,這時RXNE(Read data register not empty,讀取數(shù)據(jù)寄存器不為空)置1,可產(chǎn)生中斷標志RXNEIE。
數(shù)據(jù)格式:1位起始位,8位數(shù)據(jù)位(USART_CR1,控制寄存器1中的位12-M置0),無校驗位(USART_SR,狀態(tài)寄存器中位1-PE置0——無奇偶校驗錯誤),1位停止位(USART_CR2,控制寄存器2中位13:12-STOP賦值00)。因為是開發(fā)板與PC機之間的通信,距離短,通信環(huán)境好,所以不設置奇偶校驗。
使用的是USART1,TX選擇的是PA9,RX選擇的是PA10。
代碼流程:1、初始化 a、打開外設時鐘(如果想使用任何外設,都要先使能時鐘),打開掛載到AHB1上的GPIOA和掛載到APB2上的USART1的時鐘,調(diào)用固件庫函數(shù)RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE)和RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE)
b、初始化串口相關的GPIO口,對GPIO_InitTypeDef GPIO_InitStruct結(jié)構(gòu)體進行賦值,再通過GPIO_Init(GPIOA,&GPIO_InitStruct)映射給寄存器
c、配置選擇復用功能,調(diào)用固件庫函數(shù)GPIO_PinAFConfig(形參,形參,形參)確定引腳的復用功能
d、初始化串口,USART初始化結(jié)構(gòu)體,設置波特率、數(shù)據(jù)位長度、停止位、校驗位選擇、硬件流控制模式選擇、USART模式控制(使能接收/發(fā)送),最后通過USART_Init(...)完成配置
e、如果需要中斷執(zhí)行服務,則初始化NVIC(嵌套向量中斷控制器),若不需要,則跳過
f、使能串口,調(diào)用USART_Cmd(.....)使能USART1
2、編寫數(shù)據(jù)發(fā)送函數(shù),由于USART_DR只有8位有效,所以這里分為字節(jié)發(fā)送、雙字節(jié)發(fā)送、字符串發(fā)送、數(shù)組發(fā)送,這四種發(fā)送均基于固件庫函數(shù)USART_SendData(...),在發(fā)一個字節(jié)時,判斷TXE是否為1,若為1,則準備發(fā)送下一個數(shù)據(jù)至發(fā)送數(shù)據(jù)寄存器;若為0,則等待。獲取中斷狀態(tài)位的固件庫函數(shù)為ITStatus USART_GetITStatus(...),最后可以加以判斷TC是否為1,即判斷發(fā)送是否完成。
3、編寫數(shù)據(jù)接收函數(shù),調(diào)用固件庫函數(shù)USART_ReceiveData(...)獲取最新的USARTx的數(shù)據(jù)。判斷RXNE,為1表示接收完成,為0表示未接收數(shù)據(jù),所以數(shù)據(jù)接收函數(shù)的內(nèi)容應該在判斷RXNE為1的條件下編寫。
4、main()函數(shù)調(diào)用即可。
根據(jù)野火教程,參考手冊,新手理解,純粹為個人重新回憶一遍。若有不對,還請指出,若寫的不好,好多見諒。
作為新手,還有諸多問題不懂,1、如果設置奇偶校驗,那接收方是不是應該要處理?如何處理?如果說單片機與PC通信是這樣,那單片機與單片機呢?
2、發(fā)送8位的數(shù)據(jù)要寫一個函數(shù),發(fā)送16位的又要寫一個函數(shù),發(fā)送數(shù)組只能發(fā)送8字節(jié)類型的數(shù)組,可能是我認識還不夠,對我來說是不明白。