這次我們來介紹一下UART的基本時序,了解一下底層信號怎么傳送的。方便以后使用Verilog HDL實現收發邏輯。
9600bit/s 的意思是每秒發送9600bit,因此可以理解為將1s分解為9600等分,對於發送端來說,每bit電平的維持時間是1/9600s,對於接收端來說,在1/9600s內要完成數據的采樣。因此對於不同時間源的設備,如何實現這個發送“節拍”以及設置接收采樣頻率非常重要,即主從設備對各自主時鍾(SCLK)的分頻非常重要。

UART的基本時序:
發送端

接收端

UART的每一幀數據一般有10位分別為初始位,8位數據和結束位。對於發送端,將待發送的數據存入發送寄存器,產生起始位即將電平拉低,隨后每1/9600s將寄存器中的數據一位一位的發送出去。當數據發送完畢后,將電平拉高等待下一次的發送。對於接收端來說首先要檢測是否有數據來,采用下降沿檢測的方式來檢測起始位。對於數據位的采樣,選取數據位的中點位置的電平作為采樣數據,中點位置的電平較為穩定。設采樣間隔為N,當采樣8N后,就可以停止采樣了。
采樣時鍾的如何獲取,其實是通過設備的主時鍾分頻得到的。取16x或者64x倍的波特率時鍾作為采用時鍾是實踐總結出來的,主要是為了無失真的獲取數據,同時也為了方便編程。下面舉個例子:
主時鍾為SCLK = 40Mhz,波特率為9600,則采用頻率fs = 16*9600 = 153600。Tsclk = 25ns,Ts = 1/fs = 6510.4167ns,N = Ts / Tsclk = 260.4167。也就是說在每個Ts下有260個Tsclk,以上升沿作為計數標准的話,數130下就為一個Ts,即每數130個Ts的上升沿,采樣時鍾的電平就翻轉一次。采用這種方式就可以得到采樣時鍾了。對於采樣間隔N的計算,每個bit電平的維持時間是Tbit = 16 * Ts = 104166.667ns = 16Ts。bit0采樣的是下降沿檢測,等待16Ts后,進入bit1的電平時間,在中點采樣。因此第一個采樣點的時間是(16+8)Ts = 24Ts,以此類推后面的采樣點分別為:40,56,72,88,104,120,136,152。
對於發送端,只需要根據波特率對SCLK進行不同的分頻就好了。現總結分頻如下:
| 波特率 | T | 計數上限 | FPGA50Mhz頻率下的計數值;Tsclk =1 / 50Mhz = 20ns |
| 9600 | 104166.667 | T/Tsclk | 5208-1 |
| 19200 | 52083.333 | T/Tsclk | 2604-1 |
| 38400 | 26041.667 | T/Tsclk | 1302-1 |
| 57600 |
17361.111 | T/Tsclk | 868-1 |
| 115200 |
8680.556 | T/Tsclk | 434-1 |
綜上所述,對於整個串口而言比較重要的的部分是:波特率發生器、采樣時鍾發生器、發送模塊、接收模塊、標志寄存器和中斷模塊。
對於STM32中的USART,組成部分如下圖所示:

