天天看點

STM32序列槽驅動

首先了解序列槽通信的一些基本原理:

⚫ 序列槽通信: 序列槽通信是指資料通過一條資料線(或者兩條差分線)一位接着一位的傳輸出去。序列槽通信的優點是占用硬體資源少,且傳輸距離較遠,缺點是傳輸速度慢(這些優缺點都是相對于并口通信而言,其實在平時應用中序列槽的通信速度完全能夠滿足絕大部分通信場景的要求)。

⚫ 并口通信 :并口通信是說通過多條資料線一次性的将資料傳輸出去,類似于多車道,其優點當然就是傳輸速度快,但是缺點也很明顯,第一它占用更多的硬體資源,第二是它的傳輸距離短,對 PCB 布線有更高的要求,因為每條資料線如果不等長會導緻寄生電容也不同,最終會在資料線之間産生傳輸延時,導緻資料傳輸失敗。并口一般應用在 LCD 顯示和快速儲存設備上面。 

⚫ 單工通信 :單工通信是指無論在何時資料的流向是單向的,接收端隻負責接收不具備發送功能,發 送端隻負責發送,不具備接收功能。

⚫ 半雙工通信 :半雙工通信是指資料傳輸方向是雙向的,但是在同一時刻隻允許資料單向傳輸,比如 UART 和 IIC

⚫ 全雙工通信 :全雙工通信則支援在同一時刻資料可以雙向傳輸,比如 SPI

⚫ 同步通信方式: 同步通信方式是指收發雙方之間通過一條時鐘信号線來同步資料的傳輸,在發生傳輸時 必須在時鐘線的同步下将資料一位一位的傳輸出去,這種方式傳輸速度較快,但是因為時鐘和資料線是單獨分開的,是以它的傳輸距離較近,典型的應用就是 IIC 和 SPI,他們都有一 條時鐘線來同步資料線上的位傳輸。

⚫ 異步通信方式: 異步通信方式是指,收發雙方沒有資料線同步,要通過特定的起始以及停止标志位來判 斷此時資料是否開始傳輸以及是否傳輸完成。另外異步通信的收發雙發要保證通信速度的統 一,典型的就是 UART,RS485 等。 

UART(Universal Asynchronous Receiver/Transmitter,通用異步收發傳 輸器)屬于異步串行通信,UART 是平時使用最多的一個串行通信方式,主要應用場景如 下:

1. 用于列印程式調試資訊 (需要重定向)

2. 和上位機配套軟體通信,使得我們可以通過上位機來檢視或者設定下位機 (人機互動)

3. 用于 ISP 或者 IAP 程式下載下傳(序列槽收發資料)

STM32F103RCT6 系統控制器有三個 USART 和兩個 UART,其中 USART1 和時鐘來源于 APB2 總線時鐘,其最大頻率為 72MHz,其他四個的時鐘來源于 APB1 總線時鐘,其最大頻率為 36MHz。UART 隻是異步傳輸功能,是以沒有 SCLK、nCTS 和 nRTS 功能引腳。

STM32F103C8T6 單片機有三個 USART,USART 和 UART 的差別在于 USART 支援同步模式,在同步模式下有一個時鐘信号線用于同步資料,但是我們平時使用的都是 UART 的異步通信,可以說 UART 是 USART 的一個子集,除此之外 STM32 的 USART 還支援 LIN(局部互連網),智能卡協定和 IrDA SIR ENDEC 規範,但是平時用的最多就是 UART,

那麼要想使用 UART,就必須確定收發雙方的通信約定要一緻,這些約定包括:波特率(通信速度),資料位(8 位或 9 位),停止位個數(1 位,1.5 位,2 位),校驗方式(奇校驗, 偶校驗,無校驗)。波特率就是要制定雙方通信的速度,我們經常使用的波特率有(1200,2400,4800,9600,115200),波特率越大,傳輸速度就越快。資料位就是我們想要傳輸的有效資料的部分,因為一 個位元組是 8 位,是以經常使用的也是 8 位資料位,一般 9 位資料位的應用場合有以下幾種:

1. 8 位資料的擴充(8 位可以表示 256 種可能,9 位可以表示 512 種可能)

2. 使用第 9 位來表示此時資料傳輸的模式,第九位為 1 代表此時是讀模式,為 0 表示是寫模式。

3. 使用第 9 位作為負數,例如第 9 位為 1 表示-,第 9 位為 0 表示+

另外停止位,停止位是雙發通信的結束标志,常用的是1位停止位,最後是校驗方式,校驗可以保證資料傳輸的正确性、完整性,但是會增加資料幀的長度,通常我們使用無奇偶校驗。(隻能夠知道錯誤,不能修改錯誤) 

來源STM32F10XXX參考手冊:

STM32序列槽驅動

        序列槽規定每次隻發送一個位元組,因為我們知道序列槽是通過bps時間差進而得到的高低電平(0,1)的切換的,每次發送一個位元組就可以避免形如11111111情況下的累計誤差的出現。并且在空閑的時候都是高電平1的,發送資料的時候都是先發低位,再發高位。

下面看一下 STM32中USART 的結構框圖:

STM32序列槽驅動

        UART 由三大部分組成:第一部分就是用于設定和标記傳輸模式的控制寄存器和标志寄存器部分(黃色高亮區域),第二部分是引腳通信(綠色高亮),該部分和發送/接收移位 寄存器進行連接配接,第三部分是資料轉換部分(藍色高亮),該部分将發送資料寄存器内的資料通過移位寄存器傳輸到 TXD 引腳,接收同理。

要想使用 UART,需要先進行配置:

1. 配置 GPIO,TXD 引腳要設定為複用推挽輸出,RXD 要設定為浮空輸入

2. 配置 UART,包括波特率、資料位、停止位、奇偶校驗位以及是否使用硬體流控,硬 件流控通過 RTS 和 CTS 作為流控引腳,我們一般應用是不需要的。

3. 如果想實作序列槽的發送或接受中斷,那麼還要設定 NVIC。

序列槽驅動程式:

STM32序列槽驅動

         在初始化函數中,依次初始化了用于通信的 TXD 和 RXD 引腳,然後設定了序列槽的波特率 為 9600,8 位資料位,1 位停止位,無奇偶校驗位,無硬體流控,USART_Init()函數用于将 各個設定寫到對應寄存器當中,生效設定, USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)函數用于開啟 USART 中的某個中斷,USART 的中斷非常多,有發送資料寄存器空中斷,發送完成中斷,接收寄存器非空中斷等等,這裡選擇接收寄存器非空中斷,它的意思是說當接收資料寄存器中接收到資料後它會産生中斷,跳轉到對應序列槽的中斷服務函數中,添加這條語句是為下一個序列槽實驗準備的。

STM32序列槽驅動
STM32序列槽驅動

 編寫中斷服務函數發送接收資料:

發送函數:

STM32序列槽驅動

接收函數:

STM32序列槽驅動

         USART_SendData()函數用于将參數 byte 填入到發送資料寄存器當中,byte 是 16 位的 原因是 byte 要支援 9 位資料位的情況。 while 循環用于等待這一位元組發送完成才結束該函數。USART_FLAG_TC 就是發送完成的标志,如果把該條語句注釋掉,就會導緻發送不出資料,因為在本次資料還沒發送完成時第二次發送任務就又來了(假設是連續發送的場 合),導緻資料不停的被重新整理。 

序列槽接發中斷服務程式:

STM32序列槽驅動

注意:正如前面所講,可以利用序列槽列印調試的資訊,但是前提要對列印函數重定向,有關printf函數的重定向可以看我另一篇文章。 

更多優質文章部落格:STM32之序列槽相關配置_Swiler的部落格-CSDN部落格_stm32序列槽配置