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